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

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

При разработке интерфейсов на обычных формах 1С (платформы 8.2 и 8.3 в режиме совместимости) часто возникает задача сделать отображение данных более компактным и структурированным. Стандартная табличная часть представляет собой «плоский» список, но иногда требуется имитировать поведение Excel: группировать данные, объединять ячейки или выводить информацию в несколько строк для одной записи. Рассмотрим, как добиться такого эффекта, не раздувая количество строк в самой табличной части и сохраняя удобство работы для пользователя.

Решение 1: Настройка многострочного режима колонок и управление видимостью

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

Для начала разберем настройки положения колонок в конфигураторе. Каждая колонка табличного поля имеет свойство Положение. Чтобы добиться эффекта группировки, выполним следующие шаги:

  1. Выберем первую колонку (например, «Комитент») и установим ей свойство Положение в значение Новая колонка.
  2. Для второй колонки (например, «Количество»), которую мы хотим видеть под первой, установим Положение — На следующей строке.
  3. Для всех последующих колонок в этом ряду установим Положение — В той же колонке.

После такой настройки строка таблицы визуально станет «двухэтажной». Однако возникнет проблема: если в некоторых строках «Комитент» не заполнен, там останется пустое пространство. Чтобы это исправить, воспользуемся событием ПриВыводеСтроки. Разберем пример кода:


Процедура ТабличнаяЧастьПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Если значение в колонке Комитент пустое или не соответствует условию группировки
    Если Не ЗначениеЗаполнено(ДанныеСтроки.Комитент) Тогда
        // Скрываем ячейку, чтобы она не занимала место и не путала пользователя
        ОформлениеСтроки.Ячейки.Комитент.Видимость = Ложь;
    КонецЕсли;

КонецПроцедуры

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

Решение 2: Использование Дерева значений для иерархической структуры

Если задача требует настоящей иерархии с кнопками развертывания и сворачивания (плюсиками), как в структуре Excel, то стандартная табличная часть документа нам не подойдет. В этом случае мы рассмотрим использование Дерева значений.

Алгоритм работы будет следующим:

  1. Создадим на форме вспомогательный реквизит с типом ДеревоЗначений.
  2. В табличном поле на форме укажем это дерево в качестве источника данных и включим свойство Отображать иерархию.
  3. Программное заполнение: При открытии формы нам потребуется написать процедуру, которая преобразует «плоскую» табличную часть документа в иерархическое дерево.
  4. Обратная синхронизация: Это самый важный этап. Поскольку данные хранятся в дереве на форме, а документ «знает» только о своей табличной части, перед записью документа необходимо программно выгрузить данные из дерева обратно в табличную часть.

Посмотрим на пример заполнения дерева:


// Пример преобразования ТЧ в дерево при открытии
Процедура ЗаполнитьДеревоНаФорме()
    ДеревоОбъект = РеквизитФормыВЗначение("ДеревоНаФорме");
    ДеревоОбъект.Строки.Очистить();
    
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        // Логика поиска или создания родительской строки (группировки)
        СтрокаГруппы = НайтиИлиСоздатьРодителя(ДеревоОбъект, СтрокаТЧ.Комитент);
        НоваяСтрока = СтрокаГруппы.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
    КонецЦикла;
    
    ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоНаФорме");
КонецПроцедуры

Решение 3: Оптимизация через ПриПолученииДанных

Выясним причину, по которой использование ПриВыводеСтроки может быть неоптимальным. Это событие вызывается для каждой строки в отдельности при любой отрисовке. Если в вашем документе сотни или тысячи строк, интерфейс начнет «подтормаживать» при прокрутке.

Рассмотрим более профессиональный подход — использование события ПриПолученииДанных. Оно позволяет обрабатывать сразу весь массив строк, видимых в данный момент на экране. Это значительно ускоряет работу формы.


Процедура ТабличнаяЧастьПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Для Каждого Оформление Из ОформленияСтрок Цикл
        Данные = Оформление.ДанныеСтроки;
        Если Данные <> Неопределено Тогда
            // Управляем видимостью или цветом текста пакетно
            Если ПустаяСтрока(Данные.Комитент) Тогда
                Оформление.Ячейки.Комитент.УстановитьТекст("");
                // Можно также изменить цвет фона, чтобы имитировать объединение
                Оформление.Ячейки.Комитент.ЦветФона = ЦветаСтиля.ЦветФонаГруппировки;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Решение 4: Поле табличного документа для сложного дизайна

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

Это не таблица в привычном понимании, а фактически «отчет», размещенный прямо на форме, в котором разрешено редактирование ячеек.

Преимущества:

Сложности: Вам придется вручную обрабатывать события ПриИзмененииСодержимогоОбласти или двойной клик, чтобы записывать введенные пользователем данные обратно в объект документа. Это решение трудозатратно, но дает 100% визуальное сходство с Excel.

Эмуляция объединения ячеек (скрытие повторов)

Чтобы таблица выглядела «чисто», как сводная таблица Excel, часто применяют прием скрытия повторяющихся значений. Если в нескольких строках подряд идет один и тот же Комитент, мы можем выводить его название только в первой строке группы.

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

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

← На главную