При организации рабочих мест кассиров (РМК) или операторов на складе часто возникает задача жестко ограничить действия пользователя в интерфейсе программы. Одна из типичных проблем — случайное или намеренное закрытие программы кассиром с помощью стандартного системного «крестика» в правом верхнем углу окна (или сочетанием клавиш Alt + F4). Это может приводить к незавершенным кассовым сменам, зависшим чекам ККМ и прочим сбоям в учете.
В этой статье мы подробно разберем, как сделать так, чтобы выйти из программы можно было исключительно по нажатию на специально выделенную кнопку «Завершить сеанс», а любые попытки закрыть программу стандартными средствами Windows блокировались системой.
Самый надежный и гибкий способ разграничить закрытие программы через системный «крестик» и закрытие по кнопке «Завершить сеанс» — использовать специальную переменную-флаг, которая будет выступать в качестве программного разрешения на выход.
Суть метода заключается в следующем: по умолчанию выход из системы запрещен. И только когда кассир нажимает на кнопку «Завершить сеанс», мы программно меняем значение переменной-флага на «Истина» и инициализируем закрытие. В обработчике закрытия формы или системы мы проверяем этот флаг. Если он равен «Ложь» — отменяем закрытие.
Рассмотрим по шагам реализацию данного алгоритма:
Перем РазрешитьЗакрытие Экспорт;
Процедура ПриНачалеРаботыСистемы()
РазрешитьЗакрытие = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура КомандаЗавершитьСеансВыполнить()
РазрешитьЗакрытие = Истина;
ЗавершитьРаботуСистемы(Ложь); // Параметр "Ложь" означает завершение без перезапуска
КонецПроцедуры
ПередЗавершениемРаботыСистемы в модуле управляемого приложения (или ПередЗакрытием в модуле формы).
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
Если Не РазрешитьЗакрытие Тогда
Отказ = Истина;
ТекстПредупреждения = "Внимание! Закрытие программы разрешено только через кнопку 'Завершить сеанс' в интерфейсе кассира.";
КонецЕсли;
КонецПроцедуры
При такой схеме, если кассир попытается нажать на «крестик», сработает обработчик ПередЗавершениемРаботыСистемы. Поскольку переменная РазрешитьЗакрытие осталась в значении Ложь, система заблокирует выход и выдаст предупреждение.
Если ваше рабочее место кассира реализовано в толстом клиенте на обычных формах (например, в старых редакциях конфигураций «1С:Розница» или «1С:Управление торговлей»), решить задачу можно еще проще — путем изменения визуальных свойств самой формы.
Проанализируем, как убрать кнопку закрытия из заголовка окна формы конфигуратора:
Alt + Enter, чтобы открыть палитру свойств формы.СпособЗакрытияФормы или управляться флагом ЗакрыватьПриНажатииEsc). Снимите галочку с этого свойства.После сохранения изменений у формы физически пропадет «крестик» в правом верхнем углу, и кассир будет вынужден пользоваться исключительно интерфейсными кнопками, которые вы разместите на самой форме.
В современных конфигурациях на управляемых формах стандартными свойствами формы полностью скрыть кнопку «Х» с главного окна приложения невозможно. Однако платформа «1С:Предприятие» предлагает специализированное решение для торговых точек — запуск системы в специальном режиме.
Выясним, как запустить рабочее место кассира в режиме ПолноэкранноеРабочееМесто:
Начиная с технологической платформы версии 8.3, разработчики добавили возможность открывать основное окно программы в режиме киоска. При этом у окна приложения полностью отсутствуют рамки операционной системы Windows, системное меню, панель задач и, соответственно, кнопка «крестик».
Для настройки такого режима работы выполните следующие действия:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Проверяем роль текущего пользователя
Если РольДоступна("РольКассира") Тогда
УстановитьРежимОсновногоОкна(РежимОсновногоОкна.ПолноэкранноеРабочееМесто);
КонецЕсли;
КонецПроцедуры
При реализации кнопки программного закрытия разработчики часто путают два схожих метода платформы 1С. Разберем их принципиальное отличие:
ЗавершитьРаботуСистемы(Перезапустить, ДополнительныеПараметрыЗапуска)ПередЗакрытием и ПриЗакрытии, а затем выполняет процедуру ПередЗавершениемРаботыСистемы модуля приложения. Это позволяет корректно сохранить настройки пользователя, записать кэш и завершить активные сеансы работы с торговым оборудованием (например, фискальным регистратором).ПрекратитьРаботуСистемы()Проанализируем важный нюанс безопасности, появившийся в платформе «1С:Предприятие» в последних обновлениях. При написании блокировки в процедуре ПередЗавершениемРаботыСистемы недостаточно просто написать Отказ = Истина.
Если в системе открыты несохраненные окна или конфигурация работает в режиме стандартных настроек, при установке флага Отказ = Истина платформа может выдать стандартное диалоговое окно Windows: «Работа в данном окне не завершена. Все равно завершить работу?». Если кассир нажмет кнопку «Все равно завершить», программа проигнорирует ваш запрет и закроется.
Чтобы избежать этой лазейки, обязательно передавайте понятное и строгое описание в параметр ТекстПредупреждения:
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
Если Не РазрешитьЗакрытие Тогда
Отказ = Истина;
ТекстПредупреждения = "ВЫХОД ЗАБЛОКИРОВАН! Пожалуйста, используйте кнопку 'Завершить сеанс' в меню кассира.";
КонецЕсли;
КонецПроцедуры
При заполнении параметра ТекстПредупреждения платформа переопределяет стандартный текст вопроса на ваш собственный, что минимизирует вероятность того, что пользователь закроет приложение в обход правил.
Обратите внимание, что если ваше рабочее место кассира запущено через веб-браузер (веб-клиент «1С»), заблокировать закрытие вкладки браузера стандартными методами платформы невозможно. Браузеры обеспечивают изоляцию веб-страниц из соображений безопасности. В этом случае попытка закрыть вкладку вызовет лишь стандартное предупреждение браузера («Возможно, внесенные изменения не сохранятся»), текст которого разработчик 1С настроить не может.
Поэтому для надежной блокировки «крестика» на рабочих местах кассиров всегда рекомендуется использовать Тонкий клиент в режиме ПолноэкранноеРабочееМесто.