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