Отчеты и Аналитика · 11 мин
1С СКД: как программно установить параметр отчета
Как программно установить параметр в СКД 1С: работа с НастройкиКомпоновкиДанных, ПараметрыДанных, установка периодов и отборов, типовые ошибки и примеры кода.
Программная установка параметров в системе компоновки данных (СКД) — одна из самых частых задач при доработке отчетов в 1С. Она возникает, когда отчет формируется из кода: по расписанию, из обработки, при открытии формы с предопределенными значениями или когда нужно скрыть от пользователя технические параметры, задав их в обход интерактивных настроек.
Главная сложность в том, что параметры СКД живут не в самой схеме, а в настройках компоновщика, и обращаться к ним нужно через специальную коллекцию ПараметрыДанных. Попытка присвоить значение «напрямую» по имени приводит либо к ошибке, либо к ситуации, когда параметр вроде бы установлен, но отчет его не учитывает.
Ниже разобраны рабочие способы установки параметров: через настройки отчета на форме, через компоновщик настроек в коде, через объект отчета и при полностью программном формировании. Отдельно рассмотрены периоды, списки значений, флаги использования и типичные ошибки, из-за которых параметр «не применяется».
Где хранятся параметры СКД и почему важен контекст
В СКД параметры описаны на вкладке «Параметры» схемы компоновки данных, но их текущие значения хранятся в настройках. У отчета может быть несколько уровней настроек: основные настройки схемы, пользовательские настройки, настройки варианта. Программно чаще всего работают с КомпоновщикНастроек.Настройки — именно оттуда отчет берет значения при формировании.
Ключевой объект — Настройки.ПараметрыДанных. Это коллекция элементов типа ЗначениеПараметраНастроекКомпоновкиДанных, у каждого есть свойства Параметр (объект типа ПараметрКомпоновкиДанных), Значение и Использование. Если Использование = Ложь, параметр игнорируется, даже когда значение заполнено — это причина номер один «неработающих» параметров.
Установка параметра на форме отчета
Типовой отчет на управляемой форме имеет реквизит Отчет, у которого доступен КомпоновщикНастроек. Установить параметр можно в обработчике ПриСозданииНаСервере или в любой команде. Базовый прием — метод УстановитьЗначениеПараметра, доступный у коллекции параметров данных:
Настройки = Отчет.КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организация", ВыбраннаяОрганизация);
Метод сам находит параметр по имени, присваивает значение и устанавливает Использование = Истина. Если параметра с таким именем нет в схеме, метод вернет Неопределено и не вызовет ошибку — поэтому результат стоит проверять, особенно когда схема может меняться.
Альтернатива — явный поиск элемента через НайтиЗначениеПараметра. Этот способ нужен, когда требуется не только значение, но и управление флагом использования или режимом отображения:
ЭлементПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
Если ЭлементПараметра <> Неопределено Тогда
ЭлементПараметра.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ЭлементПараметра.Использование = Истина;
КонецЕсли;
Программное формирование отчета без формы
Когда отчет формируется из регламентного задания, обработки или фонового задания, формы нет, и весь процесс выполняется вручную: создается схема, загружаются настройки, устанавливаются параметры, выполняется компоновка и вывод в табличный документ.
Схема = Отчеты.ПродажиПоМенеджерам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(ТекущаяДата()));
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Обратите внимание: при работе с НастройкиПоУмолчанию вы получаете копию настроек из схемы, и все изменения действуют только в рамках этого формирования. Это безопасный сценарий — пользовательские настройки отчета не затрагиваются.
Если в запросе схемы используются виртуальные таблицы с параметрами (например, Остатки(&Период, )), значения должны быть установлены до выполнения компоновки макета. Пропущенный обязательный параметр приведет к ошибке на этапе КомпоновщикМакета.Выполнить или к пустому результату.
- 1Получите схему компоновки данных через ПолучитьМакет
- 2Возьмите НастройкиПоУмолчанию или загрузите сохраненные настройки
- 3Установите параметры через ПараметрыДанных.УстановитьЗначениеПараметра
- 4Проверьте, что у обязательных параметров Использование = Истина
- 5Выполните компоновку макета и выведите результат в табличный документ
Работа с периодами, датами и списками
Стандартные периоды
Если параметр в схеме объявлен как СтандартныйПериод, присваивать ему нужно именно объект СтандартныйПериод, а не две отдельные даты. Присвоение даты в такой параметр приведет к несоответствию типов или неочевидному поведению при формировании.
Период = Новый СтандартныйПериод;
Период.ДатаНачала = НачалоКвартала(ТекущаяДата());
Период.ДатаОкончания = КонецКвартала(ТекущаяДата());
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Период);
Даты как границы периода
Для параметров типа «Дата», используемых как границы, помните про время: КонецДня дает 23:59:59, тогда как просто дата — это начало дня 00:00:00. Если в запросе условие <= &КонецПериода и передано начало дня, последний день в отчет не попадет. Это одна из самых коварных причин «расхождения на один день».
Списки значений
Когда параметр допускает список (в схеме установлен флаг «Доступен список значений»), передавать нужно СписокЗначений или массив — в зависимости от того, как параметр используется в запросе. Для условия В (&СписокОрганизаций) обычно передают массив или список значений; скалярное значение в таком параметре тоже допустимо, если список не обязателен.
СписокОрг = Новый СписокЗначений;
СписокОрг.Добавить(Организация1);
СписокОрг.Добавить(Организация2);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организации", СписокОрг);
Установка параметров в расширениях и внешних отчетах
Во внешнем отчете схема получается через ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") в модуле объекта, либо через Отчеты[ИмяОтчета] после регистрации в справочнике дополнительных отчетов. Логика установки параметров не меняется — меняется только способ получения схемы и настроек.
Если отчет открывается пользователю с предустановленными параметрами, удобно передать их через параметры формы и установить в ПриСозданииНаСервере до первого формирования. После установки вызовите формирование, иначе пользователь увидит старый или пустой результат:
// В ПриСозданииНаСервере формы отчета
Если Параметры.Свойство("Организация") Тогда
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных
.УстановитьЗначениеПараметра("Организация", Параметры.Организация);
КонецЕсли;
В типовых конфигурациях на БСП у формы отчета есть механизм ФормаПараметры.Отбор и событие загрузки пользовательских настроек. Если параметр устанавливается до применения пользовательских настроек, они могут перекрыть ваше значение. В таком случае устанавливайте параметр после загрузки настроек или модифицируйте пользовательские настройки, а не основные.
Проверка результата и отладка
Простейшая проверка — прочитать значение обратно после установки и убедиться, что Использование = Истина. Для отладки удобно вывести итоговый запрос: в толстом клиенте или через консоль СКД можно посмотреть макет компоновки, где видно, какие параметры реально подставлены в запрос.
Признак того, что параметр применился: в тексте запроса макета компоновки появляется условие с конкретным значением, а результат отчета меняется при смене значения. Если результат не меняется — проверяйте флаг использования, имя параметра и то, не перезаписывают ли значение пользовательские настройки или код в событии ПриКомпоновкеРезультата.
Как проверить результат
Использование = Истина
Ложь — параметр игнорируется
Совпадает с переданным
Неопределено или старое значение — параметр не найден по имени
Данные меняются
Результат идентичен — параметр не участвует в запросе или перекрыт настройками
FAQ
Как установить параметр, если отчет построен на произвольном запросе без СКД?
Тогда параметры устанавливаются напрямую в объект Запрос через Запрос.УстановитьПараметр("Имя", Значение). Механизм ПараметрыДанных относится только к отчетам на СКД.
Почему параметр виден пользователю, хотя я устанавливаю его программно?
Видимость управляется настройками параметра на вкладке «Параметры» схемы: уберите параметр из пользовательских настроек или установите режим редактирования «Недоступен». Программная установка значения на видимость не влияет.
Как задать параметр в событии ПриКомпоновкеРезультата модуля отчета?
Используйте параметр Настройки, переданный в обработчик: Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Имя", Значение). Это последняя точка, где значение можно изменить до выполнения запроса.
Можно ли установить несколько параметров одним вызовом?
Отдельного пакетного метода нет — каждый параметр устанавливается своим вызовом УстановитьЗначениеПараметра. Для массовой установки удобно передать структуру «имя — значение» и обойти её циклом.
Что делать, если параметр называется так же, как поле отбора?
Это разные коллекции: параметры живут в ПараметрыДанных, отборы — в Настройки.Отбор.Элементы. Установка значения в одной коллекции не влияет на другую, даже если имена совпадают.
Как сбросить параметр к значению по умолчанию из схемы?
Установите элементу параметра Использование = Ложь — тогда отчет возьмет значение по умолчанию, заданное на вкладке «Параметры» схемы компоновки данных, либо параметр останется незаполненным, если умолчание не задано.
Что важно запомнить
Параметры СКД устанавливаются через Настройки.ПараметрыДанных: методом УстановитьЗначениеПараметра или поиском элемента с явным выставлением Использование = Истина. Следите за типами (СтандартныйПериод, конец дня, списки) и за тем, чтобы пользовательские настройки не перекрыли программно заданные значения.