В процессе сопровождения высоконагруженных систем на платформе 1С 7.7 часто возникает необходимость оперативно исправить или обновить алгоритм в глобальном модуле, не прерывая работу пользователей. В конфигурациях с большим числом активных сеансов монопольный запуск системы для сохранения изменений в файле 1Cv7.MD становится серьезной проблемой.
Рассмотрим несколько проверенных способов решения этой задачи с использованием внешней компоненты 1С++, средств TurboMD и архитектурных приемов выноса логики.
Прежде чем выбирать подход, проанализируем важные особенности работы платформы 1С 7.7 при динамической загрузке кода:
1Cv7.MD), динамически подключенный дополнительный модуль не перекроет ее автоматически. Платформа приоритетно вызывает метод из основного контекста.1Cv7.exe и требуют строгого соответствия версий платформы и ВК (например, 1С++ и FormEx).Внешняя компонента 1С++ предоставляет специальный объект Сервис, позволяющий компилировать и подключать дополнительные глобальные модули прямо в процессе работы программы.
Разберем по шагам, как настроить такую схему:
ГлобМодуль1.txt).
Сервис = СоздатьОбъект("Сервис");
глДопМодуль = Сервис.ДобавитьГлобальныйМодуль("#ЗагрузитьИзФайла ГлобМодуль1.txt");
Чтобы основная процедура вызывала обновленный код из загруженного модуля, в глобальном модуле заранее создается точка вызова (заглушка) с проверкой флага или вызовом функции перенаправления:
Процедура глМояПроцедура(Параметр1, Параметр2) Экспорт
Если ЕстьТурбо = 1 Тогда
// Вызов процедуры из динамически подключенного модуля
глПроцИзТурбо(Параметр1, Параметр2);
Иначе
// Штатный алгоритм
// ...
КонецЕсли;
КонецПроцедуры
Для обхода синтаксического контроля платформы при вызове динамических функций можно использовать косвенный вызов через Шаблон() или Выполнить():
Шаблон("[глПроцИзТурбо(Контекст)]");
Если требуется постоянно модифицировать отдельный блок кода без перезапуска пользователей, логику можно вынести за пределы файла 1Cv7.MD:
ОткрытьФормуОбработки(), передавая туда необходимые параметры. Файл .ert не блокируется платформой на запись во время работы сеансов, его можно обновлять на диске в любой момент.Наиболее технологичным решением при использовании библиотеки 1С++ является перенос изменяемого функционала в методы внешних классов.
В глобальном модуле оставляем только создание объекта и обращение к его методу:
Процедура глОбработатьДанные() Экспорт
ОбъектЛогики = СоздатьОбъект("МойКлассЛогики");
ОбъектЛогики.ВыполнитьДействие();
КонецПроцедуры
Файлы описания классов 1С++ поддерживают динамическое перечитывание с диска при вызове специальной команды или при создании объекта, что позволяет изменять исходный код класса на сервере без выгона пользователей и без перезагрузки всей базы.
В случаях, когда конфигурация работает на базе MS SQL Server, опытные администраторы применяют метод безопасной подмены файла 1Cv7.MD непосредственно на файловом сервере.
Разберем порядок действий при использовании этого метода:
1Cv7.MD с помощью утилиты GComp, чтобы исключить внутренние мусорные структуры.1Cv7.MD (например, средствами утилит работы с файловыми дескрипторами или специальными скриптами) и замещаем его новым файлом.