Как объединить несколько табличных документов 1С в один, сохранив при этом форматирование?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Задача объединения нескольких печатных форм в один табличный документ часто встречается при разработке систем пакетной печати. Основная сложность заключается в том, что в 1С табличный документ глобально привязан к «сетке» колонок. Метод СоздатьФорматСтрок создает так называемые «подсетки», и при простом копировании областей 1С пытается привести все части документа к единой сетке родительского объекта, из-за чего верстка неизбежно «едет».

Рассмотрим пошагово, как решить эту проблему, используя механизм сериализации для анализа структуры документа.

Разбор архитектуры табличного документа

Когда вы используете СоздатьФорматСтрок, табличный документ перестает быть однородным. Чтобы объединить такие фрагменты, нам необходимо найти границы строк, внутри которых применен определенный формат колонок. Прямого свойства, указывающего на наличие «индивидуального формата», у области нет. Однако мы можем проанализировать структуру документа через СериализаторXDTO.

Решение проблемы через анализ структуры (XDTO)

Суть метода заключается в следующем: мы «препарируем» присоединяемый документ, определяем интервалы строк, в которых используется одинаковый формат колонок (columnsID), и переносим их в основной документ по частям.

Рассмотрим процедуру, которая корректно выполняет эту задачу:


Процедура ПрисоединитьТабличныйДокумент(ОсновнойДокумент, Знач ПрисоединяемыйДокумент) Экспорт
    ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ПрисоединяемыйДокумент);
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("НачальнаяСтрока", Новый ОписаниеТипов("Число"));
    ТЗ.Колонки.Добавить("КонечнаяСтрока", Новый ОписаниеТипов("Число"));
    
    IDКолонки = "Пусто";
    НачальнаяСтрока = 0;
    
    Для Каждого Строка из ОбъектXDTO.rowsItem Цикл
        Если НЕ Строка.row.columnsID = IDКолонки Тогда
            Если НЕ НачальнаяСтрока = 0 Тогда
                СтрокаТЗ = ТЗ.Добавить();
                СтрокаТЗ.НачальнаяСтрока = НачальнаяСтрока;
                СтрокаТЗ.КонечнаяСтрока = Строка.index;
            КонецЕсли;
            НачальнаяСтрока = Строка.index + 1;
            IDКолонки = Строка.row.columnsID;
        КонецЕсли;
    КонецЦикла;
    
    // Добавляем последнюю область
    СтрокаТЗ = ТЗ.Добавить();
    СтрокаТЗ.НачальнаяСтрока = НачальнаяСтрока;
    СтрокаТЗ.КонечнаяСтрока = ОбъектXDTO.rowsItem.Count();
    
    ТЗ.Свернуть("НачальнаяСтрока, КонечнаяСтрока");
    ТЗ.Сортировать("НачальнаяСтрока Возр");
    
    // Построчный перенос областей
    Для Каждого СтрокаТЗ из ТЗ Цикл
        ВставляемаяОбласть = ПрисоединяемыйДокумент.Область(СтрокаТЗ.НачальнаяСтрока, , СтрокаТЗ.КонечнаяСтрока);
        ВставляемаяОбласть.СоздатьФорматСтрок();
        
        ОбластьПриемник = ОсновнойДокумент.Область(
            ОсновнойДокумент.ВысотаТаблицы + 1, , 
            ОсновнойДокумент.ВысотаТаблицы + 1 + СтрокаТЗ.КонечнаяСтрока - СтрокаТЗ.НачальнаяСтрока);
            
        ОсновнойДокумент.ВставитьОбласть(ВставляемаяОбласть, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЦикла;
КонецПроцедуры

Почему это работает?

  1. Сериализация: Мы получаем доступ к внутренним данным документа, где каждый ряд строк имеет свой идентификатор формата columnsID.
  2. Группировка: Мы создаем таблицу соответствия, которая разбивает документ на логические блоки с идентичной структурой колонок.
  3. Поэтапная вставка: Вместо попытки «влить» один большой документ в другой, мы копируем их поблочно. Каждый блок при вставке сохраняет свои настройки форматирования благодаря принудительному вызову СоздатьФорматСтрок() для каждой конкретной области.

Альтернативные стратегии

Если задача объединения носит исключительно печатный характер (экономия бумаги), а не необходимость дальнейшего редактирования в 1С, рассмотрите следующие подходы:

При выборе метода всегда ориентируйтесь на конечную цель. Если нужно именно «поправить» документ в 1С перед печатью — используйте предложенный алгоритм с СериализаторXDTO. Если же документ предназначен только для отправки на принтер — сохранение в PDF будет гораздо менее ресурсоемким и более стабильным решением.

← На главную