Модульная разработка

«1С:Исполнитель» поддерживает разбиение кода на отдельные модули, каждый из которых может выполнять определенную функцию.

Модульный подход к разработке позволяет:
  • разделить сложные скрипты на более простые;
  • повторно использовать код в других скриптах;
  • обеспечить изоляцию кода;
  • упростить отладку и тестирование скриптов;
  • повысить скорость разработки за счет параллельной работы над отдельными скриптами.

Создание скрипта

Скрипт — это файл, написанный на языке «1С:Исполнителя» и имеющий расширение .sbsl. Он может как использоваться в других скриптах, так и запускаться автономно. Имя скрипта должно соответствовать следующим требованиям:

  • может содержать только буквы (латиницы или кириллицы), цифры и символ подчеркивания;
  • не может начинаться с цифры;
  • чувствительно к регистру, однако запрещается одновременное использование скриптов, имена которых отличаются только регистром (мойСкрипт и МойСкрипт, например).

В скриптах поддерживаются две области видимости: @Локально и @Глобально. Они позволяют разграничить, что будет доступно только локально, а что вне скрипта:

  • @Глобально — метод или пользовательский тип доступен в других скриптах.
  • @Локально — метод или пользовательский тип доступен только внутри скрипта.

При создании скриптов также следует учитывать следующее ограничение: циклические зависимости между скриптами запрещены. Другими словами, вы не можете создать скрипт А, который требует подключения скрипта B, в свою очередь зависящего от скрипта A.

В качестве примера создадим скрипт с именем Фибоначчи.sbsl, содержащий метод для расчета последовательности чисел Фибоначчи:
@Глобально
метод ВернутьЧислаФибоначчи(КоличествоЧисел: Число): ЧитаемыйМассив<Число>
    если КоличествоЧисел < 2
        выбросить новый ИсключениеНедопустимыйАргумент(
            "Количество чисел должно быть больше двух!")
    ;
    пер Числа: Массив<Число> = []
    Числа.Добавить(0)
    Числа.Добавить(1)
  
    для Номер = 2 по КоличествоЧисел
        Числа.Добавить(Числа.Получить(Номер - 1) + Числа.Получить(Номер - 2))
    ;
  
    возврат новый ЧитаемыйМассив<Число>(Числа)
;

Подключение скрипта

Для подключения скрипта используйте директиву препроцессора #требуется:
#требуется <путь_к_скрипту>
// или
#требуется "<путь_к_скрипту>"
Параметр <путь_к_скрипту> задает относительный (относительно каталога с текущим скриптом) или абсолютный путь к подключаемому скрипту.
Вы также можете указать путь к файлу скрипта следующим образом:
  • создать переменную окружения EXECUTOR_MODULES_PATH, в которой указать каталог, содержащий подключаемые скрипты;
    Совет: Если во время разработки вам необходимо переопределить каталог, указанный в переменной окружения EXECUTOR_MODULES_PATH, используйте следующую настройку расширения для Visual Studio Code: 1c.executor.modules.path.
  • использовать параметр командной строки --modules-path для указания пути к каталогу, в котором будет выполняться поиск подключаемых скриптов, например:
    executor --modules-path C:/executor-modules
    Имеет приоритет над переменной среды EXECUTOR_MODULES_PATH.
Если не указан абсолютный путь к файлу скрипта, «1С:Исполнитель» выполняет его поиск в следующем порядке:
  • в каталоге с текущим скриптом;
  • в каталоге переменной среды EXECUTOR_MODULES_PATH.

После подключения скрипта для него будет создан тип-одиночка с таким же именем. Данный тип позволяет получить доступ к содержимому скрипта — его глобальным методам и пользовательским типам.

Пример ниже показывает, как вызвать метод ВернутьЧислаФибоначчи, определенный в скрипте Фибоначчи.sbsl:
// Импорт скрипта "Фибоначчи.sbsl".
// Скрипт находится в том же каталоге, что и текущий скрипт.
#требуется Фибоначчи.sbsl
 
метод Скрипт(КоличествоЧисел: Число)
    пер ЧислаФибоначчи: ЧитаемыйМассив<Число>?
    попытка
        ЧислаФибоначчи = Фибоначчи.ВернутьЧислаФибоначчи(КоличествоЧисел)
    поймать Исключение: ИсключениеНедопустимыйАргумент
        выбросить Исключение
    ;
    Консоль.Записать(ЧислаФибоначчи)
;

Использование индексного скрипта

Если ваш код требует подключения большого количества скриптов и вы не хотите подключать каждый скрипт отдельно, вы можете указать каталог, содержащий нужные скрипты. Для этого создайте в каталоге файл с именем #Индекс.sbsl (или #Index.sbsl) и перечислите в нем все требующие подключения скрипты, например:
// Импорт скриптов из каталога "КаталогСкриптов"
#требуется СкриптИзКаталога1.sbsl
#требуется СкриптИзКаталога2.sbsl
// ...
// Импорт скриптов из подкаталога "subfolder" основного каталога
#требуется subfolder/СкриптИзПодкаталога1.sbsl
#требуется subfolder/СкриптИзПодкаталога2.sbsl
// ...
Для индексных скриптов предусмотрены следующие ограничения:
  • Каталог может содержать только один индексный файл.
  • Имя файла чувствительно к регистру.
  • В индексном скрипте поддерживается только подключение других скриптов. Объявление пользовательских типов и методов запрещено.
Чтобы использовать скрипты из каталога в другом скрипте, подключите к нему данный каталог с помощью директивы препроцессора #требуется. После указания каталога в нем будет выполнен поиск индексного файла со списком доступных скриптов.
#требуется КаталогСкриптов
 
метод Скрипт()
    СкриптИзКаталога1.ПубличныйМетод()
;