Как запретить закрытие 1С на «крестик» и настроить выход только по кнопке «Завершить сеанс»?

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

При организации рабочих мест кассиров (РМК) или операторов на складе часто возникает задача жестко ограничить действия пользователя в интерфейсе программы. Одна из типичных проблем — случайное или намеренное закрытие программы кассиром с помощью стандартного системного «крестика» в правом верхнем углу окна (или сочетанием клавиш Alt + F4). Это может приводить к незавершенным кассовым сменам, зависшим чекам ККМ и прочим сбоям в учете.

В этой статье мы подробно разберем, как сделать так, чтобы выйти из программы можно было исключительно по нажатию на специально выделенную кнопку «Завершить сеанс», а любые попытки закрыть программу стандартными средствами Windows блокировались системой.

Решение 1: Алгоритм с использованием программного «флага» (универсальный способ)

Самый надежный и гибкий способ разграничить закрытие программы через системный «крестик» и закрытие по кнопке «Завершить сеанс» — использовать специальную переменную-флаг, которая будет выступать в качестве программного разрешения на выход.

Суть метода заключается в следующем: по умолчанию выход из системы запрещен. И только когда кассир нажимает на кнопку «Завершить сеанс», мы программно меняем значение переменной-флага на «Истина» и инициализируем закрытие. В обработчике закрытия формы или системы мы проверяем этот флаг. Если он равен «Ложь» — отменяем закрытие.

Рассмотрим по шагам реализацию данного алгоритма:

  1. Объявление переменной-флага. В модуле управляемого приложения (или в модуле обычной формы РМК) объявим глобальную переменную, которая будет хранить состояние доступности выхода. Перем РазрешитьЗакрытие Экспорт;
  2. Инициализация при запуске. В событии начала работы системы задаем начальное значение переменной.
    
    Процедура ПриНачалеРаботыСистемы()
        РазрешитьЗакрытие = Ложь;
    КонецПроцедуры
    
  3. Обработка нажатия кнопки «Завершить сеанс». На форму РМК добавляем кнопку «Завершить сеанс». В обработчике ее нажатия мы меняем значение флага и вызываем штатный метод завершения работы.
    
    &НаКлиенте
    Процедура КомандаЗавершитьСеансВыполнить()
        РазрешитьЗакрытие = Истина;
        ЗавершитьРаботуСистемы(Ложь); // Параметр "Ложь" означает завершение без перезапуска
    КонецПроцедуры
    
  4. Блокировка несанкционированного закрытия. Теперь необходимо перехватить попытку закрытия через «крестик». Для этого используем обработчик ПередЗавершениемРаботыСистемы в модуле управляемого приложения (или ПередЗакрытием в модуле формы).
    
    Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
        Если Не РазрешитьЗакрытие Тогда
            Отказ = Истина;
            ТекстПредупреждения = "Внимание! Закрытие программы разрешено только через кнопку 'Завершить сеанс' в интерфейсе кассира.";
        КонецЕсли;
    КонецПроцедуры
    

При такой схеме, если кассир попытается нажать на «крестик», сработает обработчик ПередЗавершениемРаботыСистемы. Поскольку переменная РазрешитьЗакрытие осталась в значении Ложь, система заблокирует выход и выдаст предупреждение.

Решение 2: Отключение кнопки закрытия в свойствах формы (для обычного приложения)

Если ваше рабочее место кассира реализовано в толстом клиенте на обычных формах (например, в старых редакциях конфигураций «1С:Розница» или «1С:Управление торговлей»), решить задачу можно еще проще — путем изменения визуальных свойств самой формы.

Проанализируем, как убрать кнопку закрытия из заголовка окна формы конфигуратора:

  1. Откройте конфигуратор вашей базы данных и найдите форму РМК (интерфейс кассира).
  2. Дважды щелкните по заголовку формы или нажмите Alt + Enter, чтобы открыть палитру свойств формы.
  3. В списке свойств найдите категорию «Оформление» или воспользуйтесь поиском по свойствам.
  4. Найдите свойство «Кнопка закрытия» (в некоторых версиях оно может называться СпособЗакрытияФормы или управляться флагом ЗакрыватьПриНажатииEsc). Снимите галочку с этого свойства.
  5. Также рекомендуется снять флаг со свойства «Кнопки управления окном», если требуется убрать возможность сворачивать и разворачивать окно, оставив его строго фиксированным.

После сохранения изменений у формы физически пропадет «крестик» в правом верхнем углу, и кассир будет вынужден пользоваться исключительно интерфейсными кнопками, которые вы разместите на самой форме.

Решение 3: Полноэкранный режим работы (для управляемых форм)

В современных конфигурациях на управляемых формах стандартными свойствами формы полностью скрыть кнопку «Х» с главного окна приложения невозможно. Однако платформа «1С:Предприятие» предлагает специализированное решение для торговых точек — запуск системы в специальном режиме.

Выясним, как запустить рабочее место кассира в режиме ПолноэкранноеРабочееМесто:

Начиная с технологической платформы версии 8.3, разработчики добавили возможность открывать основное окно программы в режиме киоска. При этом у окна приложения полностью отсутствуют рамки операционной системы Windows, системное меню, панель задач и, соответственно, кнопка «крестик».

Для настройки такого режима работы выполните следующие действия:

  1. В коде запуска рабочего места (например, при начале работы системы для определенного профиля пользователя «Кассир») пропишите установку режима основного окна:
    
    &НаКлиенте
    Процедура ПриНачалеРаботыСистемы()
        // Проверяем роль текущего пользователя
        Если РольДоступна("РольКассира") Тогда
            УстановитьРежимОсновногоОкна(РежимОсновногоОкна.ПолноэкранноеРабочееМесто);
        КонецЕсли;
    КонецПроцедуры
    
  2. В данном режиме интерфейс программы разворачивается на весь экран поверх панели задач Windows. Кассир физически не видит элементов управления ОС и не может закрыть программу иначе, как нажав на вашу запрограммированную кнопку выхода.

Важная разница между методами завершения работы системы

При реализации кнопки программного закрытия разработчики часто путают два схожих метода платформы 1С. Разберем их принципиальное отличие:

Особенности платформы 8.3.8 и выше: обход блокировки пользователем

Проанализируем важный нюанс безопасности, появившийся в платформе «1С:Предприятие» в последних обновлениях. При написании блокировки в процедуре ПередЗавершениемРаботыСистемы недостаточно просто написать Отказ = Истина.

Если в системе открыты несохраненные окна или конфигурация работает в режиме стандартных настроек, при установке флага Отказ = Истина платформа может выдать стандартное диалоговое окно Windows: «Работа в данном окне не завершена. Все равно завершить работу?». Если кассир нажмет кнопку «Все равно завершить», программа проигнорирует ваш запрет и закроется.

Чтобы избежать этой лазейки, обязательно передавайте понятное и строгое описание в параметр ТекстПредупреждения:


Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
    Если Не РазрешитьЗакрытие Тогда
        Отказ = Истина;
        ТекстПредупреждения = "ВЫХОД ЗАБЛОКИРОВАН! Пожалуйста, используйте кнопку 'Завершить сеанс' в меню кассира.";
    КонецЕсли;
КонецПроцедуры

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

Ограничения Веб-клиента

Обратите внимание, что если ваше рабочее место кассира запущено через веб-браузер (веб-клиент «1С»), заблокировать закрытие вкладки браузера стандартными методами платформы невозможно. Браузеры обеспечивают изоляцию веб-страниц из соображений безопасности. В этом случае попытка закрыть вкладку вызовет лишь стандартное предупреждение браузера («Возможно, внесенные изменения не сохранятся»), текст которого разработчик 1С настроить не может.

Поэтому для надежной блокировки «крестика» на рабочих местах кассиров всегда рекомендуется использовать Тонкий клиент в режиме ПолноэкранноеРабочееМесто.

← На главную