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