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

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

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

Двухуровневая настройка связей параметров

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

Шаг 1. Настройка на закладке «Вложенные схемы»

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

Шаг 2. Настройка на закладке «Настройки»

Это тот самый этап, который чаще всего пропускают. Перейдем на закладку Настройки основной схемы. В дереве настроек (слева) найдем наш вложенный отчет. Теперь обратим внимание на нижнюю часть экрана — на закладку Параметры именно для этого вложенного отчета. Здесь для каждого нужного параметра (например, НачалоПериода) необходимо:

  1. Установить галочку использования параметра.
  2. В поле «Значение» выбрать не конкретную дату, а указать выражение.
  3. Использовать специальный объект связи: ОбъектНастройкиВладелец.ПараметрыДанных.НачалоПериода.

Проанализируем ситуацию: если мы не выполним Шаг 2, вложенная схема будет пытаться использовать свои собственные значения параметров по умолчанию, игнорируя то, что пришло «сверху» от владельца.

Специфические баги платформы и визуальный редактор

Иногда даже при правильной настройке отчет выдает ошибку или пустой результат. Рассмотрим случай, характерный для версий платформы 8.3.18.1208 и выше. Пользователи часто сталкиваются с тем, что конструктор ведет себя некорректно при вводе выражений.

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

Также стоит помнить о кэшировании настроек. Если вы внесли изменения в структуру связей параметров, а отчет по-прежнему работает по-старому, попробуйте очистить пользовательские настройки или кэш платформы. Часто 1С сохраняет старые варианты настроек компоновки в SystemSettingsStorage, что блокирует применение новых правил передачи параметров.

Программная передача параметров через ПриКомпоновкеРезультата

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

Для этого используется предопределенная процедура ПриКомпоновкеРезультата. Нам нужно перебрать структуру настроек и принудительно установить значения для вложенных объектов. Посмотрим на пример кода:


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

    // Далее следует стандартный вывод отчета...
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

Работа с типом СтандартныйПериод

Разберем еще один тонкий момент. Часто в основной схеме используется один параметр типа СтандартныйПериод, а во вложенной схеме — две отдельные даты (Начало и Конец). В этом случае прямая связь через ОбъектНастройкиВладелец может не сработать автоматически.

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

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

Ограничения вложенных схем

Напоследок отметим несколько важных ограничений, о которых стоит помнить при работе с вложенными схемами:

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

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

← На главную