При доработке типовых конфигураций (например, 1С:Управление торговлей 11, 1С:Розница, 1С:ERP) часто возникает задача автоматизировать действия пользователя. Типичный сценарий — автоматическое выполнение операции при работе на кассе самообслуживания (КСО), когда требуется избежать лишних кликов по кнопкам «Выполнить» или «Пробить чек» в промежуточных окнах оплаты или эквайринга.
Однако при попытке вызвать процедуру команды напрямую из обработчика ПриОткрытии (или в расширении через &НаКлиенте Процедура Расш1_ПриОткрытииПосле) разработчики сталкиваются с тем, что код частично отрабатывает (например, форма блокируется или меняет доступность элементов), но диалоговое окно терминала не открывается, чек не пробивается или операция прерывается без видимых ошибок.
Разберем подробнее, почему возникает такое поведение платформы «1С:Предприятие 8.3» и как правильно реализовать автоматический запуск нужного действия.
Проанализируем механику работы клиентского события ПриОткрытии. В момент его выполнения окно формы фактически еще не завершило процесс создания и отображения:
Закрыть(), платформа не может корректно связать контексты окон.МенеджерОборудованияКлиент). Драйверы торгового оборудования получают асинхронные команды и отправляют внешние события, которые требуют наличия полностью инициализированной и активной родительской формы. Вызов до завершения отображения формы прерывает цепочку вызовов БПО.Для того чтобы команда успешно выполнилась, необходимо дождаться, пока платформа завершит отрисовку формы и перейдет в состояние готовности к приему пользовательских действий. Стандартным и рекомендуемым паттерном в платформе 1С является использование механизма отложенного вызова с помощью метода ПодключитьОбработчикОжидания с флагом однократного запуска.
Посмотрим на пример реализации в расширении конфигурации для формы эквайринговой операции или смешанной оплаты:
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
// Проверяем условие, при котором требуется автовыполнение
Если ЭтоКассирКСО() Тогда
// Подключаем однократный обработчик с минимальной задержкой
ПодключитьОбработчикОжидания("ВыполнитьАвтоматическуюОперацию", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьАвтоматическуюОперацию()
// Вызываем целевую процедуру команды формы
// В типовых формах команда может принимать параметр КомандаФормы или Неопределено
ВыполнитьОперацию(Неопределено);
КонецПроцедуры
Разберем по шагам ключевые моменты этого кода:
Однократно = Истина): Третий параметр метода ПодключитьОбработчикОжидания гарантирует, что процедура ВыполнитьАвтоматическуюОперацию сработает ровно один раз и не будет циклически запускаться повторно.0.1 секунды обеспечивает практически мгновенную реакцию: форма завершает свой цикл открытия, и сразу же стартует обработка терминала или печать чека, без заметных визуальных задержек для покупателя или кассира.Процедура ИмяКоманды(Команда). Если внутри процедуры свойства самой команды не анализируются, в качестве аргумента достаточно передать Неопределено. Если же логика команды опирается на свойства переданного объекта, безопаснее создать отдельную процедуру без параметров, куда вынести содержательную часть логики.Несмотря на работоспособность схемы с таймером, рассмотрим более чистое с точки зрения архитектуры решение. Промежуточная форма подтверждения часто вообще не требуется при автоматизированных операциях.
Вместо цепочки «открыть форму -> подождать 0.1 сек -> программно нажать кнопку -> закрыть форму» можно перехватить логику непосредственно в вызывающем объекте (например, в рабочем месте кассира или форме документа перед вызовом промежуточного окна):
МенеджерОборудованияКлиент или экспортные функции формы документа.ОткрытьФорму() для окна подтверждения. Это исключит кратковременное мерцание интерфейса и гарантирует максимальное быстродействие системы.