Как вынести функции в дополнительный глобальный модуль или внешний класс в 1С 7.7 и вызывать их?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 7.7 стандартный глобальный модуль со временем сильно разрастается. Это затрудняет чтение кода, усложняет поддержку и делает неудобной совместную разработку. Разберем основные способы разделения логики на отдельные подключаемые модули и внешние файлы, а также выясним, как правильно вызывать функции из таких модулей в основном коде конфигурации.

Ограничения платформы 1С 7.7

В платформе 7.7 штатно отсутствует механизм независимых общих модулей, как в более поздних версиях 1С. Глобальный модуль компилируется целиком один раз при старте сеанса работы пользователя. Любой код, подключаемый динамически позже, не виден на этапе компиляции основного глобального модуля, поэтому прямой вызов новой функции по имени приведет к синтаксической ошибке. Для решения этой задачи применяются внешние компоненты (в частности, 1С++), системные вызовы или специальные утилиты.

Способ 1. Использование ООП и классов внешней компоненты 1С++ (Рекомендуемый)

Наиболее удобным, расширяемым и поддерживаемым способом является создание классов с помощью внешней компоненты 1С++. Это позволяет сохранить автодополнение кода при использовании соответствующих плагинов и вызывать методы через стандартный точечный синтаксис.

Рассмотрим по шагам, как вынести процедуры и функции в отдельный класс:

  1. Создаем описание класса в файле описания классов или в специальном модуле конфигуратора (вкладка 1С++):
    
    класс Общие.ГлобальныйМодуль1 = класс_ГлобальныйМодуль1@MD
    {
    };
    
  2. В модуле внешней обработки (.ert) или во внутреннем объекте конфигурации с именем класс_ГлобальныйМодуль1 реализуем необходимые процедуры и функции.
  3. Для удобного доступа ко всем методам объявляем в глобальном модуле глобальную экспортную переменную (применяем паттерн Синглтон): Перем глСервис Экспорт;
  4. В предопределенной процедуре ПриНачалеРаботыСистемы() инициализируем объект класса один раз: глСервис = СоздатьОбъект("Общие.ГлобальныйМодуль1");
  5. Вызываем нужные методы из любого места конфигурации через точку: глСервис.ИмяЭкспортнойФункции(Параметр1, Параметр2);

Способ 2. Динамическое добавление глобального модуля через 1С++ и вызов через «Шаблон()»

Если необходимо внедрить функционал динамически прямо из текста без предварительного объявления классов в метаданных, можно использовать объект Сервис и динамическую компиляцию кода.

Проанализируем пример кода с динамическим внедрением и передачей контекста:


ТекстГМ = "
|Перем КонтекстФормыОбработки Экспорт;
|Функция ПоказатьДокумент(Конт) Экспорт
|    Если ТипЗначения(КонтекстФормыОбработки) = 100 Тогда
|        Попытка
|            КонтекстФормыОбработки.ПрисвоитьКонтекстФормы(Конт);
|        Исключение
|            КонтекстФормыОбработки.Форма.Закрыть(0);
|        КонецПопытки;
|    КонецЕсли;
|КонецФункции
|
|Функция глПрисвоить(Кому, Что) Экспорт
|    Кому = Что;
|КонецФункции
|";

Модуль = СоздатьОбъект("ВыполняемыйМодуль");
Модуль.УстановитьМодуль("т = КонтекстФормыОбработки");
Попытка
    Модуль.КомпилироватьМодуль();
Исключение
    Серв = СоздатьОбъект("Сервис");
    Серв.ДобавитьГлобальныйМодуль(ТекстГМ);
КонецПопытки;

// Вызов динамически зарегистрированной глобальной функции:
Шаблон("[глПрисвоить(КонтекстФормыОбработки, глВзятьКонтекст(Контекст))]");

Функция Шаблон() позволяет выполнить глобальную функцию, которая не была известна парсеру на этапе старта сеанса. Однако такой подход требует осторожности, так как синтаксические ошибки внутри строки шаблона сложнее отлаживать, а передача сложных структур может быть ограничена.

Способ 3. Вынос исходного кода в отдельные файлы с помощью директивы «#ЗагрузитьИзФайла»

Для разделения монолитного кода глобального модуля без использования сторонних библиотек платформа 1С 7.7 предоставляет штатную директиву препроцессора #ЗагрузитьИзФайла.

Рассмотрим структуру организации кода:

  1. Создаем на диске в каталоге базы данных папку для модулей, например, Src\Modules\.
  2. Выносим логику в отдельные текстовые файлы: ОбщиеФункции.txt, РаботаСДокументами.txt.
  3. В основном глобальном модуле конфигурации подключаем файлы директивами:
    
    #ЗагрузитьИзФайла "Src\Modules\ОбщиеФункции.txt"
    #ЗагрузитьИзФайла "Src\Modules\РаботаСДокументами.txt"
    

Важный момент: данный механизм объединяет код файлов во время компиляции при старте базы. Внести изменения «на лету» без перезапуска программы не получится, но файлы можно удобно редактировать во внешних редакторах и хранить в системах контроля версий.

Способ 4. Подмена модулей и форм «на лету» с помощью TurboMD

Если цель выноса кода — отладка и изменение функционала без монопольного сохранения файла конфигурации 1Cv7.MD, применяется связка внешней компоненты TurboMD и скрипта для OpenConf.

Разберем порядок подключения и работы с TurboMD:

  1. Файл turbomd.dll помещается в каталог программы (папка BIN) или в каталог базы данных.
  2. В глобальном модуле в процедуре ПриНачалеРаботыСистемы() выполняется загрузка компоненты (обязательно после загрузки 1cpp.dll, если она используется): ЗагрузитьВнешнююКомпоненту("turbomd.dll");
  3. Для интеграции с конфигуратором подключается скрипт TurboMD.vbs (в каталог BIN\Config\Scripts).
  4. По нажатию горячих клавиш (обычно Ctrl+M) форма или модуль объекта выгружаются во внешние файлы (каталог unpack), где их можно править на лету. Изменения сразу применяются в режиме «1С:Предприятие» без повторного сохранения MD-файла.

Обратите внимание: утилита TurboMD позволяет подменять модули документов, справочников, отчетов и обработок, но не предназначена для динамической горячей подмены самого глобального модуля.

← На главную