При работе с Системой компоновки данных (СКД) начинающие разработчики часто сталкиваются с ситуацией, когда фильтрация в запросе не срабатывает. Казалось бы, синтаксис верен, параметр прописан, но отчет выдает пустой результат или ошибку. Давайте вместе разберем, почему простая конструкция ГДЕ Поле = &Параметр может не работать, и научимся настраивать параметры профессионально.
Первым делом проанализируем ситуацию, описанную в теме: попытка сравнить медицинский документ с текстовой строкой "Заключение" не увенчалась успехом. Выясним причину. В системе 1С:Предприятие поля в базе данных редко являются простыми строками. Чаще всего это ссылки на элементы справочников, документов или перечислений.
Важное правило: тип значения, которое вы передаете в параметр, должен строго соответствовать типу поля в базе данных. Если реквизит ШаблонМедицинскогоДокумента имеет тип СправочникСсылка.Шаблоны, то передача туда текста "Заключение" приведет к тому, что система не найдет совпадений, так как ссылка не равна строке.
Для решения этой проблемы выполним следующие шаги:
МедицинскийДокумент).ШаблонМедицинскогоДокумента.Если тип — ссылка, то в запросе мы должны оперировать именно ссылкой.
Если нам нужно жестко ограничить выборку конкретным шаблоном, который точно не изменится, мы можем использовать функцию ЗНАЧЕНИЕ(). Однако здесь есть важный нюанс: эта функция работает только с предопределенными элементами справочников или значениями перечислений.
Рассмотрим правильный синтаксис:
ГДЕ МедицинскийДокумент.ШаблонМедицинскогоДокумента = ЗНАЧЕНИЕ(Справочник.ШаблоныДокументов.Заключение)
Если элемент "Заключение" был создан пользователем в режиме "1С:Предприятие" (а не в конфигураторе), функция ЗНАЧЕНИЕ() его "не увидит". В этом случае необходимо использовать именно параметры.
Разберем, как сделать работу с параметром удобной. После того как мы добавили &ШаблонМедицинскогоДокумента в текст запроса, перейдем на закладку Параметры в конструкторе СКД. Посмотрим на доступные настройки:
Справочники.ШаблоныДокументов.НайтиПоНаименованию("Заключение")
Однако помните: поиск по наименованию — это "плохой тон" в разработке, так как пользователи могут изменить название элемента, и отчет перестанет работать.
Иногда значение параметра невозможно определить заранее. Например, оно зависит от настроек текущего пользователя или данных, выбранных в другой форме. В такой ситуации мы воспользуемся модулем объекта отчета. Разберем логику установки значения в событии ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Стандартную обработку можно отключить, если формируем отчет полностью кодом
// СтандартнаяОбработка = Ложь;
// Получаем ссылку на параметр
ПараметрШаблон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ШаблонМедицинскогоДокумента");
Если ПараметрШаблон <> Неопределено Тогда
ПараметрШаблон.Значение = НужнаяНамСсылкаНаШаблон;
ПараметрШаблон.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует, что в запрос попадет именно тот объект, который нам нужен.
Проанализируем ситуацию, когда пользователю нужно выбрать не один шаблон, а сразу несколько. В тексте запроса оператор равенства = работать не будет. Нам нужно изменить условие:
ГДЕ МедицинскийДокумент.ШаблонМедицинскогоДокумента В (&СписокШаблонов)
В настройках СКД на закладке Параметры для &СписокШаблонов обязательно установим галочку Доступен список значений. Теперь пользователь сможет нажать на кнопку подбора и выбрать несколько элементов из справочника.
Если наш отчет строится на базе регистров (например, мы хотим увидеть количество созданных документов по шаблонам), эффективнее передавать условия не в секцию ГДЕ, а непосредственно в параметры виртуальной таблицы. Посмотрим, как это выглядит в конструкторе запроса:
ВЫБРАТЬ
РегистрСведений.СведенияОДокументах.Количество
ИЗ
РегистрСведений.СведенияОДокументах.СрезПоследних(&Период, Шаблон = &Шаблон)
Почему это важно? Использование параметров виртуальной таблицы позволяет СУБД отсечь ненужные данные на самом раннем этапе, что значительно ускоряет формирование отчета на больших объемах данных.
Часто в паре с параметрами типа "Ссылка" идут параметры дат. Чтобы пользователю было удобно, разберем механизм Стандартного периода.
Вместо двух параметров &НачалоПериода и &КонецПериода создадим один параметр &ПериодОтчета с типом СтандартныйПериод.
В свойствах же реальных параметров запроса (начало и конец) в колонке Выражение укажем:
&ПериодОтчета.ДатаНачала&ПериодОтчета.ДатаОкончанияСами параметры дат сделаем скрытыми (флаг Ограничение доступности). Таким образом, пользователь выбирает "Прошлый месяц" или "Этот квартал", а СКД автоматически подставляет нужные границы дат в запрос.
Подведем итог: секрет успеха в работе с параметрами СКД заключается в точном знании типов данных и умелом использовании инструментов настройки компоновщика. Всегда проверяйте, что именно вы сравниваете в запросе, и используйте возможности платформы для автоматизации рутинных операций.