При разработке отчетов в системе 1С:Предприятие часто возникает задача кастомизации внешнего вида табличного документа. Типичная ситуация: в левой колонке выводится некий ключевой критерий (группировка), а в правых колонках — детальные данные или показатели (например, проценты), относящиеся к этому критерию. По умолчанию при выводе строк через цикл критерий дублируется в каждой строке, что делает отчет трудночитаемым. В этой статье мы разберем, как сделать так, чтобы слева выводилась только одна объединенная ячейка для каждого критерия, в то время как справа данные оставались детализированными.
На первый взгляд может показаться, что проблему можно решить на уровне запроса (используя СГРУППИРОВАТЬ ПО или ИТОГИ). Однако, как справедливо замечено в обсуждении, правка запроса не изменит визуальное представление в табличном документе, если используется «ручной» вывод областей макета. Запрос возвращает плоскую таблицу данных, а за визуальное объединение отвечает объект ТабличныйДокумент и его методы управления областями.
Рассмотрим основной и самый гибкий способ решения задачи — использование метода Объединить(). Суть метода заключается в том, чтобы вычислить начальную и конечную строки для каждого блока данных и вызвать команду объединения для нужного диапазона колонок. Разберем этот алгоритм по шагам.
Шаг 1: Фиксация начальной позиции
Перед тем как начать вывод детальных записей по конкретному критерию, нам необходимо запомнить, с какой строки начинается этот блок. В объекте ТабличныйДокумент текущую высоту можно получить через свойство ВысотаТаблицы.
// Перед циклом вывода детальных записей
НомерНачальнойСтроки = ТабДок.ВысотаТаблицы + 1;
Шаг 2: Вывод данных
Далее мы запускаем цикл по детальным записям нашего критерия. В каждой итерации мы выводим область макета, заполняя её данными (процентами, суммами и т.д.). Обратите внимание, что значение критерия в левой колонке можно выводить только в первой строке блока или во всех строках (при объединении это не имеет значения, так как останется только значение верхней левой ячейки).
Шаг 3: Объединение после завершения блока
Когда цикл по детальным записям одного критерия завершен, мы вычисляем конечную строку и выполняем объединение области.
// После завершения цикла по деталям одного критерия
НомерКонечнойСтроки = ТабДок.ВысотаТаблицы;
// Проверяем, что строк больше одной, иначе объединение не требуется
Если НомерКонечнойСтроки > НомерНачальнойСтроки Тогда
// Получаем область: Область(Верх, Лево, Низ, Право)
ОбластьДляОбъединения = ТабДок.Область(НомерНачальнойСтроки, НомерКолонкиКритерия, НомерКонечнойСтроки, НомерКолонкиКритерия);
ОбластьДляОбъединения.Объединить();
КонецЕсли;
Проанализируем важные нюансы, которые влияют на визуальное качество отчета при использовании метода Объединить():
ВертикальноеПоложение = Центр. Это позволит тексту критерия находиться посередине относительно всех детальных строк справа.РазмещениеТекста = Переносить. В противном случае, даже в большой объединенной ячейке, текст может обрезаться по горизонтали.Иногда вместо физического объединения ячеек удобнее использовать прием «скрытия дублей». Это особенно полезно, если отчет в дальнейшем планируется выгружать в Excel для фильтрации данных (объединенные ячейки в Excel часто мешают корректной работе фильтров). Для автоматизации последующей обработки таких файлов или переноса информации в другие системы можно использовать RPA-платформу для автоматизации работы с документами.
Алгоритм действий следующий:
ПредыдущееЗначениеКритерия.Выясним причину, по которой многие разработчики избегают программного объединения. В Системе Компоновки Данных (СКД) этот функционал реализован штатно. Даже если вы используете «Свой макет» внутри СКД, вы можете управлять объединением через настройки группировок.
Посмотрим на параметр «Расположение группировок» в настройках отчета (вкладка «Другие настройки»). Установка значения «Вместе» заставляет систему автоматически объединять ячейки родительских группировок по вертикали. Если ваш отчет строится на базе СКД, рекомендуем использовать именно этот механизм, так как он автоматически учитывает высоту строк и корректно обрабатывает иерархию данных без написания кода. В ситуациях, когда отчеты используются для выверки данных после доработок учета, можно автоматически сравнивать бухгалтерские проводки между базами для поиска расхождений.
При программном формировании отчета важно помнить про автоматический расчет высоты. Если в объединенной ячейке много текста, свойство АвтоВысотаСтроки может отработать не совсем корректно для всего диапазона. В сложных случаях мы рекомендуем:
Показать(), предварительно проверив заполнение.Таким образом, мы разобрали основные технические приемы управления структурой табличного документа. Выбор между методом Объединить() и визуальным скрытием дублей зависит от конечной цели: если важна красота печатной формы — используйте объединение; если важна функциональность при выгрузке в Excel — используйте подавление повторов.