Разработка и Конфигурация · 10 мин
Как склеить два табличных документа в 1С
Как объединить два табличных документа в 1С: метод Вывести, область, построчное копирование и объединение по горизонтали. Примеры кода, ошибки и проверка результата.
Задача склеить два табличных документа в 1С возникает при формировании сводных печатных форм, объединении отчётов из разных источников или сборке единого документа из нескольких макетов. Платформа не имеет одной кнопки «объединить», но предоставляет несколько штатных механизмов: метод Вывести(), копирование областей и построчный перенос значений.
Выбор способа зависит от того, что именно нужно склеить: два программно сформированных документа, документ и область макета, либо данные с разной структурой колонок. Вертикальная склейка (один документ под другим) решается проще всего, горизонтальная (колонки рядом) требует ручной работы с областями.
Важно понимать: табличный документ в 1С — это не просто таблица значений, а объект с форматированием, объединёнными ячейками, группировками и параметрами печати. Поэтому «склейка» через копирование текста ячеек теряет оформление, а корректный перенос областей сохраняет его полностью.
Что значит «склеить» табличные документы
Под склейкой обычно понимают одну из трёх операций. Первая — вертикальное объединение: содержимое второго документа размещается ниже первого, строки добавляются вниз. Вторая — горизонтальное присоединение: колонки второго документа добавляются справа. Третья — слияние данных: строки двух документов сопоставляются по ключу и собираются в один, что уже ближе к работе с таблицами значений.
Табличный документ (объект ТабличныйДокумент) хранит ячейки с типами содержимого: значение, текст, шаблон. При копировании областей переносятся и параметры расшифровки, и автоотступ, и цвета. Поэтому прямая работа с областями — предпочтительный путь, если важен внешний вид результата.
Вертикальная склейка через метод Вывести()
Самый простой сценарий: оба документа уже сформированы программно, и нужно вывести их последовательно в один результирующий. Метод Вывести() принимает табличный документ или область и добавляет её ниже текущего содержимого.
Результат = Новый ТабличныйДокумент;
Результат.Вывести(Документ1);
Результат.Вывести(Документ2);
Если второй документ нужно вывести не целиком, а частично, сначала получите из него область методом ПолучитьОбласть() с указанием диапазона строк, например Документ2.ПолучитьОбласть("R5:R20"). Так можно отрезать шапку второго отчёта, чтобы она не дублировалась.
При вертикальной склейке ширина колонок результата определяется первым выведенным фрагментом. Если у документов разное число колонок или разная ширина, вторая часть может отображаться искажённо. Выравнивайте ширину колонок заранее или задайте её явно через свойство ШиринаКолонки области.
Результат = Новый ТабличныйДокумент;
Результат.Вывести(Документ1);
ОбластьВторого = Документ2.ПолучитьОбласть("R5:R" + Документ2.ВысотаТаблицы);
Результат.Вывести(ОбластьВторого);Горизонтальное присоединение колонок
Когда колонки второго документа должны стоять справа от первого, используется метод Присоединить(). Он добавляет область к правому краю текущего содержимого, начиная с первой строки.
Результат = Новый ТабличныйДокумент;
Результат.Вывести(Документ1);
Результат.Присоединить(Документ2.ПолучитьОбласть());
Ограничение метода: высота присоединяемой области должна соответствовать высоте уже выведенной части, иначе строки сместятся. Если документы имеют разное число строк, сначала приведите их к общей высоте — добавьте пустые строки в более короткий документ или обрежьте лишние.
Горизонтальная склейка часто применяется для сравнительных отчётов: слева план, справа факт. В этом случае надёжнее формировать обе части из одного макета с заранее согласованным числом строк, чем склеивать независимо сформированные документы.
Сравнение способов склейки
Вертикальное объединение. Сохраняет форматирование, простой код. Не подходит для размещения колонок рядом.
Горизонтальное присоединение. Требует одинаковой высоты частей, чувствителен к смещению строк.
Полный контроль над результатом, но теряется форматирование и объединённые ячейки исходников.
Склейка через копирование областей и значений
Если документы сформированы в разных местах кода и хранятся как готовые объекты, удобно работать через ПолучитьОбласть() без параметров — она возвращает весь документ как область. Полученную область можно вывести или присоединить любое число раз.
Альтернатива — построчный перенос: циклом по строкам и колонкам читать Текст или Значение ячеек источника и записывать в целевой документ. Такой подход оправдан, когда нужно отфильтровать строки, преобразовать данные или объединить документы по ключу. Но помните: оформление, объединения ячеек и расшифровка при этом не переносятся.
Для слияния по ключу (например, строки двух отчётов совпадают по номенклатуре) правильнее перейти от табличных документов к таблицам значений: собрать данные в ТаблицаЗначений, выполнить соединение и только потом вывести результат в табличный документ через макет. Попытка «склеивать по ключу» на уровне ячеек приводит к хрупкому коду.
Пошаговый порядок объединения двух документов
Типовая последовательность для вертикальной склейки двух программно сформированных документов выглядит так.
- 1Сформируйте оба документа в переменные типа ТабличныйДокумент, не выводя их пользователю
- 2Создайте итоговый документ: Результат = Новый ТабличныйДокумент
- 3Выведите первый документ: Результат.Вывести(Документ1)
- 4При необходимости отрежьте шапку второго: ПолучитьОбласть с диапазоном строк
- 5Выведите вторую часть: Результат.Вывести(ОбластьВторого)
- 6Перенастройте параметры печати итогового документа: ориентацию, масштаб, колонтитулы
- 7Проверьте результат через Результат.Показать() или запись в файл
Обратите внимание на параметры печати: они не наследуются от исходных документов автоматически. ОриентацияСтраницы, АвтоМасштаб, поля и колонтитулы нужно установить у итогового документа явно, иначе при печати можно получить разрывы в неожиданных местах.
Если между частями нужен разрыв страницы, используйте метод ВывестиГоризонтальныйРазделительСтраниц() между вызовами Вывести(). Это гарантирует, что вторая часть начнётся с нового листа.
Проверка результата и типичные ошибки
После склейки документ стоит проверить до отправки на печать или сохранения. Основные контрольные точки: высота итогового документа равна сумме высот частей, ширина колонок не «поплыла», объединённые ячейки на месте, расшифровка работает.
Как проверить результат
Равна сумме высот частей (с учётом отрезанных строк)
Меньше ожидаемой — часть данных потеряна при получении области
Совпадает с первой частью или задана явно
Колонки сжаты или растянуты относительно исходника
Объединения сохранились после Вывести()
Ячейки разъединены — вероятно, использовалось копирование текста
Разрывы страниц в ожидаемых местах
Часть таблицы уходит за поля — не настроены параметры страницы
Частые ошибки при склейке связаны с невнимательностью к диапазонам и к состоянию объектов.
Ещё одна тонкость: если документы формировались с разной локалью или форматами чисел, в итоговом документе могут визуально отличаться представления чисел и дат. Приводите форматы к единому виду на этапе формирования частей.
Альтернативы склейке табличных документов
Не всегда склейка готовых документов — оптимальное решение. Если оба отчёта строятся по данным одной информационной базы, часто проще объединить данные запросом (через ОБЪЕДИНИТЬ ВСЕ) и сформировать один документ из одного макета. Код становится короче, а результат предсказуемее.
Для отчётов на СКД вместо склейки используйте наборы данных-объединения или вывод нескольких отчётов в один через последовательные вызовы компоновщика с выводом в общий табличный документ. Это сохраняет расшифровку и настройки каждого отчёта.
Если итог нужен только как файл для передачи, допустимо сохранить оба документа в MXL или Excel и объединить их внешними средствами. Но для дальнейшей работы внутри 1С программная склейка областями остаётся основным инструментом.
Что важно запомнить
Вертикальная склейка — метод Вывести(), горизонтальная — Присоединить(). Работайте областями, чтобы сохранить форматирование. Контролируйте высоту итогового документа, ширину колонок и параметры печати. Для слияния по ключу используйте таблицы значений, а не ячейки.
Частые вопросы
Можно ли склеить два табличных документа без программирования?
Штатной интерактивной команды объединения табличных документов в 1С нет. Можно вручную выделить и скопировать содержимое одного открытого документа в другой через буфер обмена, но это работает только для небольших фрагментов и не подходит для автоматизации. Для регулярной задачи нужен программный способ.
Почему после Вывести() вторая часть отображается с искажённой шириной колонок?
Ширина колонок результирующего документа определяется первым выведенным фрагментом. Если у второго документа колонки имели другую ширину, она игнорируется. Решение — заранее задать одинаковую ширину колонок в обоих документах или явно установить её у итогового после склейки.
Сохранится ли расшифровка отчёта при склейке областями?
Значения расшифровки в ячейках при копировании областей переносятся, но если расшифровка ссылается на объект расшифровки компоновки данных, связь с ним в новом документе может не работать. Для отчётов СКД надёжнее выводить оба отчёта в один табличный документ через штатный процессор вывода.
Как склеить более двух документов?
Метод Вывести() можно вызывать в цикле сколько угодно раз: создайте итоговый документ и последовательно выводите в него каждый следующий. Следите только за суммарной высотой и при больших объёмах — за производительностью, так как табличный документ целиком хранится в памяти.
Что делать, если нужно объединить строки двух документов по совпадающему значению?
Табличный документ для этого не предназначен. Перенесите данные обоих документов в таблицы значений, выполните соединение по ключевой колонке (вручную циклом или через запрос к таблицам), а затем выведите результат в новый табличный документ по макету.
Можно ли вставить второй документ не в конец, а в середину первого?
Да. Получите из первого документа область строк после точки вставки, очистите эти строки методом Очистить() у соответствующей области, выведите вставляемый фрагмент, а затем выведите сохранённую «нижнюю» область обратно. Либо используйте метод ВставитьОбласть() для сдвига строк с освобождением места.