Почему второй набор данных в СКД мешает первому и как правильно настроить их совместную работу?

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

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

Причина возникновения конфликта между наборами данных

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

Выделим основные причины, по которым второй набор данных «мешает» первому:

  1. Неявное соединение (Full Join): Если поля из обоих наборов выводятся в одной строке или в одной группировке, СКД выполняет своего рода внешнее соединение. Без четко заданных связей это может привести к образованию декартова произведения, что ломает логику суммирования и группировки.
  2. Одинаковые имена полей и синонимов: Если в обоих наборах есть поля с идентичными именами (например, Контрагент), то глобальные отборы отчета будут накладываться на оба набора сразу. Это может привести к тому, что первый набор данных перестанет возвращать строки, если во втором наборе для данного контрагента нет данных.
  3. Автоматическое управление полями: СКД оптимизирует запросы, выбрасывая «лишние», по ее мнению, поля. Если структура группировок сложная, наличие второго набора может запутать построитель запроса.

Решение 1: Изменение роли поля в ресурсах (метод автора темы)

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

Выполним следующие шаги:

  1. Перейдем на вкладку «Наборы данных».
  2. Для проблемного поля (которое должно быть в группировке, но мешает) убедимся, что оно доступно.
  3. Перейдем на вкладку «Ресурсы».
  4. Добавим это поле в список ресурсов, но вместо функции СУММА укажем функцию МАКСИМУМ.
  5. В настройках отчета (вкладка «Настройки») оставим это поле в выбранных полях, но уберем его из структуры группировок там, где оно вызывает конфликт.

Этот метод позволяет СКД обрабатывать поле не как измерение, по которому нужно жестко связывать таблицы, а как вычисляемое значение, что часто снимает проблему некорректного объединения строк.

Решение 2: Использование уникальных синонимов (псевдонимов)

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


// Набор 1
ВЫБРАТЬ
    Регистр.Контрагент КАК Контрагент,
    Регистр.СуммаОстаток КАК Сумма
ИЗ
    РегистрНакопления.Взаиморасчеты.Остатки КАК Регистр

// Набор 2
ВЫБРАТЬ
    ДругойРегистр.Контрагент КАК Контрагент,
    ДругойРегистр.ДополнительнаяИнфо КАК Инфо
ИЗ
    РегистрСведений.ДополнительнаяИнформация КАК ДругойРегистр

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

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

Решение 3: Настройка периодичности виртуальных таблиц

Часто проблема кроется в использовании виртуальных таблиц ОстаткиИОбороты. Посмотрим на рекомендации из обсуждения. Если СКД не может корректно сопоставить записи, попробуем явно указать периодичность.

В параметрах виртуальной таблицы следует указать значение Авто:


ВЫБРАТЬ
    Взаиморасчеты.ДоговорКонтрагента,
    Взаиморасчеты.СуммаНачальныйОстаток
ИЗ
    РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК Взаиморасчеты

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

Решение 4: Разделение структуры настроек

Если наборы данных действительно независимы (например, вы просто хотите вывести два разных списка в одном отчете), наиболее правильным подходом будет разделение их на уровне настроек, а не на уровне запросов.

Разберем, как это сделать:

  1. В корне настроек отчета создадим две отдельные группировки (например, две группы «Детальные записи» или две группы с разными полями).
  2. Для первой группы в «Выбранных полях» укажем только поля из первого набора данных.
  3. Для второй группы укажем только поля из второго набора данных.
  4. Убедимся, что на уровне самого «Отчета» (верхний узел) не выбрано общих полей, которые могли бы спровоцировать соединение наборов.

Проанализируем результат: в этом случае СКД сформирует два независимых запроса к СУБД и выведет их последовательно, что полностью исключит их взаимное влияние друг на друга.

Советы по оптимизации запросов в СКД

При работе с несколькими наборами данных всегда помните о следующих правилах:

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

← На главную