Почему не работает код расширения 1С и как запустить процедуру с аннотацией &Вместо?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

Разработка расширений в среде 1С — это мощный инструмент, позволяющий кастомизировать типовые конфигурации (такие как Комплексная автоматизация, ERP или Управление торговлей) без снятия объектов с поддержки. Однако начинающие разработчики часто сталкиваются с ситуацией, когда код, написанный в модуле расширения с аннотацией &Вместо, упорно отказывается выполняться, а точки останова в конфигураторе игнорируются платформой.

В этой статье мы подробно разберем, почему возникает эта проблема, как быстро вернуть работоспособность вашему коду и рассмотрим современные архитектурные подходы к изменению логики печатных форм в системе 1С:Предприятие.

---

Причина №1. Активный безопасный режим расширения (Основная причина)

По умолчанию при подключении любого нового расширения в базу данных платформа 1С запускает его в безопасном режиме. Это защитный механизм, который предотвращает выполнение потенциально опасного серверного кода.

В безопасном режиме платформа накладывает жесткие ограничения:

  1. Полностью блокируется выполнение серверных методов в заимствованных модулях объектов и менеджеров (включая обработчики с аннотациями &Вместо, &Перед и &После). Код просто "молча" игнорируется, не вызывая при этом явных ошибок или предупреждений в Конфигураторе.
  2. Запрещен доступ к операционной системе (запуск внешних программ, работа с файловой системой сервера).
  3. Запрещено использование COM-объектов.

Именно поэтому у автора темы процедура ЗаполнитьТабличныйДокументНТ не вызывалась, а точка останова не срабатывала.

Как отключить безопасный режим для расширения

Чтобы предоставить расширению полные права на выполнение серверного кода, нам необходимо отключить для него безопасный режим. Разберем по шагам, как это сделать в режиме "1С:Предприятие":

  1. Запустите информационную базу в режиме 1С:Предприятие под пользователем с административными правами.
  2. Перейдите в раздел НСИ и администрирование (или "Администрирование" в зависимости от вашей конфигурации).
  3. Найдите и откройте пункт Печатные формы, отчеты и обработки, затем выберите гиперссылку Расширения.
  4. В открывшемся списке расширений найдите ваше расширение (в примере автора — "Исправление").
  5. Обратите внимание на колонку Безопасный режим. По умолчанию там будет стоять флажок. Снимите этот флажок.
  6. Перезапустите сеанс работы пользователя (или перезапустите отладку).

Если вы ведете разработку в файловой базе или на тестовом сервере, также убедитесь, что в самом Конфигураторе в свойствах расширения (клик правой кнопкой мыши по корню расширения — "Свойства") снят флаг Безопасный режим.

---

Причина №2. Нюансы отладки на сервере и фоновые задания

Если безопасный режим отключен, код выполняется, но точка останова все равно "пролетает", причина кроется в особенностях работы отладчика 1С. В типовых конфигурациях (КА, ERP, УТ) печать документов очень часто реализуется через фоновые задания на сервере.

Выясним, как настроить отладчик для отслеживания серверного кода:

  1. Включите отладку фоновых заданий: В Конфигураторе откройте меню Отладка -> Подключение.... В открывшемся окне нажмите кнопку Автоматическое подключение и установите флажок напротив пункта Фоновые задания. Нажмите "ОК".
  2. Проверьте параметры запуска сервера: Если ваша база работает в клиент-серверном режиме, служба агента сервера 1С (ragent) должна быть запущена с параметром -debug. Без этого отладчик физически не сможет остановиться на серверном коде модулей менеджеров или объектов.
  3. Очистите кэш: Иногда платформа "кэширует" старую структуру метаданных. Если вы динамически обновляли расширение, закройте Предприятие, очистите локальный кэш базы данных или запустите систему с параметром /ClearCache.

---

Почему использовать аннотацию &Вместо — плохая практика?

Хотя аннотация &Вместо кажется самым простым способом решить задачу "здесь и сейчас", опытные разработчики предостерегают от ее регулярного использования для полной замены стандартного кода.

Рассмотрим ключевые риски:

Альтернатива: Использование аннотации &ИзменениеИКонтроль

Начиная с версии платформы 8.3.15, вместо полной замены кода рекомендуется использовать аннотацию &ИзменениеИКонтроль. Она позволяет точечно внедрять изменения в оригинальный метод платформы, контролируя изменения поставщика конфигурации с помощью специальных тегов.

Посмотрим на пример правильного заимствования метода:


&Вместо("ЗаполнитьТабличныйДокументНТ")
Процедура РасшИ_ЗаполнитьТабличныйДокументНТ(ТабличныйДокумент, ДанныеПечати)
    
    // Вызываем оригинальный алгоритм заполнения через ПродолжитьВызов()
    ПродолжитьВызов(ТабличныйДокумент, ДанныеПечати);
    
    // Дописываем только нашу специфическую логику заполнения полей
    ОбластьМакет = ТабличныйДокумент.НайтиФорматныеСтроки(...); 
    // Наш код заполнения новых полей...

КонецПроцедуры

Использование метода ПродолжитьВызов() позволяет выполнить оригинальный код типовой конфигурации, а затем дополнить результат своими данными. Это значительно снижает риски сломать систему при очередном обновлении конфигурации.

---

Архитектурно верный подход: Кастомизация печатных форм через БСП

Если перед вами стоит задача изменить макет или алгоритм заполнения Транспортной Накладной (или любой другой типовой печатной формы), лучшим решением будет создание собственной печатной формы.

В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) это делается двумя способами:

Вариант А. Создание внешней печатной формы (ВПФ)

Это классический и самый безопасный метод. Вы создаете внешнюю обработку (файл .epf), которая регистрируется в справочнике "Дополнительные отчеты и обработки".

Преимущества ВПФ:

Вариант Б. Разработка команд печати внутри расширения

Начиная с БСП версии 3.1.2, разработчикам доступен штатный механизм интеграции команд печати непосредственно через расширения. Вместо того чтобы перехватывать типовые процедуры модуля менеджера, мы добавляем новую команду печати в расширение.

Для этого в расширении переопределяется процедура БСП ПриОпределенииКомандПечати:


&После("ПриОпределенииКомандПечати")
Процедура РасшИ_ПриОпределенииКомандПечати(СписокКоманд)
    
    // Добавляем свою команду печати, которая будет вызывать наш алгоритм
    КомандаПечати = СписокКоманд.Добавить();
    КомандаПечати.Идентификатор = "ТранспортнаяНакладнаКастом";
    КомандаПечати.Представление = "Транспортная накладная (модифицированная)";
    КомандаПечати.Проводник = "Документ.РеализацияТоваровУслуг";
    
КонецПроцедуры

Этот подход позволяет пользователям выбирать нужный вариант печати в подменю "Печать" документа, при этом типовой код конфигурации остается абсолютно нетронутым и чистым, что гарантирует легкое и беспроблемное обновление вашей системы в будущем.

← На главную