При разработке отчетов на базе Системы компоновки данных (СКД) в «1С:Предприятии» программисты часто сталкиваются с проблемой «размножения» строк. Это происходит, когда к одной уникальной сущности (например, сотруднику или документу) привязывается несколько подчиненных записей (например, должностей, маршрутов или графиков). В результате в выводе отчета появляются дублирующиеся строки, а числовые показатели (например, расход топлива, сумма или количество) начинают некорректно суммироваться, многократно завышая реальные итоги.
В этой статье мы подробно рассмотрим, как решить данную задачу на уровне СКД. Мы разберем как базовые методы склеивания строк через запятую, так и продвинутые механизмы исключения дублей, двойного агрегирования и разделения данных на несколько наборов для оптимизации производительности.
Самый простой способ объединить текстовые значения по группировке — использовать агрегатную функцию СКД СоединитьСтроки. Представим базовую ситуацию: у нас есть строки с сотрудниками, у которых заведено несколько должностей. Нам нужно сгруппировать отчет по сотруднику, а его должности вывести в одну строку через запятую.
Выполним следующие шаги для настройки ресурса:
Должность в список ресурсов.
СоединитьСтроки(Должность, ", ")
Сотрудник (или Имя, Фамилия).Этот способ прекрасно работает, когда исходные данные не содержат дубликатов текстовых полей. Но что делать, если в подчиненных строках одно и то же значение может повторяться?
Проанализируем более сложную ситуацию. Допустим, при группировке по автомобилю и документу у нас дублируются графики работы, и при использовании стандартного метода мы получаем результат вида: «График 1, График 1, График 2». Нам же требуется вывести уникальный список: «График 1, График 2».
Для решения этой проблемы мы задействуем мощную агрегатную функцию СКД ВычислитьВыражениеСГруппировкойМассив совместно со словом Различные. Эта функция сначала соберет все значения в массив, отбросит дубликаты, а затем функция СоединитьСтроки превратит этот массив в красивую строку.
На вкладке Ресурсы для поля График укажем выражение:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Различные График"), ", ")
Давайте разберем, как работает эта формула:
ВычислитьВыражениеСГруппировкойМассив собирает значения поля График по текущей группировке."Различные График" внутри функции указывает системе, что в массив должны попасть только уникальные элементы.СоединитьСтроки принимает полученный массив уникальных значений и объединяет их в единую строку, используя в качестве разделителя запятую с пробелом.Когда строки двоятся из-за подчиненных данных (например, графиков), математические ресурсы (такие как РасходТоплива или Сумма) начинают суммироваться некорректно. Например, если реальный расход по документу равен 14 литрам, но к нему привязано 2 графика, то при обычной группировке система выведет сумму 28 литров. Это классическая ошибка.
Нам необходимо настроить систему так, чтобы на уровне детальных записей (документа) выбирался максимум или минимум расхода топлива (чтобы убрать влияние дублирования), а на верхних уровнях группировки (по автомобилю или в общих итогах) эти значения корректно складывались.
Для реализации этого механизма на вкладке Ресурсы добавим поле РасходТоплива дважды с разными настройками:
Максимум(РасходТоплива) (это позволит получить чистый расход на один документ, проигнорировав задвоение строк из-за разных графиков).Документ.Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(РасходТоплива)", "Документ")).НомерАвтомобиля, а также поле ОбщийИтог.При такой настройке СКД сначала найдет максимальное значение расхода топлива по каждому уникальному документу, а затем сложит эти максимумы на уровне автомобиля. Итоги станут абсолютно корректными.
Хотя формулы двойного агрегирования отлично решают задачу, на больших объемах данных они могут существенно снизить скорость работы отчета. Наиболее профессиональным решением является разделение данных на уровне архитектуры СКД на два независимых набора данных с последующей настройкой связи между ними.
Выясним причину эффективности этого метода: мы физически разделяем числовые данные, которые нельзя дублировать, и строковые данные, которые вызывают дублирование.
Рассмотрим по шагам, как это настроить:
Шаг 1. Создание Набора данных №1 (Запрос)
Этот набор данных будет содержать только уникальные записи по расходу топлива и документам. Никаких графиков или маршрутов здесь выбирать не нужно. Строки не будут двоиться.
ВЫБРАТЬ
ПутевойЛист.Ссылка КАК Документ,
ПутевойЛист.Автомобиль КАК НомерАвтомобиля,
ПутевойЛист.РасходТоплива КАК РасходТоплива
ИЗ
Документ.ПутевойЛист КАК ПутевойЛист
Шаг 2. Создание Набора данных №2 (Запрос)
Этот набор будет выбирать только информацию о документах и связанных с ними графиках работы:
ВЫБРАТЬ
ПутевойЛистГрафики.Ссылка КАК Документ,
ПутевойЛистГрафики.График КАК График
ИЗ
Документ.ПутевойЛист.Графики КАК ПутевойЛистГрафики
Шаг 3. Настройка связей наборов данных
Перейдем на вкладку Связи наборов данных и добавим новую строку:
Документ = ДокументШаг 4. Настройка ресурсов
Теперь на вкладке Ресурсы мы настраиваем поля стандартным образом:
РасходТоплива пишем простое выражение: Сумма(РасходТоплива). Поскольку данные в первом наборе уникальны, сумма посчитается идеально верно на всех уровнях группировки.График пишем выражение: СоединитьСтроки(График, ", ").При таком подходе СКД сначала получит уникальные записи по расходам, корректно посчитает математические суммы, а затем для каждого документа найдет соответствующие ему графики из второго набора данных и красиво объединит их в одну строчку через запятую. Отчет будет работать максимально быстро и без каких-либо ошибок в расчетах.