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

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

Анализ проблемы: почему запрос не поможет

На первый взгляд может показаться, что проблему можно решить на уровне запроса (используя СГРУППИРОВАТЬ ПО или ИТОГИ). Однако, как справедливо замечено в обсуждении, правка запроса не изменит визуальное представление в табличном документе, если используется «ручной» вывод областей макета. Запрос возвращает плоскую таблицу данных, а за визуальное объединение отвечает объект ТабличныйДокумент и его методы управления областями.

Метод 1: Программное объединение с расчетом координат

Рассмотрим основной и самый гибкий способ решения задачи — использование метода Объединить(). Суть метода заключается в том, чтобы вычислить начальную и конечную строки для каждого блока данных и вызвать команду объединения для нужного диапазона колонок. Разберем этот алгоритм по шагам.

Шаг 1: Фиксация начальной позиции

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


// Перед циклом вывода детальных записей
НомерНачальнойСтроки = ТабДок.ВысотаТаблицы + 1;

Шаг 2: Вывод данных

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

Шаг 3: Объединение после завершения блока

Когда цикл по детальным записям одного критерия завершен, мы вычисляем конечную строку и выполняем объединение области.


// После завершения цикла по деталям одного критерия
НомерКонечнойСтроки = ТабДок.ВысотаТаблицы;

// Проверяем, что строк больше одной, иначе объединение не требуется
Если НомерКонечнойСтроки > НомерНачальнойСтроки Тогда
    // Получаем область: Область(Верх, Лево, Низ, Право)
    ОбластьДляОбъединения = ТабДок.Область(НомерНачальнойСтроки, НомерКолонкиКритерия, НомерКонечнойСтроки, НомерКолонкиКритерия);
    ОбластьДляОбъединения.Объединить();
КонецЕсли;

Особенности оформления объединенных ячеек

Проанализируем важные нюансы, которые влияют на визуальное качество отчета при использовании метода Объединить():

  1. Приоритет оформления: При объединении нескольких ячеек итоговая большая ячейка всегда принимает свойства (шрифт, цвет фона, рамки) верхней левой ячейки диапазона. Убедитесь, что в макете именно первая ячейка настроена правильно.
  2. Выравнивание: Для объединенных ячеек рекомендуется устанавливать ВертикальноеПоложение = Центр. Это позволит тексту критерия находиться посередине относительно всех детальных строк справа.
  3. Перенос текста: Если текст критерия может быть длинным, обязательно установите свойство РазмещениеТекста = Переносить. В противном случае, даже в большой объединенной ячейке, текст может обрезаться по горизонтали.

Метод 2: Подавление повторяющихся значений (визуальное объединение)

Иногда вместо физического объединения ячеек удобнее использовать прием «скрытия дублей». Это особенно полезно, если отчет в дальнейшем планируется выгружать в Excel для фильтрации данных (объединенные ячейки в Excel часто мешают корректной работе фильтров). Для автоматизации последующей обработки таких файлов или переноса информации в другие системы можно использовать RPA-платформу для автоматизации работы с документами.

Алгоритм действий следующий:

  1. Заводим переменную ПредыдущееЗначениеКритерия.
  2. При выводе очередной строки сравниваем текущее значение с предыдущим.
  3. Если значения совпадают, мы просто не заполняем ячейку критерия в этой строке (оставляем пустой текст).
  4. Для создания эффекта «единого пространства» в макете у ячеек критерия отключаем верхнюю границу (оставляем только боковые). Таким образом, визуально строки будут выглядеть как одна область без горизонтальных разделителей.

Работа с СКД при использовании своего макета

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

Посмотрим на параметр «Расположение группировок» в настройках отчета (вкладка «Другие настройки»). Установка значения «Вместе» заставляет систему автоматически объединять ячейки родительских группировок по вертикали. Если ваш отчет строится на базе СКД, рекомендуем использовать именно этот механизм, так как он автоматически учитывает высоту строк и корректно обрабатывает иерархию данных без написания кода. В ситуациях, когда отчеты используются для выверки данных после доработок учета, можно автоматически сравнивать бухгалтерские проводки между базами для поиска расхождений.

Рекомендации по расчету высоты строк

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

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

← На главную