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