Как вызвать стандартный и измененный макет печати из кода расширения в 1С?

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

При доработке конфигураций 1С (например, «Управление торговлей 11.5») через расширения часто возникает классическая задача: мы изменили печатную форму документа и логику заполнения ее параметров, но пользователям необходимо оставить возможность печатать и старый, «стандартный» вариант (до изменений). То есть в интерфейсе должно быть две команды: одна вызывает наш измененный макет из расширения, а вторая — типовой макет из основной конфигурации.

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

Вариант 1: Временное отключение пользовательских макетов (небезопасный путь)

Первая идея, которая часто приходит на ум разработчикам, — это попытаться программно временно отключить использование пользовательского макета непосредственно перед печатью, а затем включить его обратно. В БСП за это отвечает реквизит Использование в регистре сведений ПользовательскиеМакетыПечати.

Рассмотрим, почему этот подход категорически не рекомендуется:

  1. Проблема параллельной работы: В момент, когда вы программно отключаете макет (меняете запись в регистре), другой пользователь может нажать кнопку печати в этом же документе. Из-за этого он либо получит старый макет вместо нового, либо столкнется с ошибкой исполнения из-за несовпадения ожидаемых параметров (поскольку код формирования параметров может отличаться для разных версий макета).
  2. Вмешательство в логику БСП: Регистр обрабатывается исключительно функциями общего модуля УправлениеПечатью. Вмешательство в работу этих функций "на лету" делает систему нестабильной и непредсказуемой.

Если вам все же нужно проигнорировать изменения, сделанные пользователями в режиме «Предприятия» (когда макет изменен карандашиком в интерфейсе), лучше использовать базовый метод платформы, который обращается напрямую к метаданным конфигурации, минуя БСП:

Макет = Документы.ИмяДокумента.ПолучитьМакет("ИмяМакета");

Этот метод гарантированно вернет макет из дерева конфигурации без риска блокировок или влияния на других пользователей.

Вариант 2: Копирование макета в расширение (рабочий обходной путь)

Проанализируем ограничения платформы. Если стандартный макет был заимствован в расширение и изменен непосредственно в конфигураторе (в дереве метаданных расширения), то платформа 1С при любых обращениях к нему будет отдавать приоритет макету из расширения. В языке 1С нет встроенной функции вроде ПолучитьМакетИзОсновнойКонфигурации(), которая позволила бы обойти расширение.

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

Вариант 3: Архитектурно правильный подход (Best Practice)

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

Разберем по шагам, как сделать это грамотно:

  1. Не изменяйте заимствованный макет: Если вы заимствовали типовой макет в расширение, оставьте его в исходном виде. Это гарантирует, что типовая кнопка печати будет работать по стандартным механизмам БСП и вызывать нетронутый макет.
  2. Создайте свой кастомный макет: Добавьте в расширение новый собственный макет. Например, скопируйте стандартный и назовите его ИмяМакета_Кастомный.
  3. Измените код только для нового макета: Всю необходимую логику обработки параметров, изменение запросов и форматирование применяйте исключительно к вашему новому кастомному макету.
  4. Добавьте отдельную команду: Используйте перехват процедуры ДобавитьКомандыПечати в модуле менеджера документа для вывода новой кнопки печати.

Посмотрим на пример добавления команды через расширение:


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ИмяМакета_Кастомный";
    КомандаПечати.Представление = "Наша измененная печатная форма";
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    
КонецПроцедуры

Преимущества данного подхода:

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

← На главную