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

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

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

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

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

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

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

Как добавить параметр в схему компоновки данных

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

В колонке «Значение» можно указать значение по умолчанию — оно подставится, если пользователь или код не задали свое. Для дат удобно использовать выражения на языке выражений компоновки, например подстановку начала текущего месяца.

После добавления параметр становится доступен в тексте запроса на закладке «Наборы данных». Обращение к параметру выполняется через амперсанд: ГДЕ Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода. Имя в запросе должно точно совпадать с именем параметра — регистр букв роли не играет, а лишний символ приведет к ошибке.

Как передать параметр программно из кода

Когда отчет формируется из обработки, команды или кнопки на форме, параметры устанавливаются через объект настроек компоновщика. Типовой код для отчета на СКД выглядит так:

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

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

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

Новый ПараметрКомпоновкиДанных("Организация"));

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

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

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

КонецЕсли;

Два момента здесь критичны. Во-первых, флаг Использование должен быть включен — без него параметр со значением просто игнорируется, и отчет формируется без отбора. Во-вторых, поиск параметра выполняется по объекту ПараметрКомпоновкиДанных, а не по строке — это частая причина, почему «программно параметр не передается».

Если параметр объявлен в схеме с установленным флагом «Ограничение доступности», он не попадает в пользовательские настройки, но остается доступным в Настройки.ПараметрыДанных — это штатный способ скрыть служебные параметры от пользователя, сохранив возможность задавать их из кода.

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

Передача стандартного периода и дат

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

Если период передается двумя параметрами НачалоПериода и КонецПериода типа «Дата», учитывайте границы: дата без времени означает начало дня (00:00:00). Отбор Период <= &КонецПериода со значением 31.01 без времени отсечет все документы, проведенные в течение 31 января после полуночи. Используйте функцию запроса КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) или условие «МЕЖДУ» с явным приведением.

Программно стандартный период создается так:

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

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

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

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

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

Передача списка значений и массива

Когда нужно отфильтровать отчет по нескольким контрагентам или складам, параметру присваивают СписокЗначений или массив, а в запросе используют оператор В:

ГДЕ Продажи.Контрагент В (&СписокКонтрагентов)

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

Для иерархических справочников используйте В ИЕРАРХИИ (&Группа), если нужно включить в отбор вложенные элементы группы. Обычный оператор «В» по группе вложенные элементы не подберет.

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

Настройка видимости параметра для пользователя

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

Типовая практика: период и организацию делают доступными пользователю, а служебные параметры (например, текущий пользователь, технические константы) скрывают ограничением доступности и заполняют программно в обработчике ПриКомпоновкеРезультата модуля объекта отчета.

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

Способы передачи параметра

Значение по умолчанию в схеме

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

Программно через ПараметрыДанных

Подходит для формирования из кода, команд, обработок. Требует контроля флага Использование и точного имени

Через пользовательские настройки

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

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

Быстрый способ проверить, какой параметр реально попал в запрос, — открыть сформированный отчет, перейти в меню «Еще — Изменить вариант» и посмотреть закладку с параметрами: там видны фактические значения и состояние флага использования. Если параметр присутствует, но выключен — причина найдена.

При программной отладке остановитесь точкой останова после установки параметров и проверьте в табло: Настройки.ПараметрыДанных.НайтиЗначениеПараметра(...).Значение. Значение Неопределено при корректном коде почти всегда означает опечатку в имени параметра или то, что параметр не объявлен в схеме.

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

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

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

Параметр в настройках варианта отчета
Норма

Виден, включен, содержит ожидаемое значение

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

Отсутствует, выключен или значение пустое

Результат отчета после установки отбора
Норма

Данные сократились в соответствии с условием

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

Набор данных не изменился — параметр игнорируется

Поиск параметра из кода
Норма

НайтиЗначениеПараметра возвращает объект настройки

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

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

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

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

Почти всегда причина в выключенном флаге «Использование» у элемента настройки параметра. Установите его в Истина вместе со значением. Вторая возможная причина — вы изменили одни настройки, а отчет формируется с другими (например, с пользовательскими настройками варианта, которые перекрывают ваши изменения).

Как передать параметр, если отчет открывается стандартной командой без кода?

Используйте значение по умолчанию на закладке «Параметры» схемы компоновки. Для динамических значений (текущая дата, текущий пользователь) задайте выражение на языке выражений СКД в колонке «Выражение» либо установите параметр в обработчике ПриКомпоновкеРезультата модуля отчета.

Можно ли передать в параметр таблицу значений?

Напрямую таблицу значений в параметр запроса СКД передать нельзя. Обходной путь — поместить данные во временную таблицу через менеджер временных таблиц при программной компоновке, либо использовать внешний набор данных (объект типа ТаблицаЗначений), который передается в процессор компоновки отдельно от параметров.

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

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

Почему возникает ошибка «Неверные параметры в операции сравнения»?

Тип значения параметра не совпадает с типом поля в условии запроса — например, в параметр типа «Строка» передана ссылка, или параметр создан автоматически с произвольным типом. Откройте закладку «Параметры» схемы и задайте параметру точный тип, совпадающий с типом сравниваемого поля.

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

Не включайте для него флаг обязательности и формируйте условие запроса с проверкой: например, конструкция вида «ГДЕ (&Контрагент = НЕОПРЕДЕЛЕНО ИЛИ Продажи.Контрагент = &Контрагент)». Альтернатива — не задавать параметру флаг Использование и оформлять условие через отбор компоновки, который пользователь включает по желанию.

Итог

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

Параметр объявляется на закладке «Параметры» схемы, в запросе используется через амперсанд, а программно устанавливается через Настройки.ПараметрыДанных с обязательным включением флага Использование. Большинство проблем решаются проверкой имени параметра, его типа и фактического значения в настройках варианта отчета.