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