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