Документы и Печать · 11 мин
Как в 1С из двух макетов сделать один
Как объединить два макета печатных форм в 1С в один: способы слияния табличных макетов, копирование областей, работа в конфигураторе и типичные ошибки.
Задача объединить два макета в один возникает в 1С регулярно: например, нужно собрать единую печатную форму из двух ранее созданных вариантов, перенести области из макета документа в общий макет или склеить шапку одной формы с табличной частью другой. Разработчики типовых конфигураций часто разводят макеты по разным объектам, и при доработке приходится собирать их воедино.
Способ решения зависит от того, где лежат макеты и какого они типа. Табличные макеты (MXL) объединяются копированием областей прямо в конфигураторе, макеты внешних печатных форм — через файлы, а программные макеты иногда проще собрать кодом, выводя области из двух источников в один табличный документ. Ниже разобраны все рабочие варианты с точным порядком действий.
Определите тип макетов и место их хранения
Прежде чем объединять, выясните, с чем работаете. В 1С макеты бывают нескольких видов: табличный документ (MXL) — самый частый вариант для печатных форм; макет СКД (схема компоновки данных); макет оформления; текстовый, HTML и другие. Объединение вручную через конфигуратор корректно работает только для табличных документов.
Макет может храниться в ветке «Общие → Макеты» конфигурации, внутри объекта (документ, справочник, отчёт — вкладка «Макеты»), либо во внешнем файле — внешняя печатная форма (EPF) или отдельный MXL-файл. От расположения зависит, как вы будете открывать макеты и куда сохранять результат.
Подходит копирование областей через буфер обмена
Сначала откройте EPF в конфигураторе, затем работайте с макетом внутри
Открываются через Файл → Открыть, далее копирование областей
СКД не склеивается копированием, нужно переносить наборы данных и настройки
Подготовка: резервная копия и анализ областей
Перед любыми правками сохраните исходные макеты. Если макет находится в конфигурации, убедитесь, что у вас есть актуальная выгрузка базы (dt) или хотя бы выгрузка конфигурации (cf). Если это внешняя печатная форма — скопируйте EPF-файл в отдельную папку. Откатить неудачное слияние без копии будет невозможно.
Откройте оба макета и выпишите имена областей, которые используются в коде печати: шапка, строка, подвал и т.п. Область в табличном макете — это именованный диапазон строк (или колонок), который программа извлекает методом ПолучитьОбласть("ИмяОбласти"). Если в двух макетах есть области с одинаковыми именами, но разным содержимым, при объединении возникнет конфликт — одну из них придётся переименовать и поправить код.
Способ 1: копирование областей в конфигураторе
Это основной и самый надёжный способ объединить два табличных макета. Логика проста: один макет становится базовым, из второго вы переносите нужные области.
После вставки проверьте, что форматирование не «поплыло»: ширина колонок в табличном макете общая для всего документа. Если во втором макете колонки были другой ширины, вставленные ячейки подстроятся под колонки базового макета, и текст может обрезаться. В таком случае либо выравнивайте ширину заранее, либо объединяйте ячейки вставленной области.
Если переносить нужно не всё подряд, а отдельные области, действуйте по одной: выделили область целиком (удобно кликать по имени области в левой панели макета, если она отображается), скопировали, вставили, назначили имя. Повторяйте, пока не перенесёте всё нужное.
Способ 2: программное объединение двух макетов в один документ
Иногда физически склеивать макеты не нужно — достаточно, чтобы на печать выводился один документ, собранный из областей двух макетов. Это удобно, когда макеты поддерживаются разными людьми или один из них типовой и обновляется поставщиком конфигурации.
Идея: в модуле печати получаете оба макета и последовательно выводите их области в один результирующий табличный документ.
ТабДок = Новый ТабличныйДокумент;
Макет1 = ПолучитьМакет("МакетШапка");
Макет2 = ПолучитьМакет("МакетТаблица");
ОбластьШапка = Макет1.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = НомерДок;
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет2.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЧ Из ТаблицаТовары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Такой подход даёт гибкость: итоговая форма собирается динамически, и замена одного из макетов не трогает второй. Минус — нужно править код, а значит, требуется доступ к модулю менеджера печати объекта или к внешней печатной форме. В типовых конфигурациях с механизмом БСП (библиотека стандартных подсистем) печатные формы часто выносят во внешние, чтобы не снимать конфигурацию с поддержки.
Способ 3: объединение макетов внешних печатных форм
Если оба макета лежат во внешних печатных формах (EPF), порядок такой: откройте первую EPF в конфигураторе (Файл → Открыть), найдите макет в структуре обработки, затем откройте вторую EPF аналогично. Дальше действует тот же механизм копирования областей между открытыми окнами макетов.
После переноса областей не забудьте про модуль печатной формы: если код обращается к макету по имени (ПолучитьМакет("Макет2")), а вы перенесли области в «Макет1», вызовы нужно перенаправить. Проще всего оставить структуру кода, но заменить имя макета в получении области.
Если макеты хранятся как отдельные MXL-файлы (такое встречается в старых доработках), откройте оба файла через Файл → Открыть, скопируйте области и сохраните результат через Файл → Сохранить как в формате «Табличный документ (*.mxl)».
Проверка результата после объединения
Сразу после слияния пройдитесь по списку контрольных точек. Большинство ошибок объединения макетов всплывают именно на этапе первой печати, и лучше поймать их до того, как форму увидит пользователь.
Как проверить результат
Все области имеют уникальные имена, код находит каждую по имени
Ошибка "Область не найдена" при печати
В перенесённых ячейках заполнение установлено как "Параметр", имена совпадают с кодом
На печати пустые поля или текст вида [Параметр]
Текст перенесённых областей не обрезан, колонки выровнены
Содержимое ячеек уезжает или скрыто
Форма выводится полностью: шапка, строки, подвал из обоих бывших макетов
Часть формы отсутствует или дублируется
Проверяйте печать на документе с реальными данными, причём на таком, где табличная часть содержит несколько строк — это сразу покажет проблемы с областями строк и итогами. Если форма многостраничная, проверьте вывод колонтитулов и повторение шапки таблицы на каждой странице (свойство «ПовторятьПриПечатиСтроки» или настройки в коде).
Типичные ошибки и ограничения
Отдельное ограничение касается макетов СКД: их нельзя объединить копированием областей, потому что у них другая внутренняя структура — наборы данных, связи, ресурсы, настройки. Если нужно объединить два отчёта на СКД, переносят элементы схемы (наборы данных, вычисляемые поля, варианты настроек) в одну схему, и это уже задача другого уровня сложности.
Как выбрать действие
Когда лучше не объединять, а создать новый макет
Иногда честнее не склеивать два макета, а сделать третий. Признаки такой ситуации: исходные макеты сильно различаются по структуре колонок, каждый используется в своём коде, который нельзя трогать, либо объединённая форма нужна как дополнительный вариант, а не замена.
В этом случае создайте новый макет (в общих макетах или в объекте), перенесите в него области из обоих источников тем же копированием, назначьте областям понятные имена и напишите отдельную команду печати. Исходные макеты останутся нетронутыми, а риск сломать существующие формы сведётся к нулю.
Что важно запомнить
Два табличных макета в 1С объединяются копированием областей через конфигуратор: выделение строк → Ctrl+C → Ctrl+V → назначение имён областей. Перед работой сделайте резервную копию, после — проверьте уникальность имён областей, параметры ячеек и реальную печать. Если один макет типовой, собирайте итоговую форму программно, не изменяя его.
Частые вопросы
Можно ли объединить два макета без конфигуратора, прямо в режиме Предприятия?
Нет, встроенных средств редактирования макетов в пользовательском режиме нет. Редактирование возможно только в конфигураторе. Косвенный обходной путь — внешняя печатная форма: её файл можно править в конфигураторе на любой копии базы и подключать в рабочую через «Дополнительные отчеты и обработки», не останавливая работу пользователей.
После вставки области параметры выводятся как текст в квадратных скобках. Что делать?
Откройте свойства проблемной ячейки (правый клик → Свойства) и проверьте поле «Заполнение»: должно быть установлено значение «Параметр», а не «Текст». Также сверьте имя параметра в ячейке с именем, которое присваивает код — они должны совпадать с точностью до символа.
Как перенести область, если в макетах разная ширина колонок?
Ширина колонок в табличном документе едина для всего макета, поэтому вставленные ячейки примут ширину базового макета. Варианты: заранее подогнать ширину колонок базового макета под переносимый, объединить несколько колонок в перенесённых ячейках или собрать форму программно — при выводе областей из разных макетов в один табличный документ ширина берётся из каждого макета отдельно.
Что будет при обновлении типовой конфигурации с изменённым макетом?
Если конфигурация на полной поддержке, изменённый макет при обновлении будет замещён типовым — доработка пропадёт. Поэтому типовые макеты не правят: создают макет-копию под своим именем или выносят форму во внешнюю печатную обработку. Если поддержка частично снята, при обновлении можно управлять сравнением и объединением, но это требует аккуратности.
Можно ли объединить макет Word или Excel с табличным макетом 1С?
Напрямую — нет, это разные форматы. Макет на основе DOCX или XLSX работает через механизм COM/OLE или через макеты типа «Двоичные данные» с заполнением по закладкам. Если нужна единая форма, проще перерисовать содержимое Word-макета в табличном документе 1С или, наоборот, перенести всё в один внешний файл-шаблон.