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