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