При разработке и сопровождении конфигураций на платформе 1С:Предприятие 7.7 стандартный глобальный модуль со временем сильно разрастается. Это затрудняет чтение кода, усложняет поддержку и делает неудобной совместную разработку. Разберем основные способы разделения логики на отдельные подключаемые модули и внешние файлы, а также выясним, как правильно вызывать функции из таких модулей в основном коде конфигурации.
В платформе 7.7 штатно отсутствует механизм независимых общих модулей, как в более поздних версиях 1С. Глобальный модуль компилируется целиком один раз при старте сеанса работы пользователя. Любой код, подключаемый динамически позже, не виден на этапе компиляции основного глобального модуля, поэтому прямой вызов новой функции по имени приведет к синтаксической ошибке. Для решения этой задачи применяются внешние компоненты (в частности, 1С++), системные вызовы или специальные утилиты.
Наиболее удобным, расширяемым и поддерживаемым способом является создание классов с помощью внешней компоненты 1С++. Это позволяет сохранить автодополнение кода при использовании соответствующих плагинов и вызывать методы через стандартный точечный синтаксис.
Рассмотрим по шагам, как вынести процедуры и функции в отдельный класс:
класс Общие.ГлобальныйМодуль1 = класс_ГлобальныйМодуль1@MD
{
};
.ert) или во внутреннем объекте конфигурации с именем класс_ГлобальныйМодуль1 реализуем необходимые процедуры и функции.
Перем глСервис Экспорт;
ПриНачалеРаботыСистемы() инициализируем объект класса один раз:
глСервис = СоздатьОбъект("Общие.ГлобальныйМодуль1");
глСервис.ИмяЭкспортнойФункции(Параметр1, Параметр2);
Если необходимо внедрить функционал динамически прямо из текста без предварительного объявления классов в метаданных, можно использовать объект Сервис и динамическую компиляцию кода.
Проанализируем пример кода с динамическим внедрением и передачей контекста:
ТекстГМ = "
|Перем КонтекстФормыОбработки Экспорт;
|Функция ПоказатьДокумент(Конт) Экспорт
| Если ТипЗначения(КонтекстФормыОбработки) = 100 Тогда
| Попытка
| КонтекстФормыОбработки.ПрисвоитьКонтекстФормы(Конт);
| Исключение
| КонтекстФормыОбработки.Форма.Закрыть(0);
| КонецПопытки;
| КонецЕсли;
|КонецФункции
|
|Функция глПрисвоить(Кому, Что) Экспорт
| Кому = Что;
|КонецФункции
|";
Модуль = СоздатьОбъект("ВыполняемыйМодуль");
Модуль.УстановитьМодуль("т = КонтекстФормыОбработки");
Попытка
Модуль.КомпилироватьМодуль();
Исключение
Серв = СоздатьОбъект("Сервис");
Серв.ДобавитьГлобальныйМодуль(ТекстГМ);
КонецПопытки;
// Вызов динамически зарегистрированной глобальной функции:
Шаблон("[глПрисвоить(КонтекстФормыОбработки, глВзятьКонтекст(Контекст))]");
Функция Шаблон() позволяет выполнить глобальную функцию, которая не была известна парсеру на этапе старта сеанса. Однако такой подход требует осторожности, так как синтаксические ошибки внутри строки шаблона сложнее отлаживать, а передача сложных структур может быть ограничена.
Для разделения монолитного кода глобального модуля без использования сторонних библиотек платформа 1С 7.7 предоставляет штатную директиву препроцессора #ЗагрузитьИзФайла.
Рассмотрим структуру организации кода:
Src\Modules\.ОбщиеФункции.txt, РаботаСДокументами.txt.
#ЗагрузитьИзФайла "Src\Modules\ОбщиеФункции.txt"
#ЗагрузитьИзФайла "Src\Modules\РаботаСДокументами.txt"
Важный момент: данный механизм объединяет код файлов во время компиляции при старте базы. Внести изменения «на лету» без перезапуска программы не получится, но файлы можно удобно редактировать во внешних редакторах и хранить в системах контроля версий.
Если цель выноса кода — отладка и изменение функционала без монопольного сохранения файла конфигурации 1Cv7.MD, применяется связка внешней компоненты TurboMD и скрипта для OpenConf.
Разберем порядок подключения и работы с TurboMD:
turbomd.dll помещается в каталог программы (папка BIN) или в каталог базы данных.ПриНачалеРаботыСистемы() выполняется загрузка компоненты (обязательно после загрузки 1cpp.dll, если она используется):
ЗагрузитьВнешнююКомпоненту("turbomd.dll");
TurboMD.vbs (в каталог BIN\Config\Scripts).Ctrl+M) форма или модуль объекта выгружаются во внешние файлы (каталог unpack), где их можно править на лету. Изменения сразу применяются в режиме «1С:Предприятие» без повторного сохранения MD-файла.Обратите внимание: утилита TurboMD позволяет подменять модули документов, справочников, отчетов и обработок, но не предназначена для динамической горячей подмены самого глобального модуля.