Как убрать лишние или дублирующиеся значения в отчете СКД?

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

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

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

Метод 1. Ручная настройка состава полей в детальных записях

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

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

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

Важно помнить: не добавляйте поля ресурсов в детальные записи, если они уже выводятся в вышестоящих группировках. Таким образом, итог будет виден только в строке группировки, а детальные строки будут содержать только свою уникальную информацию.

Метод 2. Управление расчетом ресурсов через колонку «Рассчитывать по...»

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

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

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

Метод 3. Настройка ролей полей и борьба с дублями при соединениях

Выясним причину появления дублей на уровне набора данных. Часто это происходит при использовании Left Join (Левое соединение) в запросе, когда одной записи из левой таблицы соответствует несколько записей из правой. В итоге значения из левой таблицы дублируются для каждой строки правой таблицы.

Разберем, как это корректируется через Роли полей:

  1. Перейдем на вкладку Наборы данных.
  2. Найдем поле, значения которого дублируются.
  3. В колонке Роль нажмем на ссылку для редактирования свойств.
  4. Если поле является измерением, установим флажок Без дублей. Это даст сигнал системе компоновки, что при обработке результата запроса нужно учитывать уникальность значений данного поля.
  5. Также обратим внимание на свойство Игнорировать значения NULL. Это помогает избавиться от пустых «лишних» строк, которые возникают при неудачном соединении таблиц.

Метод 4. Использование ключевого слова РАЗЛИЧНЫЕ в запросе

Если проблема избыточности данных заложена в самом тексте запроса, настройки компоновки могут лишь скрыть симптомы, но не решить проблему производительности. Посмотрим на пример оптимизации текста запроса.

Если мы выбираем данные из регистра, которые могут дублироваться из-за специфики регистратора или аналитики, используем ключевое слово РАЗЛИЧНЫЕ (в терминах SQL — DISTINCT):


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Продажи.Контрагент КАК Контрагент,
    Продажи.Договор КАК Договор
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода

Этот метод гарантирует, что в СКД попадет уже очищенный от дублей набор данных. Однако стоит помнить, что использование РАЗЛИЧНЫЕ может замедлить выполнение запроса на очень больших объемах данных, поэтому применять его следует осознанно.

Метод 5. Группировка во временных таблицах

Рассмотрим более сложный, но надежный архитектурный подход. Вместо того чтобы соединять «сырые» таблицы в основном запросе СКД, проанализируем возможность предварительной группировки данных во временных таблицах.

Предположим, нам нужно вывести список заказов и общую сумму оплат по ним. Если просто соединить таблицу заказов с таблицей платежей, каждый заказ продублируется столько раз, сколько было платежей по нему. Правильный подход:

  1. Создаем временную таблицу, где группируем платежи по заказам и вычисляем сумму.
  2. В основном запросе соединяем таблицу заказов с этой временной таблицей.

Пример структуры запроса:


ВЫБРАТЬ
    Оплаты.Заказ КАК Заказ,
    СУММА(Оплаты.Сумма) КАК СуммаОплаты
ПОМЕСТИТЬ ВТ_Оплаты
ИЗ
    РегистрНакопления.Взаиморасчеты КАК Оплаты
СГРУППИРОВАТЬ ПО
    Оплаты.Заказ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Заказы.Ссылка КАК Заказ,
    Заказы.Дата КАК Дата,
    ЕСТЬNULL(ВТ_Оплаты.СуммаОплаты, 0) КАК СуммаОплаты
ИЗ
    Документ.ЗаказПокупателя КАК Заказы
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Оплаты КАК ВТ_Оплаты
    ПО Заказы.Ссылка = ВТ_Оплаты.Заказ

Такой подход полностью исключает появление «лишних» строк на этапе формирования выборки. Если же требуется вывести подчиненные значения в одной ячейке без размножения строк, можно применить способ объединения значений колонки из нескольких строк в СКД.

Метод 6. Другие настройки: Расположение полей группировок

Иногда визуальные дубли — это лишь следствие настроек отображения. Перейдем во вкладку Настройки, затем выберем Другие настройки. Найдем параметр Расположение полей группировок.

Метод 7. Условное оформление для скрытия повторяющихся значений

Если стандартные средства настройки структуры не позволяют добиться нужного результата (например, в сложных иерархических отчетах), применим метод «визуальной очистки» через Условное оформление. Это позволяет скрыть текст в ячейках, которые мы считаем лишними.

Алгоритм действий:

  1. В настройках отчета перейдем на вкладку Условное оформление.
  2. Добавим новый элемент оформления.
  3. В качестве оформляемого поля выберем то, которое дублируется.
  4. В параметрах оформления установим Текст — пустая строка (или установим Видимость в значение Ложь).
  5. В условии укажем логику, при которой значение не должно выводиться. Например, можно использовать системное поле Уровень, чтобы скрывать значения на определенных уровнях иерархии.

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

← На главную