К статье
Практический материал

Документы и Печать · 11 мин

Как в 1С из двух макетов сделать один

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

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

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

Определите тип макетов и место их хранения

Прежде чем объединять, выясните, с чем работаете. В 1С макеты бывают нескольких видов: табличный документ (MXL) — самый частый вариант для печатных форм; макет СКД (схема компоновки данных); макет оформления; текстовый, HTML и другие. Объединение вручную через конфигуратор корректно работает только для табличных документов.

Макет может храниться в ветке «Общие → Макеты» конфигурации, внутри объекта (документ, справочник, отчёт — вкладка «Макеты»), либо во внешнем файле — внешняя печатная форма (EPF) или отдельный MXL-файл. От расположения зависит, как вы будете открывать макеты и куда сохранять результат.

Оба макета — табличные документы в конфигуратореПростой случай

Подходит копирование областей через буфер обмена

Один макет во внешней печатной формеСредняя сложность

Сначала откройте EPF в конфигураторе, затем работайте с макетом внутри

Макеты в формате MXL-файловПростой случай

Открываются через Файл → Открыть, далее копирование областей

Один из макетов — СКДТребует другого подхода

СКД не склеивается копированием, нужно переносить наборы данных и настройки

Подготовка: резервная копия и анализ областей

Перед любыми правками сохраните исходные макеты. Если макет находится в конфигурации, убедитесь, что у вас есть актуальная выгрузка базы (dt) или хотя бы выгрузка конфигурации (cf). Если это внешняя печатная форма — скопируйте EPF-файл в отдельную папку. Откатить неудачное слияние без копии будет невозможно.

Откройте оба макета и выпишите имена областей, которые используются в коде печати: шапка, строка, подвал и т.п. Область в табличном макете — это именованный диапазон строк (или колонок), который программа извлекает методом ПолучитьОбласть("ИмяОбласти"). Если в двух макетах есть области с одинаковыми именами, но разным содержимым, при объединении возникнет конфликт — одну из них придётся переименовать и поправить код.

Способ 1: копирование областей в конфигураторе

Это основной и самый надёжный способ объединить два табличных макета. Логика проста: один макет становится базовым, из второго вы переносите нужные области.

После вставки проверьте, что форматирование не «поплыло»: ширина колонок в табличном макете общая для всего документа. Если во втором макете колонки были другой ширины, вставленные ячейки подстроятся под колонки базового макета, и текст может обрезаться. В таком случае либо выравнивайте ширину заранее, либо объединяйте ячейки вставленной области.

Если переносить нужно не всё подряд, а отдельные области, действуйте по одной: выделили область целиком (удобно кликать по имени области в левой панели макета, если она отображается), скопировали, вставили, назначили имя. Повторяйте, пока не перенесёте всё нужное.

Способ 2: программное объединение двух макетов в один документ

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

Идея: в модуле печати получаете оба макета и последовательно выводите их области в один результирующий табличный документ.

ТабДок = Новый ТабличныйДокумент;

Макет1 = ПолучитьМакет("МакетШапка");

Макет2 = ПолучитьМакет("МакетТаблица");

ОбластьШапка = Макет1.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.НомерДокумента = НомерДок;

ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет2.ПолучитьОбласть("Строка");

Для Каждого СтрокаТЧ Из ТаблицаТовары Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

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

Способ 3: объединение макетов внешних печатных форм

Если оба макета лежат во внешних печатных формах (EPF), порядок такой: откройте первую EPF в конфигураторе (Файл → Открыть), найдите макет в структуре обработки, затем откройте вторую EPF аналогично. Дальше действует тот же механизм копирования областей между открытыми окнами макетов.

После переноса областей не забудьте про модуль печатной формы: если код обращается к макету по имени (ПолучитьМакет("Макет2")), а вы перенесли области в «Макет1», вызовы нужно перенаправить. Проще всего оставить структуру кода, но заменить имя макета в получении области.

Если макеты хранятся как отдельные MXL-файлы (такое встречается в старых доработках), откройте оба файла через Файл → Открыть, скопируйте области и сохраните результат через Файл → Сохранить как в формате «Табличный документ (*.mxl)».

Проверка результата после объединения

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

Контрольные точки

Как проверить результат

Имена областей
Норма

Все области имеют уникальные имена, код находит каждую по имени

Тревожный признак

Ошибка "Область не найдена" при печати

Параметры в ячейках
Норма

В перенесённых ячейках заполнение установлено как "Параметр", имена совпадают с кодом

Тревожный признак

На печати пустые поля или текст вида [Параметр]

Ширина колонок
Норма

Текст перенесённых областей не обрезан, колонки выровнены

Тревожный признак

Содержимое ячеек уезжает или скрыто

Реальная печать
Норма

Форма выводится полностью: шапка, строки, подвал из обоих бывших макетов

Тревожный признак

Часть формы отсутствует или дублируется

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

Типичные ошибки и ограничения

Типичные ошибки
01
Копирование ячеек вместо строк целиком — теряется структура области и высота строк, макет «рассыпается»
02
Конфликт имён областей после вставки — код получает не ту область или падает с ошибкой
03
Потеря параметров: при вставке ячейка сохраняет текст, но свойство «Заполнение» слетает на «Текст» — параметры не подставляются
04
Правка типового макета в конфигурации на поддержке — при обновлении все изменения затираются
05
Разная ширина колонок в исходных макетах — перенесённая часть отображается криво
06
Забытый вызов ОбновитьКонфигурациюБазыДанных — в пользовательском режиме виден старый макет

Отдельное ограничение касается макетов СКД: их нельзя объединить копированием областей, потому что у них другая внутренняя структура — наборы данных, связи, ресурсы, настройки. Если нужно объединить два отчёта на СКД, переносят элементы схемы (наборы данных, вычисляемые поля, варианты настроек) в одну схему, и это уже задача другого уровня сложности.

Маршрут решения

Как выбрать действие

Оба макета табличные и больше не будут меняться по отдельностиКопируйте области в один макет физически
Один макет типовой и обновляется поставщикомНе трогайте его — собирайте итоговую форму кодом из двух макетов
Макеты в разных внешних печатных формахПеренесите области в одну EPF и отключите вторую в справочнике дополнительных отчётов и обработок
Нужно сохранить обе формы и добавить объединённуюСоздайте третий макет-композит, не изменяя исходные два

Когда лучше не объединять, а создать новый макет

Иногда честнее не склеивать два макета, а сделать третий. Признаки такой ситуации: исходные макеты сильно различаются по структуре колонок, каждый используется в своём коде, который нельзя трогать, либо объединённая форма нужна как дополнительный вариант, а не замена.

В этом случае создайте новый макет (в общих макетах или в объекте), перенесите в него области из обоих источников тем же копированием, назначьте областям понятные имена и напишите отдельную команду печати. Исходные макеты останутся нетронутыми, а риск сломать существующие формы сведётся к нулю.

Итог

Что важно запомнить

Два табличных макета в 1С объединяются копированием областей через конфигуратор: выделение строк → Ctrl+C → Ctrl+V → назначение имён областей. Перед работой сделайте резервную копию, после — проверьте уникальность имён областей, параметры ячеек и реальную печать. Если один макет типовой, собирайте итоговую форму программно, не изменяя его.

Частые вопросы

Можно ли объединить два макета без конфигуратора, прямо в режиме Предприятия?

Нет, встроенных средств редактирования макетов в пользовательском режиме нет. Редактирование возможно только в конфигураторе. Косвенный обходной путь — внешняя печатная форма: её файл можно править в конфигураторе на любой копии базы и подключать в рабочую через «Дополнительные отчеты и обработки», не останавливая работу пользователей.

После вставки области параметры выводятся как текст в квадратных скобках. Что делать?

Откройте свойства проблемной ячейки (правый клик → Свойства) и проверьте поле «Заполнение»: должно быть установлено значение «Параметр», а не «Текст». Также сверьте имя параметра в ячейке с именем, которое присваивает код — они должны совпадать с точностью до символа.

Как перенести область, если в макетах разная ширина колонок?

Ширина колонок в табличном документе едина для всего макета, поэтому вставленные ячейки примут ширину базового макета. Варианты: заранее подогнать ширину колонок базового макета под переносимый, объединить несколько колонок в перенесённых ячейках или собрать форму программно — при выводе областей из разных макетов в один табличный документ ширина берётся из каждого макета отдельно.

Что будет при обновлении типовой конфигурации с изменённым макетом?

Если конфигурация на полной поддержке, изменённый макет при обновлении будет замещён типовым — доработка пропадёт. Поэтому типовые макеты не правят: создают макет-копию под своим именем или выносят форму во внешнюю печатную обработку. Если поддержка частично снята, при обновлении можно управлять сравнением и объединением, но это требует аккуратности.

Можно ли объединить макет Word или Excel с табличным макетом 1С?

Напрямую — нет, это разные форматы. Макет на основе DOCX или XLSX работает через механизм COM/OLE или через макеты типа «Двоичные данные» с заполнением по закладкам. Если нужна единая форма, проще перерисовать содержимое Word-макета в табличном документе 1С или, наоборот, перенести всё в один внешний файл-шаблон.