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

Разработка и Конфигурация · 11 мин

Как объединить два табличных документа в 1С

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

Табличный документ в 1С — это объект, который используется для отчётов, печатных форм и произвольных таблиц. Задача объединить два таких документа возникает, когда нужно собрать сводный отчёт из нескольких частей, склеить печатные формы в один файл или добавить к основному документу дополнительный блок, сформированный отдельной процедурой.

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

Ниже разобраны оба подхода с готовым кодом, ограничениями каждого способа и способами проверки, что объединение прошло корректно.

Что такое табличный документ и как он устроен

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

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

Способ 1. Ручное объединение через буфер обмена

Если оба документа уже открыты на экране (например, два сформированных отчёта или печатные формы), самый быстрый путь — обычное копирование. Выделите нужную область во втором документе мышью или комбинацией Ctrl+A для всего документа, скопируйте её (Ctrl+C), перейдите в первый документ, установите курсор в ячейку, с которой должна начинаться вставка, и нажмите Ctrl+V.

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

Способ подходит для разовых операций и небольших документов. Его ограничения: нельзя автоматизировать, легко ошибиться с позицией вставки, а при копировании очень больших областей возможны задержки. Для регулярных задач правильнее использовать программный метод.

Способ 2. Программное объединение методом Вывести

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

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

Документ1.Прочитать("C:\Temp\Отчет1.mxl");

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

Документ2.Прочитать("C:\Temp\Отчет2.mxl");

// Добавляем второй документ под первым

Документ1.Вывести(Документ2);

Документ1.Записать("C:\Temp\Объединенный.mxl");

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

Обратите внимание: Вывести() изменяет документ, у которого вызван, и не возвращает новый объект. Если исходный документ ещё понадобится в неизменном виде, сделайте копию заранее — например, запишите его во временный файл или сформируйте заново.

bsl
Документ1.Вывести(Документ2); // Документ2 добавляется под Документ1

Способ 3. Горизонтальное объединение методом Присоединить

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

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

Документ1.Прочитать("C:\Temp\Отчет1.mxl");

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

Документ2.Прочитать("C:\Temp\Отчет2.mxl");

// Приставляем второй документ справа

Документ1.Присоединить(Документ2);

При горизонтальном объединении критична высота документов. Если во втором документе строк больше, «лишние» строки всё равно будут перенесены, и визуально таблицы разъедутся. Если меньше — справа останется пустая зона. Перед присоединением имеет смысл проверить высоту обоих документов через свойство ВысотаТаблицы и при необходимости выровнять их, добавив пустые строки.

Сравнение вариантов

Вывести()

Вертикальное объединение: второй документ под первым. Подходит для склейки отчётов и печатных форм в один файл.

Присоединить()

Горизонтальное объединение: второй документ справа. Подходит для сравнения таблиц рядом, требует выравнивания высоты.

Буфер обмена

Ручное копирование областей. Только разовые операции, нельзя автоматизировать, риск перезаписи ячеек.

Объединение через общий макет и области

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

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

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

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

ИтоговыйДокумент.Вывести(Макет1.ПолучитьОбласть("Шапка"));

ИтоговыйДокумент.Вывести(Макет1.ПолучитьОбласть("Данные"));

// Разделитель между частями

ИтоговыйДокумент.Вывести(Макет1.ПолучитьОбласть("Разделитель"));

ИтоговыйДокумент.Вывести(Макет2.ПолучитьОбласть("Шапка"));

ИтоговыйДокумент.Вывести(Макет2.ПолучитьОбласть("Данные"));

Такой подход даёт контроль над разделителями, разрывами страниц при печати и порядком частей. Если объединённый документ будет печататься, добавьте между частями ВывестиГоризонтальныйРазделительСтраниц(), чтобы каждая часть начиналась с нового листа.

Порядок действий при программном объединении
  1. 1
    Создайте итоговый объект: Новый ТабличныйДокумент
  2. 2
    Сформируйте или прочитайте оба исходных документа
  3. 3
    Проверьте высоту и ширину документов при необходимости
  4. 4
    Вызовите Вывести() для вертикальной или Присоединить() для горизонтальной склейки
  5. 5
    Добавьте разделители страниц, если документ пойдёт на печать
  6. 6
    Сохраните или покажите результат и проверьте его визуально

Типичные ошибки и как их избежать

Самая частая проблема — конфликт имён областей. Если оба документа содержат именованные области с одинаковыми именами (например, «Шапка»), после объединения обращение по имени может вернуть не ту область. Решение — перед объединением переименовать области или работать только с координатами ячеек.

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

Третья группа проблем — оформление. Разная ширина колонок у двух документов при вертикальном объединении приведёт к тому, что нижняя часть «поедет»: колонки не совпадут с верхней таблицей. Перед склейкой приведите ширину колонок к единым значениям через Область().ШиринаКолонки или формируйте обе части из одного макета.

Типичные ошибки
01
Объединение документов с разной шириной колонок — нижняя таблица визуально «разъезжается» относительно верхней
02
Одинаковые имена областей в обоих документах — обращение по имени возвращает не ту область
03
Присоединить() без проверки высоты — справа остаются пустые зоны или строки не совпадают
04
Ожидание, что Вывести() вернёт новый документ — метод меняет исходный объект, данные без копии теряются
05
Склейка отчётов СКД на уровне табличных документов вместо уровня схемы — расшифровка перестаёт работать

Проверка результата и ограничения

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

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

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

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

Высота итогового документа
Норма

Равна сумме высот частей при вертикальной склейке

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

Меньше суммы — часть данных перезаписана или потеряна

Стык двух частей
Норма

Колонки совпадают, оформление единое

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

Колонки смещены, границы оборваны

Предпросмотр печати
Норма

Каждая часть начинается там, где задумано

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

Части разорваны посередине таблицы

Расшифровка ячеек
Норма

Клик по ячейке открывает корректные данные

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

Пустой результат или ошибка при клике

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

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

Можно ли объединить два табличных документа без программирования?

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

Чем Вывести() отличается от Присоединить()?

Вывести() размещает добавляемый документ или область ниже текущего содержимого — это вертикальная склейка. Присоединить() ставит содержимое справа от существующего — горизонтальная. Оба метода изменяют документ, у которого вызваны.

Почему после объединения «поехали» колонки?

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

Сохраняется ли расшифровка при объединении?

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

Как объединить документы, чтобы каждая часть печаталась с нового листа?

После вывода каждой части вызовите метод ВывестиГоризонтальныйРазделительСтраниц() у итогового документа. В предварительном просмотре каждая часть начнётся с отдельной страницы.

Есть ли ограничение на размер объединяемых документов?

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

Итог

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

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