При активной разработке и поддержке высоконагруженных информационных баз 1С программисты нередко прибегают к динамическому обновлению конфигурации без отключения пользователей. Однако сразу после такого обновления у работающих пользователей начинает появляться модальное диалоговое окно с предупреждением: «В конфигурацию информационной базы внесены изменения. Для дальнейшей работы рекомендуется перезапустить программу. Перезапустить?». Такое поведение отвлекает пользователей от потоковой работы, перехватывает фокус ввода и порождает шквал вопросов в службу технической поддержки. Разберем механизм появления этого окна, выясним, где оно формируется, и рассмотрим способы его корректного отключения или изменения.
Распространенное заблуждение среди разработчиков заключается в том, что окно перезапуска генерируется непосредственно ядром платформы и встроенными средствами его скрыть невозможно. Попробуем проанализировать этот момент подробнее. Параметр запуска клиента /DisableStartupMessages здесь не помогает, поскольку он подавляет исключительно стартовые служебные сообщения при инициализации сеанса.
На самом деле интерактивный диалог с предложением перезапуска инициируется программным кодом прикладного решения — в подавляющем большинстве случаев механизмами Библиотеки стандартных подсистем (БСП). Для отслеживания изменений в платформе 1С предусмотрена специальная функция глобального контекста:
КонфигурацияБазыДанныхИзмененаДинамически()
Она возвращает значение Истина, если с момента старта текущего пользовательского сеанса конфигурация базы данных была обновлена без монопольного захвата и реструктуризации. В конфигурации запускается циклический клиентский обработчик ожидания, который периодически запрашивает статус конфигурации у сервера. При получении положительного ответа на экран выводится диалоговое окно вопроса.
Посмотрим на пример типовой реализации такой проверки в коде общего модуля:
Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда
ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
ТекстСообщения = НСтр("ru = 'В конфигурацию информационной базы внесены изменения.
|Для дальнейшей работы рекомендуется перезапустить программу.
|Перезапустить?'");
Ответ = Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
ЗавершитьРаботуСистемы(Истина, Истина);
КонецЕсли;
ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); // раз в 20 минут
КонецЕсли;
Как мы видим, логика полностью доступна для модификации разработчиком. Рассмотрим способы адаптации этого механизма.
Чтобы не снимать типовую конфигурацию с поддержки и не модифицировать модули БСП напрямую, используем механизм расширений. Это позволяет аккуратно заглушить или изменить логику обработчика.
КонтрольДинамическогоОбновленияКонфигурацииКлиент).&Вместо.Разберем пример кода в расширении, который полностью предотвращает вывод диалога:
&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
// Полностью глушим стандартное оповещение и не вызываем Вопрос()
// Обработчик ожидания продолжает вызываться или отключается вовсе
КонецПроцедуры
Полное игнорирование обновления может быть неудобным, если части пользователей все же необходимо знать о релизе. Модальный диалог плох тем, что он прерывает работу (например, блокирует окно подбора товаров или сканирование штрихкодов на складе). Заменим навязчивое окно вопросительного диалога на всплывающее системное оповещение или вывод информации в заголовок программы:
&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда
// Отключаем обработчик, чтобы не спамить пользователю каждые 20 минут
ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
// Выводим немодальное всплывающее уведомление
ПоказатьОповещениеПользователя(
НСтр("ru = 'Обновление программы'"),
,
НСтр("ru = 'Доступна новая версия. Пожалуйста, перезапустите программу при завершении текущих операций.'"),
БиблиотекаКартинок.Информация
);
// Дополнительно можно изменить заголовок главного окна
УстановитьЗаголовокСистемы(Строка(ПолучитьЗаголовокСистемы()) + " [Требуется перезапуск]");
КонецЕсли;
КонецПроцедуры
Проанализируем практический кейс: срочный хотфикс вносится ради исправления ошибки в одном конкретном контуре (например, для одного бухгалтера или менеджера). В этом случае операторов склада или кассиров оповещать нет необходимости. В процедуре проверки можно добавить условие по правам или ролям:
&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
// Проверяем, входит ли пользователь в группу тех, кому критично обновление
Если РольДоступна("АдминистраторСистемы") Или РольДоступна("ПолныеПрава") Тогда
ПродолжитьВызов();
Иначе
// Для обычных пользователей отключаем дальнейшую проверку
ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
КонецЕсли;
КонецПроцедуры
Отключая предупреждение о динамическом обновлении, разработчик должен четко осознавать технические последствия для стабильности кластера 1С:
Config и ConfigCAS. Накопление дельт при многократных динамических обновлениях в течение дня многократно повышает риск повреждения внутренней структуры конфигурации.Для минимизации таких ситуаций рекомендуется применять более надежные альтернативы: оперативные хотфиксы переносить в подключаемые расширения конфигурации (.cfe), срочные печатные формы и алгоритмы заполнения оформлять через внешние отчеты и обработки, а динамическое обновление основной конфигурации сопровождать плановым сбросом неактивных сеансов через настройки кластера серверов.