При разработке печатных форм и отчетов в 1С часто возникает задача объединения ячеек для визуального группирования данных. Однако новички часто сталкиваются с тем, что метод Объединить, вызванный у области макета, не дает никакого результата в итоговом документе, либо приводит к появлению «белых областей». Давайте разберем, почему это происходит и как правильно организовать процесс объединения ячеек.
Основная причина проблемы заключается в том, что разработчики пытаются применить метод Объединить к объекту ОбластьЯчеекТабличногоДокумента, который принадлежит макету (шаблону), до того, как эта область была выведена в результирующий документ.
Когда мы вызываем метод ТабДок.Вывести(Область), платформа создает копию области шаблона в итоговом табличном документе. Все манипуляции, выполненные с шаблоном ранее, зачастую игнорируются или перезаписываются при выводе.
Золотое правило: объединение ячеек всегда должно происходить в том табличном документе, который уже содержит выведенные строки.
Чтобы объединение сработало корректно, необходимо сначала вывести область в ТабличныйДокумент, а затем обратиться к диапазону ячеек уже внутри этого документа. Рассмотрим это на примере:
// Неправильно:
// ОбластьМакета.Объединить();
// ТабДок.Вывести(ОбластьМакета);
// Правильно:
ТабДок.Вывести(ОбластьМакета);
НомерСтрокиКонец = ТабДок.ВысотаТаблицы;
ТабДок.Область(НомерСтрокиНачало, 3, НомерСтрокиКонец, 5).Объединить();
Часто требуется объединить ячейки в колонке, если значения в них совпадают (например, при выводе списка критериев с несколькими строками параметров внутри каждого). Для этого используем алгоритм «контроля изменений» значения в цикле.
Разберем по шагам, как реализовать такую логику:
Посмотрим на пример реализации такого кода:
ИмяПредыдущегоКритерия = \"\";
НомерНачалаОбъединения = 1;
ЭтоПерваяИтерация = Истина;
Пока ВыборкаКритерий.Следующий() Цикл
Если ИмяПредыдущегоКритерия <> ВыборкаКритерий.ИмяКритерия Тогда
Если НЕ ЭтоПерваяИтерация Тогда
// Объединяем ячейки накопленного диапазона
ТабДок.Область(НомерНачалаОбъединения, 2, ТабДок.ВысотаТаблицы, 2).Объединить();
КонецЕсли;
ИмяПредыдущегоКритерия = ВыборкаКритерий.ИмяКритерия;
НомерНачалаОбъединения = ТабДок.ВысотаТаблицы + 1;
ЭтоПерваяИтерация = Ложь;
КонецЕсли;
// ... логика заполнения параметров и вывод строки ...
ТабДок.Вывести(ОбластьКритерии);
КонецЦикла;
// Объединение последней группы строк после завершения цикла
ТабДок.Область(НомерНачалаОбъединения, 2, ТабДок.ВысотаТаблицы, 2).Объединить();
ОбъединитьПри работе с объединением важно помнить о следующих технических ограничениях:
Текст уже после выполнения метода Объединить.Рекомендуем при разработке сложных печатных форм разделять логику заполнения документа и логику оформления. Сначала выводите все необходимые данные, а затем отдельным блоком кода выполняйте постобработку документа: объединение ячеек, установку шрифтов, цветов и границ. Это значительно упрощает отладку, так как вы сможете увидеть состояние документа в отладчике до того, как примените к нему сложные операции форматирования.