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