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