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