В типовых конфигурациях 1С реализован удобный механизм: если программист применяет изменения без завершения сеансов пользователей (динамически), работающие клиенты получают оповещение с предложением перезапустить программу. Рассмотрим, как реализовать аналогичное поведение в нетиповой или самописной конфигурации, разберем программный код и проанализируем, почему к динамическому обновлению следует относиться с особой осторожностью.
Для определения факта применения изменений «на лету» в платформе 1С:Предприятие предусмотрена специальная клиентская функция КонфигурацияБазыДанныхИзмененаДинамически(). Она возвращает значение Истина, если конфигурация базы данных была обновлена динамически с момента запуска текущего сеанса.
Разберем по шагам, как настроить периодическую проверку и информирование пользователя:
КонфигурацияБазыДанныхИзмененаДинамически().Посмотрим на пример реализации в модуле управляемого приложения:
// В модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
// Подключаем периодическую проверку каждые 120 секунд (2 минуты)
ПодключитьОбработчикОжидания("ПроверитьДинамическоеОбновление", 120);
КонецПроцедуры
Процедура ПроверитьДинамическоеОбновление() Экспорт
Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда
// Отключаем повторные срабатывания обработчика
ОтключитьОбработчикОжидания("ПроверитьДинамическоеОбновление");
ТекстСообщения = "Конфигурация базы данных была обновлена. "
+ "Для корректной работы рекомендуется перезапустить программу.";
ПоказатьОповещениеПользователя(
"Внимание! Обновление конфигурации",
,
ТекстСообщения,
БиблиотекаКартинок.Предупреждение
);
КонецЕсли;
КонецПроцедуры
Если требуется предоставить пользователю возможность перезагрузить программу в один клик, можно вызвать стандартный метод завершения работы с флагом перезапуска:
// Второй параметр "Истина" указывает платформе на необходимость перезапуска сеанса
ЗавершитьРаботуСистемы(Ложь, Истина);
Важно понимать границы применимости динамического обновления. Платформа 1С позволяет применять изменения без монопольного доступа только в тех случаях, когда не затрагивается структура базы данных.
Что можно обновлять динамически:
Что категорически нельзя обновить динамически:
При любых изменениях структуры данных платформа потребует отключения всех активных пользователей для реструктуризации таблиц СУБД.
Кроме того, фоновые и регламентные задания, а также пулы соединений веб-сервисов могут продолжать выполнять старую версию программного кода вплоть до перезапуска соответствующего рабочего процесса rphost.
В сообществе разработчиков 1С динамическое обновление нередко называют «демоническим» из-за риска повреждения кэша метаданных. При частом использовании этого механизма в таблицах CONFIG и CONFIGSAVE, а также в локальном кэше серверов и клиентов могут возникать рассинхронизации.
Симптомы сбоя кэша метаданных:
Если после динамического обновления возникли подобные ошибки, выполним следующие шаги для восстановления стабильности:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.ragent для полной очистки серверного кэша.Чтобы избежать рисков повреждения метаданных и при этом минимизировать простои пользователей, применяют следующие подходы: