Как передать отбор во вложенную схему СКД в 1С и избежать ошибок контекста?

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

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

Выясним причину возникновения проблемы

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

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

Способ 1. Корректная настройка структуры группировок

Проанализируем базовый способ решения через настройки структуры отчета на вкладке «Настройки» основной схемы компоновки данных.

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. Убедимся, что вложенный отчет размещен не в корне структуры, а помещен внутрь группировки по полю, по которому устанавливается отбор (либо внутри детальных записей).
  3. Перейдем на вкладку «Вложенные схемы» и перенастроим связку. В колонке «Настройки» свяжем отборы вложенной схемы с полями схемы-владельца: Вид РАВНО ОбъектНастройкиВладелец.Вид.
  4. Если связь настроек была создана до изменения структуры группировок, платформа может не обновить внутренний контекст. В этом случае выполним пересборку: удалим вложенный отчет с вкладки «Вложенные схемы» и из структуры группировок, а затем добавим его заново за один проход.

Способ 2. Передача отборов через параметры запроса

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

  1. Во вложенной схеме зададим условия ограничения через параметры запроса или параметры виртуальных таблиц (например, &НачалоПериода, &КонецПериода, &ВидОтбора).
  2. На вкладке «Вложенные схемы» основной схемы в колонке «Настройки» свяжем параметры вложенной схемы с параметрами главной схемы:

    Начало периода = ОбъектНастройкиВладелец.ПараметрыДанных.НачалоПериода

    Конец периода = ОбъектНастройкиВладелец.ПараметрыДанных.КонецПериода

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

Способ 3. Программная передача отборов через КомпоновщикНастроек

Если пользователь задает отбор на форме отчета в режиме «1С:Предприятие», стандартные настройки не всегда автоматически копируются во вложенную схему. В таком случае выполним программную передачу условий отбора в модуле объекта отчета в обработчике события ПриКомпоновкеРезультата.

Рассмотрим пример кода, который обращается к структуре настроек компоновщика и переносит коллекцию отборов основной схемы во вложенный объект:


Процедура ПриКомпоновкеРезультата(ИзменительМакета, СхемаКомпоновкиДанных, Настройки, ИсполнительКомпоновки)
    
    // Получаем элемент структуры, содержащий вложенный отчет
    ВложенныйОбъект = КомпоновщикНастроек.Настройки.Структура[0];
    
    // Проверяем тип и доступность элементов отбора
    Если ТипЗнч(ВложенныйОбъект) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
        
        // Очищаем или обновляем отборы во вложенной схеме
        ВложенныйОбъект.Настройки.Отбор.Элементы.Очистить();
        
        Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
            Если ЭлементОтбора.Использование Тогда
                ЗаполнитьЗначенияСвойств(ВложенныйОбъект.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")), ЭлементОтбора);
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;

КонецПроцедуры

Альтернативные варианты архитектуры отчета

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

  1. Использование нескольких наборов данных и связей между ними: На вкладке «Наборы данных» создаются два отдельных запроса. Затем на вкладке «Связи наборов данных» настраиваются условия соединения. В этом случае пользовательский отбор накладывается на общую схему и корректно ограничивает выборку во всех наборах данных.
  2. Набор данных — Объединение: Если оба запроса имеют сходную структуру полей и выводятся друг за другом, объединим их в один набор данных типа Объединение. Наложенный пользователем отбор автоматически применится ко всем входящим в объединение запросам.
← На главную