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