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

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

Как передать параметры в СКД 1С

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

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

Передать параметры в СКД можно двумя путями: через настройки отчёта в пользовательском режиме и программно — из встроенного языка 1С. Первый способ подходит, когда отчёт уже построен на СКД и параметры описаны в схеме. Второй нужен, когда отчёт формируется из кода: из обработки, команды, расширения или при программном вызове типового отчёта.

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

Как объявить параметр в схеме компоновки

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

Для каждого параметра важны три свойства. «Тип» — должен соответствовать данным, иначе сравнение в запросе будет работать неверно (например, ссылка вместо строки). «Доступные значения» — список выбора, если параметр должен принимать только ограниченный набор значений. Флажок «Ограничение доступности» снимают, если пользователь должен видеть и менять параметр в настройках отчёта.

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

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

В тексте запроса параметр указывается через амперсанд: ГДЕ Продажи.Организация = &Организация. Такой параметр называется явным — СКД передаст в запрос ровно то значение, которое задал пользователь или код.

Более гибкий вариант — условие в фигурных скобках: {ГДЕ (Продажи.Организация = &Организация)}. Тогда, если параметр не заполнен и отбор по нему не установлен, условие просто не попадёт в итоговый запрос, и отчёт покажет данные по всем организациям. Это стандартный способ сделать параметр необязательным без ветвлений в коде.

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

Программная передача параметров из кода

Типовая задача: сформировать отчёт на СКД из обработки или команды, подставив параметры без участия пользователя. Для этого используется связка «КомпоновщикНастроек → ПроцессорКомпоновкиДанных → ПроцессорВыводаРезультата».

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

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

Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));

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

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

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

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

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

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

Программное формирование отчёта на СКД
  1. 1
    Получите схему компоновки через ПолучитьМакет
  2. 2
    Создайте компоновщик настроек и загрузите настройки по умолчанию
  3. 3
    Установите значения параметров через УстановитьЗначениеПараметра
  4. 4
    Создайте процессор компоновки данных и инициализируйте его макетом
  5. 5
    Выведите результат через процессор вывода в табличный документ
  6. 6
    Проверьте, что отчёт содержит данные за заданный период и отбор

Передача параметров в отчёт на управляемой форме

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

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

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

Списки значений и необязательные параметры

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

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

Способы ограничить данные в СКД

Параметр запроса (&Имя)

Обязательное значение, без него запрос не выполнится корректно. Подходит для периода и ключевых измерений.

Условие в фигурных скобках {}

Необязательный параметр: условие применяется только когда значение задано. Хорош для опциональных фильтров.

Отбор в настройках компоновки

Пользователь сам добавляет и включает отборы. Не требует параметров в запросе, но слабее контролируется из кода.

Типичные ошибки и их диагностика

Самая частая ошибка — «Параметр не найден» при программной установке. Причина почти всегда в том, что параметр не объявлен в схеме на закладке «Параметры» или имя в коде не совпадает с именем в схеме (регистр букв значения не имеет, но лишние пробелы и опечатки — имеют). Проверяйте имя копированием из схемы.

Вторая группа ошибок связана с типами: в параметр типа «Дата» передаётся строка, в параметр-ссылку — строковое представление. Запрос при этом либо падает, либо молча возвращает пустой результат, потому что сравнение ссылки со строкой всегда ложно. Перед установкой значения убедитесь, что тип совпадает с типом параметра в схеме.

Третья ситуация — параметр установлен, но отчёт игнорирует его. Так бывает, когда условие в запросе заключено в фигурные скобки, а у параметра снят флажок «Использование» (значение «Всегда»/«Авто»), либо когда пользовательские настройки перекрывают программные. Проверьте, загружаете ли вы настройки по умолчанию и не применяются ли поверх сохранённые пользовательские варианты.

Типичные ошибки при передаче параметров
01
Параметр используется в запросе, но не объявлен на закладке «Параметры» — ошибка при формировании
02
Несовпадение типа значения и типа параметра — пустой результат без сообщений об ошибке
03
Установка параметров после создания процессора компоновки — значения игнорируются
04
Передача стандартного периода напрямую в дату — нужно передавать ДатаНачала и ДатаОкончания отдельно
05
Перезапись программных настроек сохранёнными пользовательскими — параметр «сбрасывается»

Проверка результата

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

Дополнительная проверка — эталонный запрос в консоли запросов с теми же значениями. Если консоль возвращает данные, а отчёт — нет, проблема в настройках компоновки (отборы, варианты), а не в параметрах. Если пусто в обоих случаях — проблема в данных или в самом условии запроса.

Контрольные точки

Как проверить передачу параметров

Итоговый запрос в макете компоновки
Норма

В тексте запроса подставлены заданные значения

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

Пустые значения, NULL или условие отсутствует

Результат отчёта
Норма

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

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

Пустой отчёт или данные за другой период

Эталон в консоли запросов
Норма

Консоль и отчёт возвращают одинаковые данные

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

Консоль возвращает данные, отчёт — нет

Итог

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

Параметр объявляется в схеме, используется в запросе через амперсанд, а программно устанавливается методом УстановитьЗначениеПараметра до создания процессора компоновки. Большинство проблем — это несовпадение имени, типа значения или перекрытие настроек пользовательскими вариантами.

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

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

Напрямую объект «СтандартныйПериод» в параметры дат не передаётся. Создайте два параметра типа «Дата» и передайте в них свойства ДатаНачала и ДатаОкончания стандартного периода. В пользовательских настройках типовые отчёты делают это автоматически через служебные параметры.

Почему отчёт выдаёт ошибку «Параметр не найден»?

Параметр не объявлен на закладке «Параметры» схемы компоновки или имя в коде отличается от имени в схеме. Скопируйте имя прямо из схемы и проверьте, что вы работаете с той же схемой, которая используется при формировании.

Как сделать параметр необязательным?

Заключите условие с параметром в запросе в фигурные скобки: {ГДЕ (Таблица.Поле = &Параметр)}. Если значение не задано, условие не попадёт в итоговый запрос. Альтернатива — использовать отбор в настройках вместо параметра.

Можно ли передать в параметр список значений?

Да. В схеме включите у параметра флажок «Доступен список значений», в запросе используйте оператор В (&Параметр), а из кода передавайте СписокЗначений или массив с элементами подходящего типа.

Почему программно установленный параметр сбрасывается в форме отчёта?

Чаще всего настройки перезагружаются: либо повторно вызывается ЗагрузитьНастройки, либо применяется сохранённый пользовательский вариант. Устанавливайте параметры после загрузки нужного варианта настроек и до формирования отчёта.

Как увидеть итоговый запрос с подставленными параметрами?

Сформируйте макет компоновки данных через КомпоновщикМакетаКомпоновкиДанных и посмотрите текст запроса в макете — там будут реальные значения. В отладчике удобно вывести текст запроса из набора данных макета в сообщение или журнал.