Нередко пользователи случайно нажимают системную кнопку закрытия программы или сочетание клавиш Alt+F4, что приводит к нежелательному прерыванию рабочего процесса. Чтобы предотвратить случайный выход, в платформе 1С:Предприятие 7.7 можно включить диалоговое окно с подтверждением «Вы уверены, что хотите завершить работу?» с возможностью выбора «Да» или «Нет».
Разберем подробно, как включить эту возможность штатными средствами типовых конфигураций, а также как корректно запрограммировать её в глобальном модуле конфигуратора.
В большинстве типовых решений на платформе 1С 7.7 («Бухгалтерский учет», «Торговля и Склад», «Зарплата и Кадры») данный функционал уже заложен разработчиками конфигурации. Прежде чем вносить изменения в программный код, проверим пользовательские параметры в режиме предприятия:
Если конфигурация является нетиповой или в ней отсутствует подобная опция, реализуем этот механизм программно в конфигураторе.
Для перехвата момента закрытия системы в платформе 1С 7.7 предусмотрена предопределенная процедура ПриЗавершенииРаботыСистемы(), которая располагается в Глобальном модуле.
Проанализируем типичную ошибку начинающих разработчиков: вызов метода Предупреждение() или вызов функции Вопрос() без указания режима кнопок. В таком случае на экране отображается окно только с одной кнопкой «ОК». Кроме того, синтаксис 1С 7.7 существенно отличается от 1С 8.х: здесь отсутствуют конструкции вида РежимДиалогаВопрос, КодВозвратаДиалога, Отказ = Истина и логические константы Истина / Ложь.
Синтаксис функции Вопрос() в 1С 7.7 выглядит следующим образом:
Вопрос(<Текст_вопроса>, <Режим>, <Таймаут>)
Параметр <Режим> определяет состав кнопок. Задать его можно строкой или числом:
"Да+Нет" (или число 4) — кнопки «Да» и «Нет»."Да+Нет+Отмена" (или число 3) — кнопки «Да», «Нет», «Отмена»."ОК+Отмена" (или число 1) — кнопки «ОК» и «Отмена».Важное правило согласованности типов: если режим передан строкой ("Да+Нет"), то и результат функция возвращает строкой ("Да", "Нет"). Если режим задан числом (4), то результат возвращается в виде числа (6 для кнопки «Да», 7 для кнопки «Нет»).
Для отмены закрытия программы в 1С 7.7 используется процедура СтатусВозврата(0) с последующим оператором Возврат.
Посмотрим на пример кода с правильной обработкой отмены:
Процедура ПриЗавершенииРаботыСистемы()
// Задаем вопрос пользователю. Таймаут 60 секунд предотвращает вечное зависание окна.
Если Вопрос("Завершить работу с программой?", "Да+Нет", 60) <> "Да" Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Разберем распространенную логическую ошибку, когда условие пишут в виде Если Вопрос(...) = "Нет" Тогда. В этом случае возникает серьезная уязвимость:
При условии = "Нет" все перечисленные выше сценарии приведут к тому, что условие не сработает, и программа закроется, хотя согласия на выход пользователь не давал. Именно поэтому необходимо проверять отрицание явного согласия: <> "Да".
При внедрении модального диалога выхода необходимо учитывать поведение регламентных задач и операционной системы:
1cv7.exe сигнал на выгрузку. Появление модального окна блокирует штатный выход. Спустя отведенное время Windows завершает процесс принудительно (снимает задачу), что в файловых базах формата DBF способно привести к повреждению файлов индексов (.cdx) или зависанию блокировок в каталоге базы. Указание таймаута (например, 30–60 секунд) в функции Вопрос() снижает этот риск.Пример реализации с защитой фоновых сеансов и указанием таймаута:
Процедура ПриЗавершенииРаботыСистемы()
// Проверяем, не является ли запуск служебным
Если ИмяПользователя() = "Робот" Тогда
Возврат;
КонецЕсли;
// Запрашиваем подтверждение с ограничением времени ожидания в 30 секунд
Если Вопрос("Вы уверены, что хотите завершить работу?", "Да+Нет", 30) <> "Да" Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Использование такой конструкции обеспечивает стабильную работу как при интерактивных действиях рядовых пользователей, так и при автоматизированном администрировании информационной базы.