СКД в 1С

Параметры СКД в 1С программно: как задать и передать значение

Коротко

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

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

Где в СКД живут параметры и что именно задаётся программно

В схеме компоновки есть три разных «слоя» параметров, и путать их — источник большинства проблем:

  • Параметры схемы (СхемаКомпоновкиДанных.Параметры) — объявление: имя, тип, значение по умолчанию, доступность списка значений.
  • Параметры данных настроек (Настройки.ПараметрыДанных) — значения, с которыми схема будет исполнена. Именно сюда пишет код.
  • Параметры запроса набора данных — подставляются платформой из параметров данных по совпадению имени, руками их заполнять не нужно.

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

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

В модуле объекта отчёта схема уже подключена, а настройки доступны через свойство КомпоновщикНастроек. Установка параметра СКД программно — одна строка:

// Модуль объекта отчёта, ПередЗагрузкойНастроекВКомпоновщик / ПриКомпоновкеРезультата
Настройки = КомпоновщикНастроек.Настройки;

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

Имя параметра — то, что задано в конструкторе схемы на закладке «Параметры», с учётом регистра. Вместо строки можно передать объект: Новый ПараметрКомпоновкиДанных("НачалоПериода") — это удобно, когда имя вычисляется в цикле.

Метод не возвращает результат проверки: если параметра с таким именем в схеме нет, значение просто не окажет эффекта. Проверять существование нужно отдельно — см. следующий раздел.

Параметры СКД: значение, Использование и проверка наличия

Когда нужно прочитать текущее значение параметра СКД, изменить его условно или снять использование, берут элемент коллекции методом НайтиЗначениеПараметра():

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

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

Ключевая разница: УстановитьЗначениеПараметра() и записывает значение, и включает Использование. Прямая запись в свойство Значение флаг не трогает — параметр останется выключенным, а в отчёт уйдёт значение по умолчанию из схемы. Возврат Неопределено означает, что параметра с таким именем в настройках нет: опечатка в имени или параметр объявлен во вложенной схеме.

В ИИ Консоли запросов: вставьте текст набора данных и опишите, какие отборы должны стать параметрами. Агент подскажет, какие параметры объявлены в схеме и под какими именами их ждёт запрос, — это быстрее, чем ловить пустой результат из-за расхождения имени в коде и в схеме.

Задать параметры СКД программно во внешней обработке

Если отчёта как объекта конфигурации нет, схему, настройки и макет компоновки собирают руками. Полный цикл «схема → параметры → макет → процессор → табличный документ» выглядит так:

Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

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

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

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

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

Порядок здесь принципиален: параметры устанавливаются до вызова Выполнить(). Компоновщик макета фиксирует значения в макете компоновки, поэтому правка настроек после получения макета на результат уже не влияет.

Обратите внимание на пропущенный второй аргумент Инициализировать() — это ВнешниеНаборыДанных. Если в схеме есть набор данных типа «Объект», в него передают структуру с таблицей значений.

ВнешниеДанные = Новый Структура;
ВнешниеДанные.Вставить("ТаблицаОстатков", ТаблицаОстатков);

Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных.Инициализировать
Макетмакет компоновки данных
ВнешниеНаборыДанныхструктура «имя набора — данные»
ДанныеРасшифровкитот же объект, что и в Выполнить
МенеджерВременныхТаблицобщие временные таблицы

Как передать параметр в отчёт из внешнего кода

Чтобы передать параметр в отчёт конфигурации из обработки, регламентного задания или другого модуля, получают объект отчёта, заполняют его компоновщик и компонуют результат:

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

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

ТабДок = Новый ТабличныйДокумент;
Отчет.СкомпоноватьРезультат(ТабДок);

Метод СкомпоноватьРезультат(<Результат>, <ИнформацияРасшифровки>) сам соберёт макет по текущим настройкам компоновщика — отдельно вызывать компоновщик макета не нужно. Если отчёт открывается на форме, а параметры нужно навязать до вывода, тот же код помещают в обработчик ПриКомпоновкеРезультата модуля отчёта, там доступен КомпоновщикНастроек с уже применёнными пользовательскими настройками.

Параметры запроса СКД: чем отличаются от параметров схемы

Параметры запроса в наборе данных СКД не заполняются кодом напрямую. Платформа связывает &Параметр из текста запроса с одноимённым параметром схемы и подставляет значение из ПараметрыДанных:

ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    Продажи.Сумма      КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ГДЕ
    Продажи.Организация = &Организация

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

Стандартный параметр Период обычно используют для виртуальных таблиц остатков, а пара НачалоПериода/КонецПериода — для оборотов. Если в схеме объявлен Период типа СтандартныйПериод, в код передают именно объект стандартного периода, а не дату.

Передать список значений в параметр СКД

Параметр СКД спокойно принимает СписокЗначений или Массив — при условии, что в схеме у параметра включён флаг «Доступен список значений», а в запросе используется оператор В:

СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(СкладОсновной);
СписокСкладов.Добавить(СкладРезерв);

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

// В наборе данных: ГДЕ Остатки.Склад В (&СписокСкладов)

Пустой список означает «ни одной записи», а не «без отбора». Если отбор должен быть необязательным, добавьте в запрос флаг использования (&ОтбиратьПоСкладу = ЛОЖЬ ИЛИ Склад В (&СписокСкладов)) либо снимайте Использование у параметра.

В ИИ Консоли запросов: попросите агента собрать запрос набора данных сразу с необязательными отборами по списку значений и проверить его на вашей базе. Готовый текст останется перенести в схему компоновки, а в коде — только заполнить параметры.

Параметры СКД в пользовательских настройках

Если параметр выведен в пользовательские настройки (у него заполнен ИдентификаторПользовательскойНастройки), значение из Настройки.ПараметрыДанных может быть перекрыто при загрузке пользовательских настроек. Приоритет — у того, что загружено последним:

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

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

Когда параметр нужно жёстко зафиксировать и запретить его правку пользователем, используйте ЗагрузитьФиксированныеНастройки() — значения оттуда применяются поверх обычных настроек и недоступны для интерактивного изменения.

Частые ошибки при установке параметров СКД программно

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

Частые вопросы о параметрах СКД

Почему параметр СКД, установленный программно, не применяется?

Чаще всего у параметра выключено Использование (значение присвоено напрямую в свойство Значение) либо параметр задан уже после КомпоновщикМакета.Выполнить(). Ещё вариант — расхождение имени параметра в коде и в схеме: тогда НайтиЗначениеПараметра() возвращает Неопределено.

Чем параметры схемы компоновки отличаются от параметров запроса?

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

Как передать в параметр СКД список значений?

Передайте СписокЗначений или Массив в УстановитьЗначениеПараметра(), включите у параметра схемы флаг «Доступен список значений» и используйте в запросе оператор В. Пустой список даст пустой результат, а не отключение отбора.

Тарифы

ИИ Консоль запросов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

Популярный выбор
990 руб. в месяц
≈ 5 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

3900 руб. в месяц
≈ 19,5 млн токенов

Для интенсивного использования или команд

Выбрать тариф