Как правильно выводить значения в объединенные ячейки табличного документа в 1С?

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

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

В чем заключается проблема и почему исчезают данные?

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

В результате выведенная ячейка оказывается пустой или содержит данные только первой строки. Причина кроется в строгом правиле работы платформы 1С с табличными документами:

При объединении ячеек значение объединенной области определяется содержимым ячейки с наименьшим адресом (верхняя левая ячейка диапазона).

Если итоговое значение было записано в нижнюю ячейку объединяемого диапазона (например, через ТабДок.ВысотаТаблицы), платформа просто скрывает его под верхней ячейкой, которая на момент вывода осталась пустой или содержала промежуточное значение.

Способ 1. Запись значения в первую ячейку диапазона после объединения

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


// Запоминаем начальную строку группы перед выводом
НачалоГруппы = ТабДок.ВысотаТаблицы + 1;

// Цикл вывода строк группы...
Пока Выборка.Следующий() Цикл
    // Выводим строки макета
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

НомерСтрПосле = ТабДок.ВысотаТаблицы;

Если НомерСтрПосле > НачалоГруппы Тогда
    // Формируем область для объединения в определенной колонке (например, колонка 5)
    ОбластьОбъединения = ТабДок.Область(НачалоГруппы, 5, НомерСтрПосле, 5);
    ОбластьОбъединения.Объединить();
    
    // Записываем итоговое значение в верхнюю ячейку диапазона
    ТабДок.Область(НачалоГруппы, 5).Текст = РассчитанноеЗначение;
КонецЕсли;

Также платформа 1С позволяет задавать значение напрямую свойству Текст или Значение самой объединенной области. В этом случае платформа автоматически применит значение к первой ячейке диапазона:


ОбластьОбъединения = ТабДок.Область(НачалоГруппы, Колонка, КонечнаяСтрока, Колонка);
ОбластьОбъединения.Объединить();
ОбластьОбъединения.Текст = ИтоговоеЗначение;

Способ 2. Предварительный расчет итогов

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

  1. Выполняем подсчет суммы или объединение строк на этапе обработки данных (например, в запросе или при обходе дерева значений).
  2. При выводе первой строки группы заполняем параметр ячейки рассчитанным значением.
  3. После вывода всех строк группы вызываем метод Объединить() для нужного диапазона строк. Значение первой ячейки автоматически сохраняется для всей объединенной области.

Важные особенности и рекомендации по производительности

При работе с объединенными ячейками в ТабличныйДокумент стоит учитывать несколько технических нюансов:

1. Потеря контекста параметров макета. После вывода области в табличный документ обращение к Параметры выведенной области становится недоступным. Работать с уже выведенными ячейками нужно через свойства Текст, Значение или Формат конкретной области табличного документа.

2. Производительность при больших объемах данных. Частые вызовы метода Объединить() в цикле при формировании отчетов на десятки тысяч строк существенно снижают скорость работы. Если отчет содержательный и большой, целесообразнее использовать визуальное псевдообъединение (управление нижними и верхними границами ячеек и их вертикальным выравниванием) или реализовывать отчет с помощью Системы компоновки данных (СКД), где объединение повторяющихся значений выполняется автоматически оптимизированными механизмами платформы.

3. Экспорт в Excel. При сохранении табличных документов с массовым объединением строк в файлы формата .xlsx числовые данные в объединенных ячейках могут восприниматься внешними табличными редакторами как текстовые. Для предотвращения проблем при экспорте явно задавайте свойство Формат для объединенных ячеек с числовыми данными.

← На главную