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