При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в сформированном отчете появляются лишние строки или дублирующиеся значения. Это не только портит визуальный вид отчета, но и вводит пользователей в заблуждение, создавая ощущение избыточности данных. Проблема чаще всего кроется не в ошибке самой платформы, а в особенностях настройки связей наборов данных, ресурсов или структуры компоновки.
В этой статье мы подробно разберем, почему возникают «лишние» значения и какими методами их можно устранить, обеспечив чистоту и точность выводимых данных. Мы пройдем путь от простых настроек интерфейса компоновки до глубокой оптимизации запросов и использования ролей полей.
Рассмотрим наиболее частую причину дублей, упомянутую в обсуждении на форуме. По умолчанию в СКД для группировки Детальные записи используется настройка Автополе. Это означает, что система выводит в детальных строках все поля, которые выбраны на уровне выше (в общих настройках отчета), включая ресурсы.
Если ресурс (например, «Сумма оборота») рассчитан для группировки «Контрагент», но также выводится в детальных записях (строках документов), он будет повторяться в каждой строке этого контрагента. Чтобы это исправить, выполним следующие шаги:
Детальные записи.Автополе.Номенклатура, Количество, Цена).Важно помнить: не добавляйте поля ресурсов в детальные записи, если они уже выводятся в вышестоящих группировках. Таким образом, итог будет виден только в строке группировки, а детальные строки будут содержать только свою уникальную информацию.
Проанализируем ситуацию, когда ресурс все же необходим, но он должен отображаться строго на определенных уровнях иерархии. На вкладке Ресурсы есть мощный инструмент — колонка Рассчитывать по....
Если оставить это поле пустым, СКД будет пытаться вычислить и вывести значение ресурса для всех доступных группировок и детальных записей. Чтобы убрать дублирование итогов в строках, сделаем следующее:
СуммаОстаток).Рассчитывать по... нажмем кнопку выбора.Склад или Организация).Детальные записи снят.После этой настройки значение ресурса исчезнет из детальных строк, оставив их «чистыми», и будет отображаться только в строках итогов по указанным разрезам. Для детального разбора подобной компоновки можно изучить пример вывода ресурса в СКД в одной выбранной колонке.
Выясним причину появления дублей на уровне набора данных. Часто это происходит при использовании Left Join (Левое соединение) в запросе, когда одной записи из левой таблицы соответствует несколько записей из правой. В итоге значения из левой таблицы дублируются для каждой строки правой таблицы.
Разберем, как это корректируется через Роли полей:
Роль нажмем на ссылку для редактирования свойств.Без дублей. Это даст сигнал системе компоновки, что при обработке результата запроса нужно учитывать уникальность значений данного поля.Игнорировать значения NULL. Это помогает избавиться от пустых «лишних» строк, которые возникают при неудачном соединении таблиц.Если проблема избыточности данных заложена в самом тексте запроса, настройки компоновки могут лишь скрыть симптомы, но не решить проблему производительности. Посмотрим на пример оптимизации текста запроса.
Если мы выбираем данные из регистра, которые могут дублироваться из-за специфики регистратора или аналитики, используем ключевое слово РАЗЛИЧНЫЕ (в терминах SQL — DISTINCT):
ВЫБРАТЬ РАЗЛИЧНЫЕ
Продажи.Контрагент КАК Контрагент,
Продажи.Договор КАК Договор
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
Этот метод гарантирует, что в СКД попадет уже очищенный от дублей набор данных. Однако стоит помнить, что использование РАЗЛИЧНЫЕ может замедлить выполнение запроса на очень больших объемах данных, поэтому применять его следует осознанно.
Рассмотрим более сложный, но надежный архитектурный подход. Вместо того чтобы соединять «сырые» таблицы в основном запросе СКД, проанализируем возможность предварительной группировки данных во временных таблицах.
Предположим, нам нужно вывести список заказов и общую сумму оплат по ним. Если просто соединить таблицу заказов с таблицей платежей, каждый заказ продублируется столько раз, сколько было платежей по нему. Правильный подход:
Пример структуры запроса:
ВЫБРАТЬ
Оплаты.Заказ КАК Заказ,
СУММА(Оплаты.Сумма) КАК СуммаОплаты
ПОМЕСТИТЬ ВТ_Оплаты
ИЗ
РегистрНакопления.Взаиморасчеты КАК Оплаты
СГРУППИРОВАТЬ ПО
Оплаты.Заказ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Заказы.Ссылка КАК Заказ,
Заказы.Дата КАК Дата,
ЕСТЬNULL(ВТ_Оплаты.СуммаОплаты, 0) КАК СуммаОплаты
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Оплаты КАК ВТ_Оплаты
ПО Заказы.Ссылка = ВТ_Оплаты.Заказ
Такой подход полностью исключает появление «лишних» строк на этапе формирования выборки. Если же требуется вывести подчиненные значения в одной ячейке без размножения строк, можно применить способ объединения значений колонки из нескольких строк в СКД.
Иногда визуальные дубли — это лишь следствие настроек отображения. Перейдем во вкладку Настройки, затем выберем Другие настройки. Найдем параметр Расположение полей группировок.
Если стандартные средства настройки структуры не позволяют добиться нужного результата (например, в сложных иерархических отчетах), применим метод «визуальной очистки» через Условное оформление. Это позволяет скрыть текст в ячейках, которые мы считаем лишними.
Алгоритм действий:
Текст — пустая строка (или установим Видимость в значение Ложь).Уровень, чтобы скрывать значения на определенных уровнях иерархии.Резюмируем: борьба с лишними значениями в СКД требует комплексного подхода. Начните с проверки состава Выбранных полей в детальных записях и настроек ресурсов. Если это не помогает, проанализируйте текст запроса и роли полей. Правильная архитектура данных и настройки компоновки позволяют создавать профессиональные отчеты, в которых нет места избыточности.