Как правильно программно установить параметры СКД в отчете 1С?

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

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

Анализ типичных ошибок при программной установке параметров

Проанализируем типовой фрагмент кода, в котором параметры не срабатывают:


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

Выясним причины, по которым данный код не дает результата:

  1. Перезапись настроек исходной копией: Метод КомпоновщикНастроек.ПолучитьНастройки() создает отдельную независимую копию текущих настроек. Далее в коде значения параметров меняются напрямую в КомпоновщикНастроек.Настройки, а затем вызывается КомпоновщикНастроек.ЗагрузитьНастройки(Настройки). В результате в компоновщик загружается старая копия, полностью затирая все только что внесенные изменения.
  2. Приоритет пользовательских настроек: Если параметр вынесен в пользовательские настройки отчета (отображается в шапке отчета или форме настроек), платформа при стандартном формировании отдает приоритет коллекции КомпоновщикНастроек.ПользовательскиеНастройки. Значение, установленное только в КомпоновщикНастроек.Настройки.ПараметрыДанных, перекрывается значением из пользовательских настроек.
  3. Флаг использования: Для того чтобы параметр учитывался при компоновке, его свойство Использование должно быть установлено в Истина.

Способ 1. Использование функций типовых конфигураций

Если разработка ведется в типовой конфигурации (например, 1С:Бухгалтерия, 1С:ERP или 1С:УТ), наиболее простым и надежным решением является использование встроенных процедур общего модуля. Рассмотрим пример вызова:


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

Типовой метод автоматически определяет, выведен ли параметр в пользовательские настройки, корректно устанавливает его значение и включает признак Использование = Истина.

Способ 2. Прямая установка в основные настройки без перезагрузки

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


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

Способ 3. Установка через пользовательские настройки

Когда отчет формируется стандартно, а параметр доступен пользователю на форме, найдем и изменим его в коллекции пользовательских настроек:


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

Способ 4. Полное программное формирование отчета

Если необходимо переопределить настройки только на момент конкретного формирования, отключив влияние пользовательских настроек формы, отключим стандартную обработку и выполним компоновку вручную:


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

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

Важные нюансы при работе с параметрами СКД

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