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

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

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

Разберем детально, почему компоновщик настроек не видит созданный параметр, как устранить проблему с кэшированием структуры и как гарантированно передавать параметры в подчиненные схемы.

Причины возникновения ошибки

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

  1. Кэширование структуры отчета и сохраненных вариантов. Если параметр был добавлен в схему компоновки уже после того, как отчет открывался в режиме предприятия или настраивался вариант отчета, компоновщик настроек продолжает хранить старую структуру. Без явной перезаписи или очистки кэша новый параметр не добавляется в коллекцию настроек автоматически.
  2. Отсутствие набора данных в основной схеме. Когда в главной схеме нет наборов данных (а используются только вложенные схемы), параметры не связываются с полями запроса автоматически. Они объявляются в метаданных схемы, но могут не инициализироваться в структуре варианта по умолчанию.
  3. Переопределение в пользовательских настройках. Если параметр выведен в пользовательские настройки, его значение и доступность управляются через коллекцию ПользовательскиеНастройки, а прямое обращение к Настройки.ПараметрыДанных может приводить к ошибкам при компоновке.

Способ 1. Очистка кэша и принудительная инициализация настроек

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

  1. Сохраним и заново запишем схему компоновки данных и сам отчет в конфигураторе.
  2. Очистим пользовательский кэш или перезапустим сеанс «1С:Предприятие» с ключом /ClearCache.
  3. Если необходимо гарантировать совпадение структуры настроек со схемой в коде модуля отчета, выполним принудительную инициализацию перед установкой значений:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    // Принудительно инициализируем компоновщик доступными настройками схемы
    КомпоновщикНастроек.Инициализировать(
        Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)
    );
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

    ПараметрыДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных;
    ПараметрыДанных.УстановитьЗначениеПараметра("ЭтоСНГ", Ложь);

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

Способ 2. Безопасная установка параметров через поиск

Метод УстановитьЗначениеПараметра() вызывает исключение, если параметра нет в коллекции настроек. Чтобы код работал стабильно и не вызывал аварийных завершений при несовпадении сохраненных пользовательских вариантов со схемой, используем метод НайтиЗначениеПараметра().

Посмотрим на пример безопасного заполнения параметра:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    ПараметрСКД = Новый ПараметрКомпоновкиДанных("ЭтоСНГ");
    
    // Поиск и установка в основных настройках
    ЭлементПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрСКД);
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = Ложь;
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;

    // Поиск и установка в пользовательских настройках (если выведен на форму)
    Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") 
            И Элемент.Параметр = ПараметрСКД Тогда
            Элемент.Значение = Ложь;
            Элемент.Использование = Истина;
        КонецЕсли;
    КонецЦикла;

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

Способ 3. Корректная передача параметров во вложенные схемы

Рассмотрим правила связывания параметров основной и вложенной схемы:

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

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

Способ 4. Использование параметров сеанса без программного кода

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

Для этого в конфигураторе на вкладке «Параметры» в колонке «Выражение» указываем:

ПараметрыСеанса.ИмяПараметраСеанса

Либо вызываем функцию неглобального общего модуля с серверным контекстом:

ОбщийМодульСервер.ПолучитьПризнакСНГ()

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

← На главную