Как сгруппировать строки в СКД 1С с объединением текстовых полей через запятую и корректным расчетом итогов

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

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

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

Решение 1. Использование встроенной функции «СоединитьСтроки» в ресурсах СКД

Самый простой способ объединить текстовые значения по группировке — использовать агрегатную функцию СКД СоединитьСтроки. Представим базовую ситуацию: у нас есть строки с сотрудниками, у которых заведено несколько должностей. Нам нужно сгруппировать отчет по сотруднику, а его должности вывести в одну строку через запятую.

Выполним следующие шаги для настройки ресурса:

  1. Откроем схему компоновки данных и перейдем на вкладку Ресурсы.
  2. Добавим поле Должность в список ресурсов.
  3. В колонке Выражение напишем следующую формулу: СоединитьСтроки(Должность, ", ")
  4. Важный нюанс: если оставить настройку в таком виде, СКД попытается склеить вообще все должности из базы данных в строке «Общие итоги». Это может привести к зависанию отчета или выводу огромной нечитаемой строки. Чтобы избежать этого, в колонке Рассчитывать по... укажем конкретное поле группировки — например, Сотрудник (или Имя, Фамилия).

Этот способ прекрасно работает, когда исходные данные не содержат дубликатов текстовых полей. Но что делать, если в подчиненных строках одно и то же значение может повторяться?

Решение 2. Исключение повторяющихся слов при объединении строк

Проанализируем более сложную ситуацию. Допустим, при группировке по автомобилю и документу у нас дублируются графики работы, и при использовании стандартного метода мы получаем результат вида: «График 1, График 1, График 2». Нам же требуется вывести уникальный список: «График 1, График 2».

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

На вкладке Ресурсы для поля График укажем выражение:

СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Различные График"), ", ")

Давайте разберем, как работает эта формула:

Решение 3. Борьба с «задвоением» суммовых показателей (Двойное агрегирование)

Когда строки двоятся из-за подчиненных данных (например, графиков), математические ресурсы (такие как РасходТоплива или Сумма) начинают суммироваться некорректно. Например, если реальный расход по документу равен 14 литрам, но к нему привязано 2 графика, то при обычной группировке система выведет сумму 28 литров. Это классическая ошибка.

Нам необходимо настроить систему так, чтобы на уровне детальных записей (документа) выбирался максимум или минимум расхода топлива (чтобы убрать влияние дублирования), а на верхних уровнях группировки (по автомобилю или в общих итогах) эти значения корректно складывались.

Для реализации этого механизма на вкладке Ресурсы добавим поле РасходТоплива дважды с разными настройками:

  1. Первая строка настройки ресурса (для нижнего уровня):
    • Выражение: Максимум(РасходТоплива) (это позволит получить чистый расход на один документ, проигнорировав задвоение строк из-за разных графиков).
    • Рассчитывать по...: Документ.
  2. Вторая строка настройки ресурса (для верхних уровней и итогов):
    • Выражение: Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(РасходТоплива)", "Документ")).
    • Рассчитывать по...: укажем группировки верхнего уровня, например, НомерАвтомобиля, а также поле ОбщийИтог.

При такой настройке СКД сначала найдет максимальное значение расхода топлива по каждому уникальному документу, а затем сложит эти максимумы на уровне автомобиля. Итоги станут абсолютно корректными.

Решение 4. Архитектурный подход через связь наборов данных (Лучшая практика)

Хотя формулы двойного агрегирования отлично решают задачу, на больших объемах данных они могут существенно снизить скорость работы отчета. Наиболее профессиональным решением является разделение данных на уровне архитектуры СКД на два независимых набора данных с последующей настройкой связи между ними.

Выясним причину эффективности этого метода: мы физически разделяем числовые данные, которые нельзя дублировать, и строковые данные, которые вызывают дублирование.

Рассмотрим по шагам, как это настроить:

Шаг 1. Создание Набора данных №1 (Запрос)

Этот набор данных будет содержать только уникальные записи по расходу топлива и документам. Никаких графиков или маршрутов здесь выбирать не нужно. Строки не будут двоиться.


ВЫБРАТЬ
    ПутевойЛист.Ссылка КАК Документ,
    ПутевойЛист.Автомобиль КАК НомерАвтомобиля,
    ПутевойЛист.РасходТоплива КАК РасходТоплива
ИЗ
    Документ.ПутевойЛист КАК ПутевойЛист

Шаг 2. Создание Набора данных №2 (Запрос)

Этот набор будет выбирать только информацию о документах и связанных с ними графиках работы:


ВЫБРАТЬ
    ПутевойЛистГрафики.Ссылка КАК Документ,
    ПутевойЛистГрафики.График КАК График
ИЗ
    Документ.ПутевойЛист.Графики КАК ПутевойЛистГрафики

Шаг 3. Настройка связей наборов данных

Перейдем на вкладку Связи наборов данных и добавим новую строку:

Шаг 4. Настройка ресурсов

Теперь на вкладке Ресурсы мы настраиваем поля стандартным образом:

При таком подходе СКД сначала получит уникальные записи по расходам, корректно посчитает математические суммы, а затем для каждого документа найдет соответствующие ему графики из второго набора данных и красиво объединит их в одну строчку через запятую. Отчет будет работать максимально быстро и без каких-либо ошибок в расчетах.

← На главную