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