К статье
Практический материал

Отчеты и Аналитика · 11 мин

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

Как программно установить параметры в СКД 1С: через КомпоновщикНастроек, ПараметрыДанных, на форме отчёта и при выводе программно. Примеры кода, ошибки, FAQ.

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

Главная сложность в том, что параметры СКД живут в нескольких местах одновременно: в схеме компоновки, в настройках компоновщика и в параметрах данных. Установка значения «не туда» — самая частая причина, почему отчёт игнорирует переданное значение. Ниже разобраны рабочие способы с примерами кода и типичными ошибками.

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

В схеме компоновки данных параметры объявляются на закладке «Параметры» конструктора СКД. Там задаётся имя, тип, значение по умолчанию и признаки «Ограничение доступности» и «Включать в доступные поля». Эти объявления — лишь описание: сами значения хранятся в настройках.

Рабочие значения находятся в коллекции Настройки.ПараметрыДанных у компоновщика настроек. Каждый элемент коллекции — объект ЗначениеПараметраНастроекКомпоновкиДанных со свойствами Использование и Значение. Если Использование = Ложь, параметр считается неустановленным, даже если значение заполнено.

Отдельно стоит помнить про параметры виртуальных таблиц запроса (например, Остатки(&Период, Склад = &Склад)). СКД автоматически создаёт для них параметры с префиксом вроде «Период», и их тоже нужно заполнять через ту же коллекцию ПараметрыДанных.

Базовый способ: установка параметра через ПараметрыДанных

Универсальный код установки параметра выглядит так:

ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Организация"));

Если ПараметрСКД <> Неопределено Тогда

ПараметрСКД.Использование = Истина;

ПараметрСКД.Значение = ВыбраннаяОрганизация;

КонецЕсли;

Метод НайтиЗначениеПараметра принимает объект ПараметрКомпоновкиДанных с именем параметра. Поиск по имени через обход коллекции Элементы тоже возможен, но НайтиЗначениеПараметра корректнее: он учитывает иерархию и вложенные группировки настроек.

Обязательно проверяйте результат на Неопределено: если параметра с таким именем в схеме нет (опечатка, параметр переименовали), обращение к свойствам вызовет ошибку. Тихая проверка позволяет диагностировать проблему, а не получать падение кода.

Порядок действий при установке параметра
  1. 1
    Убедитесь, что параметр объявлен в схеме компоновки на закладке «Параметры»
  2. 2
    Получите настройки компоновщика (или сформируйте их из схемы)
  3. 3
    Найдите параметр методом НайтиЗначениеПараметра
  4. 4
    Установите Использование = Истина и присвойте Значение
  5. 5
    Сформируйте отчёт и проверьте результат

Установка параметров на форме отчёта

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

&НаСервере

Процедура УстановитьПараметрПериода()

Настройки = Отчет.КомпоновщикНастроек.Настройки;

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("Период"));

Если Параметр <> Неопределено Тогда

Параметр.Использование = Истина;

Параметр.Значение = ТекущаяДатаСеанса();

КонецЕсли;

КонецПроцедуры

В управляемых формах настройки часто оборачиваются в КомпоновщикНастроек.ПользовательскиеНастройки. Если параметр вынесен в пользовательские настройки (быстрый доступ), изменять нужно именно элемент пользовательских настроек — иначе интерфейс перезапишет ваше значение при следующем обновлении формы.

Признак того, что параметр живёт в пользовательских настройках: у элемента в Настройки.ПараметрыДанных заполнено свойство ИдентификаторПользовательскойНастройки. Тогда ищите соответствующий элемент в коллекции КомпоновщикНастроек.ПользовательскиеНастройки.Элементы по этому идентификатору.

Полностью программное формирование отчёта

Когда отчёт формируется без формы — в фоновом задании, обработке, при рассылке — используется классическая цепочка: схема → компоновщик макета → процессор компоновки → процессор вывода. Параметры устанавливаются до создания макета компоновки:

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

Настройки = СхемаКД.НастройкиПоУмолчанию;

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

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

Параметр.Использование = Истина;

Параметр.Значение = НачалоМесяца(ТекущаяДатаСеанса());

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Результат = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Ключевой момент: КомпоновщикМакета.Выполнить() «запекает» значения параметров в макет компоновки. Изменить параметры после выполнения компоновщика макета уже нельзя — нужно пересоздавать макет. Это частая причина «отчёт не видит новое значение».

Если нужны данные из внешних наборов (таблицы значений), их передают в Инициализировать вторым параметром — структурой с наборами данных. Параметры при этом устанавливаются так же, до компоновки макета.

Работа с периодами и стандартными датами

Для параметров типа СтандартныйПериод СКД автоматически создаёт дочерние параметры НачалоПериода и КонецПериода. Устанавливать можно либо родительский параметр целиком, либо дочерние по отдельности:

СтандартныйПериод = Новый СтандартныйПериод;

СтандартныйПериод.ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса());

СтандартныйПериод.ДатаОкончания = КонецМесяца(ТекущаяДатаСеанса());

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("Период"));

Параметр.Использование = Истина;

Параметр.Значение = СтандартныйПериод;

Обратите внимание на границы дат: КонецДня() или КонецМесяца() возвращают время 23:59:59, что корректно для сравнений «меньше или равно». Если в запросе используется строгое «меньше», передайте начало следующего дня — иначе потеряете документы последнего дня или, наоборот, захватите лишние.

Списки значений и параметры-массивы

Если параметр в схеме объявлен с доступным списком значений (галочка «Доступен список значений»), в Значение передаётся СписокЗначений, а не массив:

СписокСкладов = Новый СписокЗначений;

СписокСкладов.Добавить(СкладОсновной);

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

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

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

Параметр.Использование = Истина;

Параметр.Значение = СписокСкладов;

В запросе такой параметр используется с оператором В (&Склад) или В ИЕРАРХИИ. Если передать одиночное значение туда, где ожидается список, или наоборот, компоновка либо выдаст ошибку, либо молча отфильтрует всё. Проверяйте тип параметра на закладке «Параметры» схемы.

Проверка результата и типичные ошибки

После установки параметров сформируйте отчёт и проверьте, что данные соответствуют ожиданиям: отбор по организации действительно сужает выборку, период ограничивает даты, пустой результат объясним. Если отчёт игнорирует параметр — смотрите список ошибок ниже.

Типичные ошибки
01
Не установлено Использование = Истина: значение заполнено, но СКД считает параметр отключённым и не применяет его
02
Параметры меняются после КомпоновщикМакета.Выполнить: макет уже содержит старые значения, нужна перекомпоновка
03
Опечатка в имени параметра: НайтиЗначениеПараметра возвращает Неопределено, код молча пропускает установку
04
Значение установлено в Настройки, а параметр вынесен в ПользовательскиеНастройки: интерфейс перезаписывает значение
05
Передан массив вместо СпискаЗначений для параметра со списком: ошибка компоновки или пустой результат
06
В схеме у параметра включено «Ограничение доступности», и он недоступен в текущем варианте настроек
Контрольные точки

Как проверить результат

НайтиЗначениеПараметра вернул объект
Норма

Параметр найден, свойства доступны

Тревожный признак

Возвращено Неопределено — проверьте имя параметра в схеме

Свойства после установки
Норма

Использование = Истина, Значение нужного типа

Тревожный признак

Использование = Ложь или тип значения не совпадает с типом параметра

Данные в сформированном отчёте
Норма

Отборы и период соответствуют переданным значениям

Тревожный признак

Отчёт показывает все данные — параметр не применился

Для отладки удобно временно вывести в сообщение имя параметра, его значение и флаг использования сразу перед формированием. Это быстро локализует, на каком этапе значение теряется.

Итог

Что важно запомнить

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

Частые вопросы

Как задать значение параметра по умолчанию, чтобы пользователь мог его изменить?

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

Почему НайтиЗначениеПараметра возвращает Неопределено?

Чаще всего — опечатка в имени или параметр не объявлен в схеме. Также проверьте, что вы ищете в правильных настройках: у варианта отчёта могут быть собственные настройки, отличные от НастройкиПоУмолчанию. Имена параметров чувствительны к точному написанию, включая «НачалоПериода» и «КонецПериода» для стандартных периодов.

Как программно установить отбор, а не параметр?

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

Можно ли передать параметры при открытии отчёта через команду?

Да. Сформируйте структуру параметров формы с ключом, совпадающим с именем параметра СКД (для типовых отчётов на БСП часто используется ключ «Отбор» или генерация настроек), и передайте её в ОткрытьФорму("Отчет.ИмяОтчёта.Форма", ПараметрыФормы). В типовых конфигурациях надёжнее формировать пользовательские настройки и передавать их через параметр формы «ПользовательскиеНастройки».

Чем параметр отличается от отбора в СКД?

Параметр подставляется в текст запроса и в параметры виртуальных таблиц — он влияет на сам запрос к базе и обычно обязателен к заполнению. Отбор применяется компоновкой к уже полученным данным и может быть отключён пользователем. Для периодов и обязательных условий используйте параметры, для опциональных фильтров — отборы.

Как установить параметр в фоновом задании для рассылки отчёта?

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