Как программно заполнить параметры схемы компоновки данных в 1С

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

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

Разберем подробно причины такого поведения платформы 1С:Предприятие и рассмотрим правильные варианты программного заполнения параметров СКД.

Почему параметр может отсутствовать в НастройкиПоУмолчанию

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

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

Способ 1. Установка параметра через метод УстановитьЗначениеПараметра в настройках

Самый удобный и стандартный способ задания значений доступных параметров — использование встроенного метода УстановитьЗначениеПараметра у коллекции ПараметрыДанных. Этот метод принимает строковое имя параметра, автоматически находит нужный элемент и включает флаг Использование = Истина.

Посмотрим на пример выполнения схемы с передачей параметра в настройки:


Схема = Документы.ЗаявкаНаПеревозку.ПолучитьМакет("РасчетСчетовКлиенту");
Настройки = Схема.НастройкиПоУмолчанию;

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    Схема, 
    Настройки, 
    , 
    , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);

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

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

Способ 2. Поиск и установка через НайтиЗначениеПараметра

Если требуется выполнить тонкую настройку (например, проверить наличие параметра перед установкой или управлять флагом использования вручную), воспользуемся методом НайтиЗначениеПараметра.

Разберем по шагам, как правильно обратиться к параметру через объект ПараметрКомпоновкиДанных:


ИмяПараметра = "ДатаКон";
ПараметрСКД = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
ЭлементПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрСКД);

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

Способ 3. Прямая установка значения в схеме компоновки

Проанализируем ситуацию, когда у параметра включено «Ограничение доступности» и он отсутствует в НастройкиПоУмолчанию. В этом случае значение можно передать напрямую в коллекцию параметров самой схемы перед вызовом компоновщика макета.

Рассмотрим пример установки значения непосредственно в объект схемы:


Схема = Документы.ЗаявкаНаПеревозку.ПолучитьМакет("РасчетСчетовКлиенту");

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

Настройки = Схема.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    Схема, 
    Настройки, 
    , 
    , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);

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

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

Способ 4. Использование КомпоновщикаНастроек с инициализацией

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

Посмотрим на корректную инициализацию компоновщика:


Схема = Документы.ЗаявкаНаПеревозку.ПолучитьМакет("РасчетСчетовКлиенту");

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

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    Схема, 
    КомпоновщикНастроек.ПолучитьНастройки(), 
    , 
    , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);

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

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

Важные особенности работы с параметрами

При работе с параметрами компоновки обратите внимание на следующие нюансы:

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