Как в 1С 7.7 настроить окно с вопросом Да/Нет при закрытии программы?

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

Нередко пользователи случайно нажимают системную кнопку закрытия программы или сочетание клавиш Alt+F4, что приводит к нежелательному прерыванию рабочего процесса. Чтобы предотвратить случайный выход, в платформе 1С:Предприятие 7.7 можно включить диалоговое окно с подтверждением «Вы уверены, что хотите завершить работу?» с возможностью выбора «Да» или «Нет».

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

Способ 1. Включение подтверждения через настройки пользователя

В большинстве типовых решений на платформе 1С 7.7 («Бухгалтерский учет», «Торговля и Склад», «Зарплата и Кадры») данный функционал уже заложен разработчиками конфигурации. Прежде чем вносить изменения в программный код, проверим пользовательские параметры в режиме предприятия:

  1. Откроем режим «1С:Предприятие».
  2. Перейдем в главное меню: пункт Сервис → Настройки пользователя (либо Параметры пользователя).
  3. На закладке Общие (или во вкладке настроек конкретного пользователя) найдем флаг «Запрашивать подтверждение при выходе из программы».
  4. Установим данный флаг и сохраним настройки.

Если конфигурация является нетиповой или в ней отсутствует подобная опция, реализуем этот механизм программно в конфигураторе.

Способ 2. Программная реализация в глобальном модуле

Для перехвата момента закрытия системы в платформе 1С 7.7 предусмотрена предопределенная процедура ПриЗавершенииРаботыСистемы(), которая располагается в Глобальном модуле.

Проанализируем типичную ошибку начинающих разработчиков: вызов метода Предупреждение() или вызов функции Вопрос() без указания режима кнопок. В таком случае на экране отображается окно только с одной кнопкой «ОК». Кроме того, синтаксис 1С 7.7 существенно отличается от 1С 8.х: здесь отсутствуют конструкции вида РежимДиалогаВопрос, КодВозвратаДиалога, Отказ = Истина и логические константы Истина / Ложь.

Синтаксис функции Вопрос() в 1С 7.7 выглядит следующим образом:

Вопрос(<Текст_вопроса>, <Режим>, <Таймаут>)

Параметр <Режим> определяет состав кнопок. Задать его можно строкой или числом:

  1. "Да+Нет" (или число 4) — кнопки «Да» и «Нет».
  2. "Да+Нет+Отмена" (или число 3) — кнопки «Да», «Нет», «Отмена».
  3. "ОК+Отмена" (или число 1) — кнопки «ОК» и «Отмена».

Важное правило согласованности типов: если режим передан строкой ("Да+Нет"), то и результат функция возвращает строкой ("Да", "Нет"). Если режим задан числом (4), то результат возвращается в виде числа (6 для кнопки «Да», 7 для кнопки «Нет»).

Для отмены закрытия программы в 1С 7.7 используется процедура СтатусВозврата(0) с последующим оператором Возврат.

Посмотрим на пример кода с правильной обработкой отмены:


Процедура ПриЗавершенииРаботыСистемы()
    
    // Задаем вопрос пользователю. Таймаут 60 секунд предотвращает вечное зависание окна.
    Если Вопрос("Завершить работу с программой?", "Да+Нет", 60) <> "Да" Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;

КонецПроцедуры

Особенности проверки ответа: почему нельзя проверять только «Нет»

Разберем распространенную логическую ошибку, когда условие пишут в виде Если Вопрос(...) = "Нет" Тогда. В этом случае возникает серьезная уязвимость:

  1. Если пользователь закроет окно вопроса кликом по системному крестику в углу окна, функция вернет признак отмены, а не слово «Нет».
  2. Если пользователь нажмет клавишу Esc, функция также вернет отмену.
  3. Если истечет время таймаута, функция вернет значение таймаута.

При условии = "Нет" все перечисленные выше сценарии приведут к тому, что условие не сработает, и программа закроется, хотя согласия на выход пользователь не давал. Именно поэтому необходимо проверять отрицание явного согласия: <> "Да".

Важные нюансы при работе с терминальными серверами и автообменами

При внедрении модального диалога выхода необходимо учитывать поведение регламентных задач и операционной системы:

  1. Зависание скриптов и пакетных режимов. Если база запускается автоматически по расписанию для ночной выгрузки или резервного копирования командной строкой с параметром пакетного режима, модальный диалог заблокирует закрытие сеанса. Программа будет бесконечно ожидать нажатия кнопки человеком. Чтобы этого избежать, перед выводом вопроса проверяют признак пакетного запуска или имя системного пользователя.
  2. Завершение сеанса Windows (Logoff). При перезагрузке сервера или закрытии терминальной сессии операционная система посылает процессу 1cv7.exe сигнал на выгрузку. Появление модального окна блокирует штатный выход. Спустя отведенное время Windows завершает процесс принудительно (снимает задачу), что в файловых базах формата DBF способно привести к повреждению файлов индексов (.cdx) или зависанию блокировок в каталоге базы. Указание таймаута (например, 30–60 секунд) в функции Вопрос() снижает этот риск.

Пример реализации с защитой фоновых сеансов и указанием таймаута:


Процедура ПриЗавершенииРаботыСистемы()
    
    // Проверяем, не является ли запуск служебным
    Если ИмяПользователя() = "Робот" Тогда
        Возврат;
    КонецЕсли;
    
    // Запрашиваем подтверждение с ограничением времени ожидания в 30 секунд
    Если Вопрос("Вы уверены, что хотите завершить работу?", "Да+Нет", 30) <> "Да" Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;

КонецПроцедуры

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

← На главную