Как отключить сообщение «Конфигурация базы данных была изменена динамически» в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При активной разработке и поддержке высоконагруженных информационных баз 1С программисты нередко прибегают к динамическому обновлению конфигурации без отключения пользователей. Однако сразу после такого обновления у работающих пользователей начинает появляться модальное диалоговое окно с предупреждением: «В конфигурацию информационной базы внесены изменения. Для дальнейшей работы рекомендуется перезапустить программу. Перезапустить?». Такое поведение отвлекает пользователей от потоковой работы, перехватывает фокус ввода и порождает шквал вопросов в службу технической поддержки. Разберем механизм появления этого окна, выясним, где оно формируется, и рассмотрим способы его корректного отключения или изменения.

Выясним причину: платформа или конфигурация?

Распространенное заблуждение среди разработчиков заключается в том, что окно перезапуска генерируется непосредственно ядром платформы и встроенными средствами его скрыть невозможно. Попробуем проанализировать этот момент подробнее. Параметр запуска клиента /DisableStartupMessages здесь не помогает, поскольку он подавляет исключительно стартовые служебные сообщения при инициализации сеанса.

На самом деле интерактивный диалог с предложением перезапуска инициируется программным кодом прикладного решения — в подавляющем большинстве случаев механизмами Библиотеки стандартных подсистем (БСП). Для отслеживания изменений в платформе 1С предусмотрена специальная функция глобального контекста:

КонфигурацияБазыДанныхИзмененаДинамически()

Она возвращает значение Истина, если с момента старта текущего пользовательского сеанса конфигурация базы данных была обновлена без монопольного захвата и реструктуризации. В конфигурации запускается циклический клиентский обработчик ожидания, который периодически запрашивает статус конфигурации у сервера. При получении положительного ответа на экран выводится диалоговое окно вопроса.

Посмотрим на пример типовой реализации такой проверки в коде общего модуля:


Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда
    
    ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
    
    ТекстСообщения = НСтр("ru = 'В конфигурацию информационной базы внесены изменения.
                                |Для дальнейшей работы рекомендуется перезапустить программу.
                                |Перезапустить?'");
    Ответ = Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет);
    Если Ответ = КодВозвратаДиалога.Да Тогда
        СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
        ЗавершитьРаботуСистемы(Истина, Истина);
    КонецЕсли;
    
    ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); // раз в 20 минут
    
КонецЕсли;

Как мы видим, логика полностью доступна для модификации разработчиком. Рассмотрим способы адаптации этого механизма.

Способ 1. Отключение или переопределение через расширение конфигурации

Чтобы не снимать типовую конфигурацию с поддержки и не модифицировать модули БСП напрямую, используем механизм расширений. Это позволяет аккуратно заглушить или изменить логику обработчика.

  1. Создадим новое расширение или откроем существующее.
  2. Найдем общий клиентский модуль, отвечающий за контроль обновления (в зависимости от версии БСП это может быть КонтрольДинамическогоОбновленияКонфигурацииКлиент).
  3. Добавим модуль в расширение и переопределим процедуру обработчика ожидания аннотацией &Вместо.

Разберем пример кода в расширении, который полностью предотвращает вывод диалога:


&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
    // Полностью глушим стандартное оповещение и не вызываем Вопрос()
    // Обработчик ожидания продолжает вызываться или отключается вовсе
КонецПроцедуры

Способ 2. Замена модального окна на фоновое оповещение

Полное игнорирование обновления может быть неудобным, если части пользователей все же необходимо знать о релизе. Модальный диалог плох тем, что он прерывает работу (например, блокирует окно подбора товаров или сканирование штрихкодов на складе). Заменим навязчивое окно вопросительного диалога на всплывающее системное оповещение или вывод информации в заголовок программы:


&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
    
    Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда
        // Отключаем обработчик, чтобы не спамить пользователю каждые 20 минут
        ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
        
        // Выводим немодальное всплывающее уведомление
        ПоказатьОповещениеПользователя(
            НСтр("ru = 'Обновление программы'"),
            ,
            НСтр("ru = 'Доступна новая версия. Пожалуйста, перезапустите программу при завершении текущих операций.'"),
            БиблиотекаКартинок.Информация
        );
        
        // Дополнительно можно изменить заголовок главного окна
        УстановитьЗаголовокСистемы(Строка(ПолучитьЗаголовокСистемы()) + " [Требуется перезапуск]");
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Выборочное оповещение по ролям пользователей

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


&Вместо("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ")
Процедура Расш1_ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ()
    
    // Проверяем, входит ли пользователь в группу тех, кому критично обновление
    Если РольДоступна("АдминистраторСистемы") Или РольДоступна("ПолныеПрава") Тогда
        ПродолжитьВызов();
    Иначе
        // Для обычных пользователей отключаем дальнейшую проверку
        ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ");
    КонецЕсли;
    
КонецПроцедуры

Технические риски сокрытия оповещения

Отключая предупреждение о динамическом обновлении, разработчик должен четко осознавать технические последствия для стабильности кластера 1С:

  1. Рассинхронизация контекстов метаданных. Если пользователь долго не перезапускает сеанс, его обращения к серверу могут попадать на рабочий процесс, уже содержащий обновленные метаданные. Это часто приводит к фатальной системной ошибке: «Попытка подключения к контексту сервера с неподходящей версией метаданных».
  2. Разрастание таблиц версий. Пока хотя бы один пользователь работает со старой версией конфигурации, сервер СУБД вынужден хранить снапшоты в таблицах Config и ConfigCAS. Накопление дельт при многократных динамических обновлениях в течение дня многократно повышает риск повреждения внутренней структуры конфигурации.
  3. Логическая несогласованность проведения. Пользователи в неперезапущенных сеансах продолжают проводить документы по старым правилам, тогда как перезапустившиеся клиенты используют новый алгоритм, что может нарушить целостность учета.

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

← На главную