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

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

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

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

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

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

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

Табличный документ в 1С — это объект встроенного языка, который представляет собой сетку ячеек с форматированием, объединениями, картинками и параметрами расшифровки. Его можно создать программно, заполнить из макета, сохранить в файл формата MXL, Excel, PDF, HTML или ODS и прочитать обратно.

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

Объединение документов методом Вывести()

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

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

Для Каждого Документ Из МассивДокументов Цикл

Область = Документ.ПолучитьОбласть(1, 1,

Документ.ВысотаТаблицы, Документ.ШиринаТаблицы);

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

// Разрыв страницы между документами при печати

ИтоговыйДокумент.ВывестиГоризонтальныйРазделительСтраниц();

КонецЦикла;

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

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

Объединение документов из файлов MXL

Если исходные документы сохранены на диске в формате MXL (родной формат табличных документов 1С), их можно прочитать в объекты и объединить тем же способом. Метод Прочитать() загружает файл в табличный документ.

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

Для Каждого ИмяФайла Из СписокФайлов Цикл

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

Временный.Прочитать(ИмяФайла);

Область = Временный.ПолучитьОбласть(1, 1,

Временный.ВысотаТаблицы, Временный.ШиринаТаблицы);

Итоговый.Вывести(Область);

КонецЦикла;

Итоговый.Записать("C:\Temp\Объединенный.mxl");

Учтите, что Прочитать() на клиенте в тонком и веб-клиенте требует передачи файла на сервер или использования асинхронных методов (НачатьПомещениеФайла). В серверной процедуре или внешней обработке на сервере чтение работает напрямую.

Объединение документов Excel из 1С

Формат MXL платформа объединяет нативно, а вот книги Excel — нет: при чтении файла Excel в табличный документ теряются формулы, часть форматирования и структура листов. Если нужно собрать несколько XLSX в один файл с сохранением листов, надёжнее работать через COM-объект Excel.Application (только на Windows с установленным Excel) или через сторонние библиотеки.

Эксель = Новый COMОбъект("Excel.Application");

ИтоговаяКнига = Эксель.Workbooks.Add();

Для Каждого ИмяФайла Из СписокФайлов Цикл

Книга = Эксель.Workbooks.Open(ИмяФайла);

Для Каждого Лист Из Книга.Sheets Цикл

Лист.Copy(, ИтоговаяКнига.Sheets(ИтоговаяКнига.Sheets.Count));

КонецЦикла;

Книга.Close(Ложь);

КонецЦикла;

ИтоговаяКнига.SaveAs("C:\Temp\Итог.xlsx");

ИтоговаяКнига.Close(Ложь);

Эксель.Quit();

Альтернатива без COM — сохранить каждый табличный документ в Excel и объединять файлы уже средствами самого Excel вручную или макросом. Это разумно при разовой задаче: писать и отлаживать COM-код ради одного объединения нерационально.

Ручное объединение без программирования

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

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

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

Вывести() программно

Подходит для объектов и MXL-файлов, полный контроль порядка и разделителей; требует написания кода

Ручное копирование

Быстро для 2–3 документов без кода; не масштабируется и чревато ошибками

COM с Excel

Сохраняет листы и формулы XLSX; только Windows с установленным Excel, риск зависших процессов

Сохранение в Excel + сборка в Excel

Без программирования в 1С; ручная работа переносится в Excel

Проверка результата и типичные проблемы

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

Частая проблема — «съехавшая» ширина колонок: если у исходных документов разная ширина колонок, итоговый документ возьмёт настройки первой выведенной области, и последующие документы могут отображаться криво. Решение — приводить документы к одинаковой ширине макета заранее или выводить каждый документ на отдельный лист/страницу с собственными настройками печати.

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

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

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

Равна сумме высот исходных документов

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

Строк меньше — часть данных не выведена или перезаписана

Форматирование
Норма

Шрифты, границы и объединения совпадают с исходными

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

Сбились ширины колонок, пропали объединённые ячейки

Печать
Норма

Каждый исходный документ начинается с новой страницы

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

Документы печатаются внахлёст или с пустыми страницами

Типичные ошибки
01
Использование ВставитьОбласть() вместо Вывести() — вставка в неправильную позицию затирает уже выведенные данные
02
Объединение документов с разной шириной колонок без приведения макетов — результат отображается криво
03
Чтение MXL на тонком клиенте синхронным Прочитать() — ошибка вызова, нужен серверный вызов или асинхронные методы
04
Попытка объединить XLSX через ТабличныйДокумент — теряются формулы и структура листов
05
Отсутствие Эксель.Quit() в обработчике ошибок — зависший процесс блокирует файлы

FAQ

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

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

Сохраняются ли картинки при объединении через Вывести()?

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

Как объединить документы, сформированные отчётом СКД за разные периоды?

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

Что делать, если объединённый документ не помещается в память?

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

Можно ли объединить табличные документы на веб-клиенте?

Да, само объединение методом Вывести() работает везде, так как выполняется на сервере. Ограничение касается чтения файлов: на веб-клиенте файл сначала помещается во временное хранилище через НачатьПомещениеФайла, а чтение Прочитать() выполняется в серверной процедуре.

Итог

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

Объединение табличных документов в 1С делается через ПолучитьОбласть() и Вывести(): это работает для объектов и MXL-файлов. Для Excel-файлов используйте COM или сборку средствами Excel. Контролируйте ширину колонок, разделители страниц и освобождение COM-объектов.