Как в СКД вывести всю номенклатуру и ее количество в одну строку?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Приветствуем вас! При разработке отчетов на базе Системы компоновки данных (СКД) в 1С перед программистами нередко встает задача компактного вывода детальных записей. Классический пример — необходимость вывести в печатной форме список заказанных товаров или материалов в одну строку, через запятую, с указанием их количества. Например, вместо стандартного вертикального списка (таблицы) нам нужно получить компактную строку: «Хлеб - 4, Молоко - 6, Творог - 10». Для решения таких задач подойдёт пример сбора значений колонки из нескольких строк в СКД.

В этой статье мы подробно разберем, как реализовать такую логику стандартными средствами СКД без написания сложного программного кода на стороне модуля. Мы изучим работу функции СоединитьСтроки(), узнаем, как правильно передавать в нее коллекции данных, а также рассмотрим продвинутые сценарии: группировку с суммированием количества, сортировку списка по алфавиту и правильное форматирование чисел для избавления от лишних нулей.

Разберем основы: Функция СоединитьСтроки() и ТаблицаЗначений()

Для решения нашей задачи мы будем использовать встроенную функцию языка выражений СКД — СоединитьСтроки(). Ее базовый синтаксис выглядит следующим образом:

СоединитьСтроки(Значение, РазделительЭлементов, РазделительКолонок)

Если мы просто попытаемся объединить поле номенклатуры, СКД выдаст нам список названий. Но как привязать к каждому названию соответствующее количество? Для этого нам нужно передать в функцию не одно поле, а целую таблицу значений. В СКД для этого существует системная функция ТаблицаЗначений().

Рассмотрим по шагам базовое выражение, которое мы можем прописать в ресурсах нашего отчета:

СоединитьСтроки(ТаблицаЗначений(Номенклатура, Количество), ", ", " - ")

Выясним, как работает это выражение:

  1. Функция ТаблицаЗначений(Номенклатура, Количество) собирает все детальные записи текущей группировки во временную таблицу с двумя колонками.
  2. Функция СоединитьСтроки() обходит эту таблицу.
  3. Третий параметр (" - ") — это разделитель колонок. Он связывает значение из первой колонки (Номенклатура) со значением из второй колонки (Количество).
  4. Второй параметр (", ") — это разделитель строк. Он отделяет одну получившуюся пару от другой.

Исключение дубликатов и суммирование количества

На практике детальные записи часто содержат дублирующиеся позиции. Например, если в одном документе или у одного контрагента было несколько отгрузок одного и того же товара, простое объединение через ТаблицаЗначений выдаст нам строку вида: «Хлеб - 2, Хлеб - 2, Молоко - 6». Это выглядит неаккуратно и неинформативно.

Для того чтобы сгруппировать одинаковую номенклатуру и сложить ее количество, мы воспользуемся мощной функцией СКД — ВычислитьВыражениеСГруппировкойТаблицаЗначений(). Проанализируем следующее выражение:


СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), ", ", " - ")

Рассмотрим подробнее, что происходит в данном случае:

  1. Первый параметр "Номенклатура, Сумма(Количество)" определяет структуру колонок результирующей таблицы. Мы указываем, что количество должно суммироваться.
  2. Второй параметр "Номенклатура" указывает поле, по которому будет производиться группировка данных.
  3. На выходе мы получаем свернутую таблицу без дубликатов, где для каждого уникального товара рассчитано общее количество.
  4. Функция СоединитьСтроки() превращает эту таблицу в красивую строку.

Сортировка списка по алфавиту

Чтобы итоговая строка выглядела профессионально, элементы в ней должны быть упорядочены, например, по алфавиту. Для этого в СКД применяется функция Упорядочить().

Посмотрим на пример выражения, совмещающего группировку, суммирование и сортировку по возрастанию наименования номенклатуры:


СоединитьСтроки(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), "Номенклатура Возр"), ", ", " - ")

Если же суммировать количество не требуется, а нужно просто вывести уникальные записи по алфавиту, выражение упростится:


СоединитьСтроки(Упорядочить(Свернуть(ТаблицаЗначений(Номенклатура, Количество)), "Номенклатура Возр"), ", ", " - ")

Здесь функция Свернуть() удаляет полные дубликаты строк перед сортировкой и склейкой.

Красивый вывод чисел: избавляемся от лишних нулей

В базах данных 1С количество часто хранится с точностью до трех знаков после запятой (например, 4.000). Если вывести это значение напрямую, мы получим некрасивую строку: «Хлеб - 4.000, Молоко - 6.000». Чтобы исправить это, применим функцию Формат().

Давайте разберем, как применить форматирование внутри наших выражений:


СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Формат(Сумма(Количество), ""ЧДЦ=0"")", "Номенклатура"), ", ", " - ")

В этом выражении форматная строка ""ЧДЦ=0"" (Число Десятичных Знаков = 0) гарантирует, что дробная часть будет отсечена, и пользователь увидит понятные целые числа. Обратите внимание на удвоенные кавычки внутри строки выражения СКД — это обязательное требование синтаксиса.

Пошаговая настройка в схеме компоновки данных

Теперь, когда мы изучили все необходимые формулы, разберем по шагам, как правильно перенести их в ваш отчет:

  1. Откройте схему компоновки данных вашего отчета и перейдите на вкладку «Ресурсы».
  2. Добавьте новое поле ресурса. В колонке «Путь к данным» выберите или введите выражение, которое хотите выводить (например, создайте вычисляемое поле или используйте существующее поле номенклатуры).
  3. В колонку «Выражение» вставьте одну из формул, рассмотренных выше. Например:

    СоединитьСтроки(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Сумма(Количество)", "Номенклатура"), "Номенклатура Возр"), ", ", " - ")

  4. Критически важный шаг: Обратите внимание на колонку «Рассчитывать по...». Если оставить её пустой, СКД попытается рассчитать это выражение для всех уровней группировок, включая детальные записи, что приведет к ошибкам или неверному выводу. Укажите конкретную родительскую группировку (например, Ссылка, Документ или Контрагент), для которой должна формироваться эта строка.

Анализ возможных ошибок

При настройке подобных отчетов разработчики часто сталкиваются с типичными ошибками. Выясним причину одной из них.

Иногда при попытке конкатенации строк вида Строка(Номенклатура.Наименование) + " " + Строка(Количество) платформа выдает ошибку: «Неверные параметры "+"».

Дело в том, что в запросах 1С или в выражениях СКД нельзя напрямую складывать строки и числа без явного приведения типов, либо используемые поля могут иметь неопределенный тип (например, Null). Использование связки функций СоединитьСтроки() и ТаблицаЗначений() полностью решает эту проблему, так как платформа берет на себя безопасное преобразование типов колонок таблицы в строковое представление перед их склейкой.

Используя предложенные методики, вы сможете создавать гибкие, компактные и профессионально выглядящие отчеты в 1С без написания лишнего кода!

← На главную