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