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

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

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

Определяем тип данных: корень большинства проблем

Первым делом проанализируем ситуацию, описанную в теме: попытка сравнить медицинский документ с текстовой строкой "Заключение" не увенчалась успехом. Выясним причину. В системе 1С:Предприятие поля в базе данных редко являются простыми строками. Чаще всего это ссылки на элементы справочников, документов или перечислений.

Важное правило: тип значения, которое вы передаете в параметр, должен строго соответствовать типу поля в базе данных. Если реквизит ШаблонМедицинскогоДокумента имеет тип СправочникСсылка.Шаблоны, то передача туда текста "Заключение" приведет к тому, что система не найдет совпадений, так как ссылка не равна строке.

Для решения этой проблемы выполним следующие шаги:

  1. Откроем конфигуратор.
  2. Найдем интересующий нас объект (в данном случае МедицинскийДокумент).
  3. Посмотрим тип реквизита ШаблонМедицинскогоДокумента.

Если тип — ссылка, то в запросе мы должны оперировать именно ссылкой.

Использование функции ЗНАЧЕНИЕ в тексте запроса

Если нам нужно жестко ограничить выборку конкретным шаблоном, который точно не изменится, мы можем использовать функцию ЗНАЧЕНИЕ(). Однако здесь есть важный нюанс: эта функция работает только с предопределенными элементами справочников или значениями перечислений.

Рассмотрим правильный синтаксис:


ГДЕ МедицинскийДокумент.ШаблонМедицинскогоДокумента = ЗНАЧЕНИЕ(Справочник.ШаблоныДокументов.Заключение)

Если элемент "Заключение" был создан пользователем в режиме "1С:Предприятие" (а не в конфигураторе), функция ЗНАЧЕНИЕ() его "не увидит". В этом случае необходимо использовать именно параметры.

Тонкая настройка на закладке «Параметры» в СКД

Разберем, как сделать работу с параметром удобной. После того как мы добавили &ШаблонМедицинскогоДокумента в текст запроса, перейдем на закладку Параметры в конструкторе СКД. Посмотрим на доступные настройки:

  1. Ограничение доступности: если мы хотим, чтобы параметр заполнялся только программно или имел значение по умолчанию без возможности изменения пользователем, установим этот флаг.
  2. Тип: всегда старайтесь ограничивать тип параметра. Вместо "Любая ссылка" укажите конкретный справочник. Это позволит системе предлагать пользователю только нужные элементы (автоподбор).
  3. Выражение: это мощный инструмент. Мы можем написать здесь выражение на языке СКД. Например, если нам все же нужно найти элемент по наименованию, мы можем использовать конструкцию:

Справочники.ШаблоныДокументов.НайтиПоНаименованию("Заключение")

Однако помните: поиск по наименованию — это "плохой тон" в разработке, так как пользователи могут изменить название элемента, и отчет перестанет работать.

Программная установка параметров

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Стандартную обработку можно отключить, если формируем отчет полностью кодом
    // СтандартнаяОбработка = Ложь;

    // Получаем ссылку на параметр
    ПараметрШаблон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ШаблонМедицинскогоДокумента");
    
    Если ПараметрШаблон <> Неопределено Тогда
        ПараметрШаблон.Значение = НужнаяНамСсылкаНаШаблон;
        ПараметрШаблон.Использование = Истина;
    КонецЕсли;

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

Этот метод гарантирует, что в запрос попадет именно тот объект, который нам нужен.

Работа со списками значений

Проанализируем ситуацию, когда пользователю нужно выбрать не один шаблон, а сразу несколько. В тексте запроса оператор равенства = работать не будет. Нам нужно изменить условие:

ГДЕ МедицинскийДокумент.ШаблонМедицинскогоДокумента В (&СписокШаблонов)

В настройках СКД на закладке Параметры для &СписокШаблонов обязательно установим галочку Доступен список значений. Теперь пользователь сможет нажать на кнопку подбора и выбрать несколько элементов из справочника.

Оптимизация: параметры виртуальных таблиц

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


ВЫБРАТЬ
    РегистрСведений.СведенияОДокументах.Количество
ИЗ
    РегистрСведений.СведенияОДокументах.СрезПоследних(&Период, Шаблон = &Шаблон)

Почему это важно? Использование параметров виртуальной таблицы позволяет СУБД отсечь ненужные данные на самом раннем этапе, что значительно ускоряет формирование отчета на больших объемах данных.

Использование стандартных периодов

Часто в паре с параметрами типа "Ссылка" идут параметры дат. Чтобы пользователю было удобно, разберем механизм Стандартного периода. Вместо двух параметров &НачалоПериода и &КонецПериода создадим один параметр &ПериодОтчета с типом СтандартныйПериод. В свойствах же реальных параметров запроса (начало и конец) в колонке Выражение укажем:

Сами параметры дат сделаем скрытыми (флаг Ограничение доступности). Таким образом, пользователь выбирает "Прошлый месяц" или "Этот квартал", а СКД автоматически подставляет нужные границы дат в запрос.

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

← На главную