Параметры СКД в 1С программно: как задать и передать значение
Чтобы установить параметры СКД программно, доберитесь до настроек компоновки и вызовите
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Имя", Значение).
В модуле отчёта настройки берутся из КомпоновщикНастроек.Настройки, во внешней
обработке — из КомпоновщикНастроекКомпоновкиДанных после
Инициализировать() и ЗагрузитьНастройки().
УстановитьЗначениеПараметра() заодно включает признак Использование.
Если значение выставляется напрямую через НайтиЗначениеПараметра(), флаг
Использование нужно поднимать вручную — иначе параметр молча уйдёт со значением
по умолчанию из схемы.
Где в СКД живут параметры и что именно задаётся программно
В схеме компоновки есть три разных «слоя» параметров, и путать их — источник большинства проблем:
-
Параметры схемы (
СхемаКомпоновкиДанных.Параметры) — объявление: имя, тип, значение по умолчанию, доступность списка значений. -
Параметры данных настроек (
Настройки.ПараметрыДанных) — значения, с которыми схема будет исполнена. Именно сюда пишет код. - Параметры запроса набора данных — подставляются платформой из параметров данных по совпадению имени, руками их заполнять не нужно.
Отсюда правило: программно устанавливают значения параметров данных, а не параметры схемы.
Тип объекта коллекции — ЗначенияПараметровДанныхКомпоновкиДанных, у него всего два
рабочих метода: УстановитьЗначениеПараметра() и НайтиЗначениеПараметра().
Как установить параметры СКД в модуле отчёта
В модуле объекта отчёта схема уже подключена, а настройки доступны через свойство
КомпоновщикНастроек. Установка параметра СКД программно — одна строка:
// Модуль объекта отчёта, ПередЗагрузкойНастроекВКомпоновщик / ПриКомпоновкеРезультата
Настройки = КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организация", ОрганизацияСсылка);
Имя параметра — то, что задано в конструкторе схемы на закладке «Параметры», с учётом регистра.
Вместо строки можно передать объект: Новый ПараметрКомпоновкиДанных("НачалоПериода") —
это удобно, когда имя вычисляется в цикле.
Метод не возвращает результат проверки: если параметра с таким именем в схеме нет, значение просто не окажет эффекта. Проверять существование нужно отдельно — см. следующий раздел.
Параметры СКД: значение, Использование и проверка наличия
Когда нужно прочитать текущее значение параметра СКД, изменить его условно или снять использование,
берут элемент коллекции методом НайтиЗначениеПараметра():
ЗначениеПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Склад"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = СкладСсылка;
ЗначениеПараметра.Использование = Истина; // без этого значение не попадёт в запрос
КонецЕсли;
Ключевая разница: УстановитьЗначениеПараметра() и записывает значение, и включает
Использование. Прямая запись в свойство Значение флаг не трогает — параметр
останется выключенным, а в отчёт уйдёт значение по умолчанию из схемы. Возврат
Неопределено означает, что параметра с таким именем в настройках нет: опечатка в имени
или параметр объявлен во вложенной схеме.
Задать параметры СКД программно во внешней обработке
Если отчёта как объекта конфигурации нет, схему, настройки и макет компоновки собирают руками. Полный цикл «схема → параметры → макет → процессор → табличный документ» выглядит так:
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 1. Компоновщик настроек: инициализация источником доступных настроек
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
// 2. Параметры данных
Настройки = Компоновщик.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоГода(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", ТекущаяДата());
// 3. Макет компоновки и вывод
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(Процессор);
Порядок здесь принципиален: параметры устанавливаются до вызова
Выполнить(). Компоновщик макета фиксирует значения в макете компоновки, поэтому
правка настроек после получения макета на результат уже не влияет.
Обратите внимание на пропущенный второй аргумент Инициализировать() — это
ВнешниеНаборыДанных. Если в схеме есть набор данных типа «Объект», в него передают
структуру с таблицей значений.
ВнешниеДанные = Новый Структура;
ВнешниеДанные.Вставить("ТаблицаОстатков", ТаблицаОстатков);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
Как передать параметр в отчёт из внешнего кода
Чтобы передать параметр в отчёт конфигурации из обработки, регламентного задания или другого модуля, получают объект отчёта, заполняют его компоновщик и компонуют результат:
Отчет = Отчеты.ПродажиПоМенеджерам.Создать();
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(
Отчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоДня(ТекущаяДата()));
ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецДня(ТекущаяДата()));
ТабДок = Новый ТабличныйДокумент;
Отчет.СкомпоноватьРезультат(ТабДок);
Метод СкомпоноватьРезультат(<Результат>, <ИнформацияРасшифровки>) сам соберёт
макет по текущим настройкам компоновщика — отдельно вызывать компоновщик макета не нужно. Если отчёт
открывается на форме, а параметры нужно навязать до вывода, тот же код помещают в обработчик
ПриКомпоновкеРезультата модуля отчёта, там доступен КомпоновщикНастроек
с уже применёнными пользовательскими настройками.
Параметры запроса СКД: чем отличаются от параметров схемы
Параметры запроса в наборе данных СКД не заполняются кодом напрямую. Платформа связывает
&Параметр из текста запроса с одноимённым параметром схемы и подставляет значение
из ПараметрыДанных:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.Сумма КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ГДЕ
Продажи.Организация = &Организация
Три параметра запроса — НачалоПериода, КонецПериода,
Организация — попадут в схему автоматически при заполнении набора данных. Достаточно
задать их значения через УстановитьЗначениеПараметра(). Прямого аналога
Запрос.УстановитьПараметр() в СКД нет: обращение к запросу набора данных из кода не
предусмотрено, весь ввод идёт через параметры данных настроек.
Стандартный параметр Период обычно используют для виртуальных таблиц остатков, а пара
НачалоПериода/КонецПериода — для оборотов. Если в схеме объявлен
Период типа СтандартныйПериод, в код передают именно объект стандартного
периода, а не дату.
Передать список значений в параметр СКД
Параметр СКД спокойно принимает СписокЗначений или Массив — при условии,
что в схеме у параметра включён флаг «Доступен список значений», а в запросе используется оператор
В:
СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(СкладОсновной);
СписокСкладов.Добавить(СкладРезерв);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СписокСкладов", СписокСкладов);
// В наборе данных: ГДЕ Остатки.Склад В (&СписокСкладов)
Пустой список означает «ни одной записи», а не «без отбора». Если отбор должен быть необязательным,
добавьте в запрос флаг использования (&ОтбиратьПоСкладу = ЛОЖЬ ИЛИ Склад В (&СписокСкладов))
либо снимайте Использование у параметра.
Параметры СКД в пользовательских настройках
Если параметр выведен в пользовательские настройки (у него заполнен
ИдентификаторПользовательскойНастройки), значение из
Настройки.ПараметрыДанных может быть перекрыто при загрузке пользовательских настроек.
Приоритет — у того, что загружено последним:
Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
Компоновщик.ЗагрузитьПользовательскиеНастройки(СохранённыеНастройки);
// параметры задаём ПОСЛЕ загрузки пользовательских настроек
Компоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организация", ОрганизацияСсылка);
Когда параметр нужно жёстко зафиксировать и запретить его правку пользователем, используйте
ЗагрузитьФиксированныеНастройки() — значения оттуда применяются поверх обычных настроек
и недоступны для интерактивного изменения.
Частые ошибки при установке параметров СКД программно
-
Значение записано,
Использование— нет. ПрисваиваниеНайтиЗначениеПараметра("X").Значение = ...не включает параметр. Либо ставьтеИспользование = Истина, либо используйтеУстановитьЗначениеПараметра(), который делает это сам. -
Параметры заданы после компоновки макета. После
КомпоновщикМакета.Выполнить()настройки уже зафиксированы в макете компоновки — изменения игнорируются. Устанавливайте параметры до вызова. -
Работа с копией настроек.
КомпоновщикНастроек.ПолучитьНастройки()возвращает объект настроек, который нужно передать в компоновщик макета явно. Если вы правите полученный объект, а компонуете поКомпоновщикНастроек.Настройки, изменения не применятся. -
Опечатка или другой регистр в имени параметра. Ошибки не будет:
УстановитьЗначениеПараметра()молча ничего не сделает, аНайтиЗначениеПараметра()вернётНеопределено. Проверяйте имя по закладке «Параметры» схемы. -
Тип значения не совпадает с типом параметра схемы. Дата вместо
СтандартныйПериод, строка вместо ссылки, массив при выключенном «Доступен список значений» — параметр либо отбросится, либо приведёт к ошибке компоновки. -
Компоновщик не инициализирован. Без
Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема))коллекцияПараметрыДанныхне знает о доступных параметрах и установка значений не даёт эффекта. -
Пустой список значений вместо отсутствия отбора. Условие
В (&Список)с пустым списком не вернёт ни одной строки — нужен явный признак использования отбора.
Частые вопросы о параметрах СКД
Почему параметр СКД, установленный программно, не применяется?
Чаще всего у параметра выключено Использование (значение присвоено напрямую в
свойство Значение) либо параметр задан уже после
КомпоновщикМакета.Выполнить(). Ещё вариант — расхождение имени параметра в коде
и в схеме: тогда НайтиЗначениеПараметра() возвращает Неопределено.
Чем параметры схемы компоновки отличаются от параметров запроса?
Параметры запроса набора данных платформа связывает с одноимёнными параметрами схемы
автоматически. Кодом заполняются только значения в
Настройки.ПараметрыДанных — аналога Запрос.УстановитьПараметр()
для набора данных СКД нет.
Как передать в параметр СКД список значений?
Передайте СписокЗначений или Массив в
УстановитьЗначениеПараметра(), включите у параметра схемы флаг «Доступен список
значений» и используйте в запросе оператор В. Пустой список даст пустой результат,
а не отключение отбора.
ИИ Консоль запросов 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Популярный выборДля индивидуального использования
- До 5ти конфигураций
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Для интенсивного использования или команд
- До 15-ти конфигураций
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка