Рассмотрим достаточно распространенную задачу при разработке интерфейсов в 1С: вывод дополнительной информации прямо в строке группировки динамического списка. Часто пользователи просят отобразить итог по количеству или сумме в узле дерева, например, в формате "Наименование номенклатуры (Количество)". Проанализируем ситуацию и разберем возможные способы реализации этого механизма.
Прежде чем пытаться решить задачу «в лоб», давайте подробно разберем архитектурные ограничения динамических списков в платформе 1С. Динамический список спроектирован для быстрого, порционного вывода данных и не предназначен для сложной аналитики.
ИТОГИ ... ПО .... Платформа требует, чтобы запрос всегда возвращал исключительно плоскую выборку данных.ПриПолученииДанныхНаСервере не получится. В этот обработчик третьим параметром передается коллекция выводимых строк, но в ней содержатся только данные детальных записей. Строки группировок из этой коллекции платформой исключены.ПутьКДаннымПодвала предназначено только для вывода общих итогов в самом низу таблицы и абсолютно не работает для промежуточных уровней иерархии.Выясним, какие существуют обходные пути, если стандартные механизмы динамического списка не позволяют реализовать требуемый функционал.
Посмотрим на первый вариант решения, который позволяет остаться в рамках использования динамического списка. Сумму или общее количество можно заранее вычислить в тексте произвольного запроса.
Для этого нам потребуется написать вложенный запрос с группировкой по нужному измерению (в нашем случае — по Номенклатуре). Затем этот вложенный запрос через левое соединение связывается с основной выборкой. Полученное рассчитанное значение выводится в отдельную колонку списка.
Важный нюанс: в саму строку узла визуальной группировки этот показатель не попадет, но пользователь сможет видеть итог в соответствующей отдельной колонке на уровне детальных записей, что часто удовлетворяет бизнес-требованиям.
Разберем ситуацию, когда требование заказчика жесткое, и итог или модифицированный текст (в виде «Номенклатура (Количество)») должен выводиться именно в самом узле группировки. В таком случае от использования динамического списка придется полностью отказаться.
Вместо списка на форму выводится таблица с типом ДеревоЗначений. Мы программно заполняем и обходим это дерево при открытии формы или при обновлении данных. Итоги, группировки и конкатенацию строк в таком случае разработчик рассчитывает и форматирует полностью самостоятельно с помощью встроенного языка 1С. Это дает максимальную гибкость, но лишает преимуществ порционного считывания данных, поэтому подходит только для небольших объемов информации.
Если пользователю важнее анализировать итоговые цифры в привязке к номенклатуре, а не просто просматривать список документов, интерфейс списка целесообразно заменить отчетом на базе Системы Компоновки Данных (СКД).
В СКД штатно и быстро рассчитываются итоги по любым группировкам. А через вычисляемые поля, пользовательские выражения или макеты компоновки данных можно задать абсолютно любой формат вывода строки. Вы сможете легко настроить конкатенацию наименования и количества, получив красивый вывод вида "Товар А (150 шт.)" прямо в группировке отчета.
Подводя итог, можно сказать, что выбор решения зависит от конкретных бизнес-требований: если нужен именно быстрый список — используем левое соединение с подзапросом, если важна иерархия с кастомными строками — переходим на ДеревоЗначений, а если во главе угла стоит аналитика и итоги — реализуем задачу через отчет на СКД.