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