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