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