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

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

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

Рассмотрим несколько проверенных способов решения этой задачи с использованием внешней компоненты 1С++, средств TurboMD и архитектурных приемов выноса логики.

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

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

  1. Отсутствие прямого перекрытия: Если процедура или функция уже скомпилирована в основном глобальном модуле (внутри 1Cv7.MD), динамически подключенный дополнительный модуль не перекроет ее автоматически. Платформа приоритетно вызывает метод из основного контекста.
  2. Проверка синтаксиса: При сохранении объектов в Конфигураторе синтаксический контроль не видит процедуры, объявленные исключительно во внешних загружаемых модулях, и выдает ошибку «Процедура не обнаружена».
  3. Изоляция контекста: Код из внешнего или дополнительно загруженного модуля не имеет доступа к неэкспортным процедурам и локальным переменным основного глобального модуля.
  4. Требования к релизу: Инструменты динамической отладки и подмены кода (такие как TurboMD) работают путем взаимодействия с оперативной памятью процесса 1Cv7.exe и требуют строгого соответствия версий платформы и ВК (например, 1С++ и FormEx).

Способ 1. Использование метода ДобавитьГлобальныйМодуль библиотеки 1С++

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

Разберем по шагам, как настроить такую схему:

  1. Выносим изменяемую логику в отдельный текстовый файл на сервере (например, ГлобМодуль1.txt).
  2. В основном глобальном модуле при начале работы системы регистрируем дополнительный модуль:

Сервис = СоздатьОбъект("Сервис");
глДопМодуль = Сервис.ДобавитьГлобальныйМодуль("#ЗагрузитьИзФайла ГлобМодуль1.txt");

Чтобы основная процедура вызывала обновленный код из загруженного модуля, в глобальном модуле заранее создается точка вызова (заглушка) с проверкой флага или вызовом функции перенаправления:


Процедура глМояПроцедура(Параметр1, Параметр2) Экспорт
    Если ЕстьТурбо = 1 Тогда
        // Вызов процедуры из динамически подключенного модуля
        глПроцИзТурбо(Параметр1, Параметр2);
    Иначе
        // Штатный алгоритм
        // ...
    КонецЕсли;
КонецПроцедуры

Для обхода синтаксического контроля платформы при вызове динамических функций можно использовать косвенный вызов через Шаблон() или Выполнить():

Шаблон("[глПроцИзТурбо(Контекст)]");

Способ 2. Вынос логики во внешнюю обработку (.ert) или директиву #ЗагрузитьИзФайла

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

  1. Использование внешней обработки: В глобальном модуле создается процедура-делегат, которая вызывает внешнюю форму с помощью метода ОткрытьФормуОбработки(), передавая туда необходимые параметры. Файл .ert не блокируется платформой на запись во время работы сеансов, его можно обновлять на диске в любой момент.
  2. Директива `#ЗагрузитьИзФайла`: В текст глобального модуля вставляется указание на внешне хранимый текстовый файл. При таком подходе внесение изменений в файл кода не требует редактирования структуры конфигурации в Конфигураторе, однако обновленный алгоритм подтягивается для каждого пользователя в момент запуска его сеанса.

Способ 3. Вынос логики в классы 1С++

Наиболее технологичным решением при использовании библиотеки 1С++ является перенос изменяемого функционала в методы внешних классов.

В глобальном модуле оставляем только создание объекта и обращение к его методу:


Процедура глОбработатьДанные() Экспорт
    ОбъектЛогики = СоздатьОбъект("МойКлассЛогики");
    ОбъектЛогики.ВыполнитьДействие();
КонецПроцедуры

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

Способ 4. Горячая подмена MD-файла на MS SQL Server

В случаях, когда конфигурация работает на базе MS SQL Server, опытные администраторы применяют метод безопасной подмены файла 1Cv7.MD непосредственно на файловом сервере.

Разберем порядок действий при использовании этого метода:

  1. Делаем копию рабочей конфигурации и вносим необходимые изменения в глобальный модуль на тестовой базе.
  2. Сохраняем конфигурацию. Для минимизации рисков рекомендуем разобрать и пересобрать файл 1Cv7.MD с помощью утилиты GComp, чтобы исключить внутренние мусорные структуры.
  3. На файловом сервере разблокируем заблокированный сеансами файл 1Cv7.MD (например, средствами утилит работы с файловыми дескрипторами или специальными скриптами) и замещаем его новым файлом.
  4. Пользователи, уже находящиеся в системе, продолжат работать в текущих сеансах. Для применения изменений им достаточно последовательно перезапустить клиентские приложения без остановки работы всей базы данных.
← На главную