Приветствуем вас! При разработке отчетов на базе Системы компоновки данных (СКД) в 1С перед программистами нередко встает задача компактного вывода детальных записей. Классический пример — необходимость вывести в печатной форме список заказанных товаров или материалов в одну строку, через запятую, с указанием их количества. Например, вместо стандартного вертикального списка (таблицы) нам нужно получить компактную строку: «Хлеб - 4, Молоко - 6, Творог - 10». Для решения таких задач подойдёт пример сбора значений колонки из нескольких строк в СКД.
В этой статье мы подробно разберем, как реализовать такую логику стандартными средствами СКД без написания сложного программного кода на стороне модуля. Мы изучим работу функции СоединитьСтроки(), узнаем, как правильно передавать в нее коллекции данных, а также рассмотрим продвинутые сценарии: группировку с суммированием количества, сортировку списка по алфавиту и правильное форматирование чисел для избавления от лишних нулей.
Для решения нашей задачи мы будем использовать встроенную функцию языка выражений СКД — СоединитьСтроки(). Ее базовый синтаксис выглядит следующим образом:
СоединитьСтроки(Значение, РазделительЭлементов, РазделительКолонок)
Если мы просто попытаемся объединить поле номенклатуры, СКД выдаст нам список названий. Но как привязать к каждому названию соответствующее количество? Для этого нам нужно передать в функцию не одно поле, а целую таблицу значений. В СКД для этого существует системная функция ТаблицаЗначений().
Рассмотрим по шагам базовое выражение, которое мы можем прописать в ресурсах нашего отчета:
СоединитьСтроки(ТаблицаЗначений(Номенклатура, Количество), ", ", " - ")
Выясним, как работает это выражение:
ТаблицаЗначений(Номенклатура, Количество) собирает все детальные записи текущей группировки во временную таблицу с двумя колонками.СоединитьСтроки() обходит эту таблицу." - ") — это разделитель колонок. Он связывает значение из первой колонки (Номенклатура) со значением из второй колонки (Количество).", ") — это разделитель строк. Он отделяет одну получившуюся пару от другой.На практике детальные записи часто содержат дублирующиеся позиции. Например, если в одном документе или у одного контрагента было несколько отгрузок одного и того же товара, простое объединение через ТаблицаЗначений выдаст нам строку вида: «Хлеб - 2, Хлеб - 2, Молоко - 6». Это выглядит неаккуратно и неинформативно.
Для того чтобы сгруппировать одинаковую номенклатуру и сложить ее количество, мы воспользуемся мощной функцией СКД — ВычислитьВыражениеСГруппировкойТаблицаЗначений(). Проанализируем следующее выражение:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), ", ", " - ")
Рассмотрим подробнее, что происходит в данном случае:
"Номенклатура, Сумма(Количество)" определяет структуру колонок результирующей таблицы. Мы указываем, что количество должно суммироваться."Номенклатура" указывает поле, по которому будет производиться группировка данных.СоединитьСтроки() превращает эту таблицу в красивую строку.Чтобы итоговая строка выглядела профессионально, элементы в ней должны быть упорядочены, например, по алфавиту. Для этого в СКД применяется функция Упорядочить().
Посмотрим на пример выражения, совмещающего группировку, суммирование и сортировку по возрастанию наименования номенклатуры:
СоединитьСтроки(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), "Номенклатура Возр"), ", ", " - ")
Если же суммировать количество не требуется, а нужно просто вывести уникальные записи по алфавиту, выражение упростится:
СоединитьСтроки(Упорядочить(Свернуть(ТаблицаЗначений(Номенклатура, Количество)), "Номенклатура Возр"), ", ", " - ")
Здесь функция Свернуть() удаляет полные дубликаты строк перед сортировкой и склейкой.
В базах данных 1С количество часто хранится с точностью до трех знаков после запятой (например, 4.000). Если вывести это значение напрямую, мы получим некрасивую строку: «Хлеб - 4.000, Молоко - 6.000». Чтобы исправить это, применим функцию Формат().
Давайте разберем, как применить форматирование внутри наших выражений:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Формат(Сумма(Количество), ""ЧДЦ=0"")", "Номенклатура"), ", ", " - ")
В этом выражении форматная строка ""ЧДЦ=0"" (Число Десятичных Знаков = 0) гарантирует, что дробная часть будет отсечена, и пользователь увидит понятные целые числа. Обратите внимание на удвоенные кавычки внутри строки выражения СКД — это обязательное требование синтаксиса.
Теперь, когда мы изучили все необходимые формулы, разберем по шагам, как правильно перенести их в ваш отчет:
СоединитьСтроки(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), "Номенклатура Возр"), ", ", " - ")
Ссылка, Документ или Контрагент), для которой должна формироваться эта строка.При настройке подобных отчетов разработчики часто сталкиваются с типичными ошибками. Выясним причину одной из них.
Иногда при попытке конкатенации строк вида Строка(Номенклатура.Наименование) + " " + Строка(Количество) платформа выдает ошибку: «Неверные параметры "+"».
Дело в том, что в запросах 1С или в выражениях СКД нельзя напрямую складывать строки и числа без явного приведения типов, либо используемые поля могут иметь неопределенный тип (например, Null). Использование связки функций СоединитьСтроки() и ТаблицаЗначений() полностью решает эту проблему, так как платформа берет на себя безопасное преобразование типов колонок таблицы в строковое представление перед их склейкой.
Используя предложенные методики, вы сможете создавать гибкие, компактные и профессионально выглядящие отчеты в 1С без написания лишнего кода!