При формировании отчетов в «1С:Предприятие» часто возникает визуальная задача: объединить повторяющиеся значения в колонках по вертикали, чтобы отчет выглядел более структурированным и читаемым. В платформе 8.1 и более поздних версиях это можно сделать несколькими способами. Проанализируем ситуацию и разберем наиболее эффективные методы реализации этой задачи.
Это самый универсальный метод, который подходит для «обычных» отчетов, где вывод данных осуществляется вручную или через построитель отчета. Суть метода заключается в том, что мы сначала полностью формируем ТабличныйДокумент, а затем проходим по нему программным циклом, сравнивая значения в соседних строках.
Рассмотрим пошаговый алгоритм реализации этого метода:
Объединить() для найденного диапазона.Посмотрим на пример кода, реализующий данную логику:
Процедура ОбъединитьПовторяющиесяЗначения(ТабДок, НомерКолонки)
КоличествоСтрок = ТабДок.ВысотаТаблицы;
ВерхняяСтрока = 0;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ТекЗначение = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
Если НомерСтроки < КоличествоСтрок Тогда
СледЗначение = ТабДок.Область(НомерСтроки + 1, НомерКолонки).Текст;
Иначе
СледЗначение = "---КОНЕЦ_ТАБЛИЦЫ---";
КонецЕсли;
Если ТекЗначение = СледЗначение И ТекЗначение <> "" Тогда
Если ВерхняяСтрока = 0 Тогда
ВерхняяСтрока = НомерСтроки;
КонецЕсли;
Иначе
Если ВерхняяСтрока <> 0 Тогда
// Выделяем область для объединения
ОбластьОбъединения = ТабДок.Область(ВерхняяСтрока, НомерКолонки, НомерСтроки, НомерКолонки);
ОбластьОбъединения.Объединить();
// Устанавливаем красивое выравнивание по центру
ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ВерхняяСтрока = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный нюанс: при выполнении объединения программно, текст остается только в первой ячейке объединенной области. Поэтому при последующем обращении к нижним ячейкам через свойство Текст, они могут вернуть пустую строку. Именно поэтому алгоритм должен сначала вычислить границы, а потом вызывать Объединить().
Если вы работаете в 8.1 или 8.3 и ваш отчет строится на СКД, задачу можно решить без написания кода. Платформа 1С имеет встроенный механизм группировки и объединения ячеек.
Разберем, как это настроить:
Этот метод предпочтительнее, так как он работает быстрее программного обхода и корректно обрабатывает иерархические записи.
Выясним причину, по которой отчеты с большим количеством строк могут «тормозить» при программном объединении. Каждое обращение к методу Объединить() заставляет ТабличныйДокумент пересчитывать свою структуру. Если таких вызовов тысячи, время формирования отчета значительно увеличивается.
Для оптимизации профессиональные разработчики рекомендуют:
Массив или ТаблицуЗначений.Верх и Низ для областей.Проанализируем пример оптимизированного подхода, где мы сначала собираем структуру объединений:
// Пример структуры для хранения границ:
// СтруктураОбъединения = Новый Структура("Верх, Низ", 5, 12);
СписокОбластей = Новый Массив;
// ... (заполнение списка логикой сравнения) ...
// Итоговый проход по уже вычисленным координатам
Для Каждого Границы Из СписокОбластей Цикл
ТабДок.Область(Границы.Верх, Кол, Границы.Низ, Кол).Объединить();
КонецЦикла;
Рассмотрим ситуацию, когда отчет с объединенными ячейками нужно сохранить в формат Excel. Пользователи часто жалуются, что при попытке сортировки в Excel объединенные ячейки вызывают ошибки или данные «теряются».
Чтобы избежать проблем при экспорте:
ВертикальноеПоложение установлено в значение Центр.РазмещениеТекста = Переносить, если текст длинный..xls и .xlsx.Мы рассмотрели несколько способов реализации вертикальной группировки в отчетах. Для простых отчетов в режиме «Обычные формы» идеально подходит постобработка через метод Объединить(). Для современных отчетов на управляемых формах лучшим выбором будет использование встроенных возможностей СКД, что обеспечит максимальную производительность и корректность отображения данных.