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