Ситуация, когда визуальные изменения в расширении (например, добавление новой кнопки или изменение состава реквизитов формы) отображаются корректно, а написанный программный код игнорируется платформой, является довольно распространенной. Мы часто сталкиваемся с тем, что процедуры с аннотациями &Перед, &После или &Вместо просто не вызываются. Давайте подробно разберем причины этого явления и пошагово проанализируем способы решения проблемы.
Первое и самое важное, что мы должны проверить — это настройки безопасности самого расширения в дереве конфигурации. Платформа 1С по умолчанию накладывает жесткие ограничения на выполнение кода в расширениях, если включены защитные механизмы.
Разберем, на что обратить внимание:
Проанализируем ситуацию: если форма визуально меняется, значит, само расширение подключено. Но если программная логика молчит — это верный признак того, что исполняемая среда блокирует вызовы методов. Снимите указанные флаги и перезапустите сеанс.
Часто программисты забывают, что для событий формы (например, ПриСозданииНаСервере или ПриОткрытии) недостаточно просто написать процедуру в модуле расширения. Рассмотрим два способа, как заставить код работать.
Способ А: Регистрация через палитру свойств.
Если мы изменяем типовую форму, нам нужно зайти в свойства самой формы в расширении, найти нужное событие (например, ПриЧтенииНаСервере) и нажать на «лупу». Платформа предложит создать новый обработчик или выбрать существующий. Если метод не указан в списке обработчиков события в палитре свойств, он не будет вызван, даже если в коде написана аннотация.
Способ Б: Использование аннотаций для существующих методов.
Если в основной конфигурации у формы уже есть обработчик, мы можем «прицепиться» к нему без явного указания в свойствах, используя аннотации. Посмотрим на пример кода:
&После("ГруппаСтраницыПриСменеСтраницы")
Процедура Расширение_ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
// Наш код, который выполнится после типового
Сообщить("Страница успешно изменена!");
КонецПроцедуры
Важное условие: Чтобы этот механизм сработал, редактируемый обработчик обязательно должен существовать в модуле формы основной конфигурации.
Выясним причину, по которой код может «тихо» игнорироваться — это несовпадение количества или имен параметров. Если мы используем &Вместо, &Перед или &После, наша процедура в расширении должна иметь ровно столько же параметров, сколько и процедура в основной конфигурации.
Рассмотрим пример. Если в типовой конфигурации процедура объявлена так:
Процедура РассчитатьСумму(АктуальнаяДата, ДополнительныйПараметр = Неопределено) Экспорт
// Типовой код
КонецПроцедуры
А в расширении мы напишем:
&Вместо("РассчитатьСумму")
Процедура Расширение_РассчитатьСумму(АктуальнаяДата)
// ОШИБКА: Пропущен второй параметр
КонецПроцедуры
В этом случае платформа просто не сможет сопоставить методы, и расширение не сработает. Всегда проверяйте актуальность параметров после обновления основной конфигурации.
Проанализируем ситуацию, когда в базе установлено несколько расширений. Если в одном из расширений используется аннотация &Вместо и внутри кода не вызван оригинальный метод через ПродолжитьВызов(), то все остальные расширения, использующие &Перед или &После для этого же метода, не отработают.
Посмотрим, как правильно использовать &Вместо, чтобы не ломать логику других расширений:
&Вместо("ПечатьДокумента")
Процедура Расширение_ПечатьДокумента(ПараметрыПечати)
// Выполняем действия ДО типового кода
Сообщить("Начинаем подготовку к печати...");
// Вызываем оригинальный метод (и методы других расширений)
ПродолжитьВызов(ПараметрыПечати);
// Выполняем действия ПОСЛЕ типового кода
Сообщить("Печать завершена.");
КонецПроцедуры
Выясним еще один важный технический нюанс. Директивы компиляции в расширении должны строго соответствовать директивам в основной конфигурации. Если оригинальный метод помечен как &НаКлиенте, то и в расширении над методом перехвата должна стоять директива &НаКлиенте.
Если мы по ошибке укажем &НаСервере для клиентского метода, механизм перехвата не сработает, так как платформа ищет метод в другом контексте компиляции. Также стоит помнить про область видимости Экспорт — хотя для аннотаций это не всегда критично, для программного вызова методов расширения извне это необходимо.
Иногда мы сталкиваемся с тем, что код написан верно, настройки проверены, но расширение всё равно не работает. Это может быть связано с «залипанием» кэша конфигурации. Платформа может обновить XML-описание формы (визуальную часть), но оставить старую скомпилированную версию модуля в локальном кэше.
В такой ситуации рекомендуется выполнить следующие действия:
/ClearCache.%AppData%\1C\1cv8.Напоследок разберем влияние режима совместимости. Если режим совместимости основной конфигурации установлен ниже версии 8.3.10, работа с аннотациями в расширениях может иметь серьезные ограничения. Также важно следить за тем, чтобы режим совместимости самого расширения не был выше, чем у основной конфигурации. В идеале они должны совпадать или у расширения должен быть установлен вариант «Не использовать» (в этом случае оно наследует режим основной базы).
Подводя итог, можно сказать: если ваше расширение «видит» форму, но «не видит» код, последовательно проверьте Безопасный режим, сигнатуры (параметры) методов и регистрацию обработчиков событий в свойствах формы. В 90% случаев проблема кроется в одном из этих пунктов.