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