Как правильно вызвать стандартную процедуру в расширении, если она отсутствует в модуле объекта основной конфигурации

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При обновлении платформы 1С:Предприятие до версий 8.3.21, 8.3.22 и выше многие разработчики сталкиваются с неприятной ситуацией: расширения, которые годами работали стабильно, внезапно перестают проходить проверку применения в конфигураторе. Особенно часто это проявляется при использовании аннотаций &После или &Перед для стандартных событий модуля объекта, таких как ПриКопировании, ПередЗаписью или ПриУстановкеНовогоНомера.

В этой статье мы подробно разберем, почему старые методы перестали работать, как изменилась логика платформы и как правильно адаптировать код расширения, чтобы он успешно проходил проверку и корректно выполнялся в пользовательском режиме.

Почему возникла проблема и как она проявляется

Рассмотрим типичную ситуацию: в расширении была доработана процедура ПриКопировании модуля документа. В основной конфигурации текст этой процедуры отсутствовал, так как разработчики типового решения не видели необходимости переопределять стандартное поведение платформы. Однако в расширении была добавлена процедура с аннотацией &После("ПриКопировании").

Долгое время (на старых версиях платформы и старых режимах совместимости) такая конструкция работала. Платформа видела, что происходит стандартное событие, и вызывала код из расширения. Но после перехода на платформу 8.3.22.1704 и изменения режима совместимости конфигуратор начинает выдавать ошибку: "Метод не найден в основной конфигурации". При этом, что самое коварное, в пользовательском режиме расширение может продолжать работать некоторое время, создавая иллюзию «глюка» конфигуратора.

Проанализируем причины такого поведения:

  1. Усиление контроля метаданных: В новых версиях платформы механизмы статического анализа стали строже. Теперь при использовании аннотаций &Перед, &После и &Вместо платформа проверяет физическое наличие метода в тексте модуля основной конфигурации. Если процедуры нет в коде — «прицепиться» расширению не к чему.
  2. Изменение в механизме «Строгой проверки»: При режиме совместимости 8.3.15 и выше расширения требуют четкого соответствия заимствованных объектов. Если вы заимствовали метод, которого нет, это считается ошибкой структуры метаданных.
  3. Разрыв между компиляцией и выполнением: В режиме предприятия платформа может применять расширение динамически, обращаясь напрямую к обработчикам событий, но полагаться на это нельзя, так как любой апдейт или очистка кэша могут привести к полному отказу расширения.

Способ 1: Назначение обработчика события через палитру свойств (Рекомендуемый)

Если в основной конфигурации процедура ПриКопировании отсутствует, нам не нужно пытаться «вклиниться» в несуществующий код с помощью &После. Вместо этого мы должны использовать механизм прямой привязки события в расширении. Разберем этот процесс по шагам:

  1. Заимствуем объект: Добавьте необходимый документ (например, Документ.Анкета) в ваше расширение.
  2. Открываем палитру свойств: В дереве метаданных расширения выделите этот документ, нажмите правую кнопку мыши и выберите «Свойства».
  3. Переходим к событиям: В палитре свойств перейдите на вкладку «События» (иконка с молнией).
  4. Создаем обработчик: Найдите событие ПриКопировании. Нажмите на кнопку с лупой рядом с полем ввода.
  5. Выбор модуля: Платформа предложит создать процедуру в модуле объекта расширения.

В результате в модуле объекта расширения будет создана процедура без аннотаций. Она будет выглядеть примерно так:


Процедура ПриКопировании(ОбъектКопирования)
    // Ваш код, который должен выполниться при копировании
    // Например, очистка специфических реквизитов
    ЭтотОбъект.ДополнительныйСтатус = Перечисления.СтатусыАнкет.Пустой;
КонецПроцедуры

Важный нюанс: В этом случае расширение становится основным и единственным обработчиком события ПриКопировании для данного объекта. Так как в основной конфигурации кода нет, конфликтов не возникнет, а проверка применения будет проходить мгновенно и без ошибок.

Способ 2: Использование аннотации &Вместо

Если вы по каким-то причинам хотите сохранить связь через аннотации (например, предполагаете, что в будущем разработчики типовой конфигурации могут добавить эту процедуру), можно использовать аннотацию &Вместо. Однако в новых платформах это тоже может вызвать ошибку, если метода нет в коде.

Рассмотрим правильный подход к написанию кода в расширении, если вы все же решили использовать перехват:


&Вместо("ПриКопировании")
Процедура Расш1_ПриКопировании(ОбъектКопирования)
    // Вызываем стандартную обработку (если бы она была)
    ПродолжитьВызов(ОбъектКопирования);
    
    // Добавляем свою логику
    Сообщить("Документ успешно скопирован в расширении!");
КонецПроцедуры

Но помните: если в основной конфигурации метод отсутствует физически (его нет в тексте модуля объекта), то даже &Вместо может не пройти проверку в режиме строгой совместимости 8.3.22. Поэтому Способ 1 является приоритетным.

Анализ ситуации с общими модулями

Выясним причину, по которой аналогичные ошибки возникают в общих модулях. Если в расширении есть процедура &После("ИмяПроцедуры"), а в основном общем модуле эта процедура была удалена в новом релизе, то расширение гарантированно перестанет работать.

В отличие от событий объекта (которые инициируются ядром платформы), вызов процедуры общего модуля происходит из конкретного места в коде. Если исходной процедуры нет, то и «события», к которому привязано &После, никогда не произойдет. В этом случае алгоритм действий следующий:

  1. Проанализируйте, откуда вызывалась удаленная процедура в основной конфигурации.
  2. Если вызов этой процедуры в основном коде также удален, значит, логика расширения больше не нужна в этом месте — ее следует удалить или перенести в другой обработчик.
  3. Если вам нужно сохранить логику, создайте в расширении новую независимую процедуру и вызывайте её из тех мест, где она требуется (также через расширение соответствующих модулей).

Итоги и рекомендации

Подводя итог нашему анализу, дадим несколько советов для работы с расширениями на современных версиях платформы:

Следуя этим правилам, мы обеспечим стабильную работу конфигурации и избавимся от необъяснимых на первый взгляд ошибок при запуске системы.

← На главную