При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с тем, что платформа автоматически превращает поле выбора параметра в выпадающий список (Combo Box). Это удобно, если список значений ограничен несколькими пунктами, но становится крайне неудобным, когда речь идет о справочниках с тысячами элементов (например, «Номенклатура» или «Контрагенты»). В таких случаях пользователю гораздо привычнее и быстрее использовать стандартное окно выбора со всеми функциями поиска и иерархии.
В этой статье мы подробно разберем, как «заставить» управляемую форму отчета показывать стандартную кнопку выбора (три точки) и открывать полноценную форму списка вместо выпадающего перечня.
Прежде чем приступать к написанию кода, проанализируем настройки самой схемы СКД и объектов метаданных. Часто поведение платформы предопределено именно там. Выясним, какие свойства влияют на визуализацию поля:
СправочникСсылка, найдем этот справочник в дереве конфигурации. На вкладке «Представление» проверим свойство Быстрый выбор. Если установлена опция «Использовать», платформа будет навязывать выпадающий список. Попробуем установить «Не использовать».Доступные значения. Если там заполнен список, 1С всегда будет предлагать выбор именно из этого списка в виде выпадающего меню. Чтобы вернуть кнопку выбора, этот список должен быть пустым.Параметры редактирования. Здесь можно явно указать Форму выбора. Иногда простая установка ссылки на конкретную форму заставляет платформу добавить кнопку выбора на форму отчета.Если настройки метаданных не помогают (например, в случае типовых конфигураций, где нельзя менять свойства справочников), нам придется прибегнуть к программному изменению элементов формы. Основная сложность здесь заключается в том, что в СКД элементы управления для быстрых настроек создаются платформой динамически. У них нет фиксированных имен, которые мы могли бы увидеть в конфигураторе.
Разберем алгоритм поиска этих элементов. Платформа генерирует имена полей по следующему шаблону:
"ЗначениеПараметраНастроек_Значение_" + ИдентификаторПользовательскойНастройки"ЭлементОтбора_Значение_" + ИдентификаторПользовательскойНастройкиРассмотрим пример кода, который нужно разместить в модуле формы отчета (в процедуре ПриСозданииНаСервере или в специализированных процедурах БСП):
&НаСервере
Процедура НастроитьОтображениеКнопокВыбора()
// 1. Получаем настройки компоновщика
Настройки = Отчет.КомпоновщикНастроек.Настройки;
// 2. Ищем конкретный параметр по его имени в схеме
ПараметрСсылка = Настройки.ПараметрыДанных.Элементы.Найти("Склад");
Если ПараметрСсылка <> Неопределено Тогда
// Получаем уникальный идентификатор пользовательской настройки
ИдНастройки = ПараметрСсылка.ИдентификаторПользовательскойНастройки;
// Формируем имя элемента формы, как его создает платформа
// Важно: из GUI-идентификатора нужно убрать дефисы
ИмяЭлемента = "ЗначениеПараметраНастроек_Значение_" + СтрЗаменить(Строка(ИдНастройки), "-", "");
ЭлементФормы = Элементы.Найти(ИмяЭлемента);
Если ЭлементФормы <> Неопределено Тогда
// Устанавливаем нужные свойства для включения кнопки выбора
ЭлементФормы.КнопкаВыбора = Истина;
ЭлементФормы.РежимВыбораИзСписка = Ложь;
ЭлементФормы.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Всегда;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем этот код. Мы используем функцию СтрЗаменить, так как идентификатор настройки является объектом типа УникальныйИдентификатор, а платформа при генерации имен элементов убирает из него дефисы. Также мы принудительно устанавливаем РежимВыбораИзСписка = Ложь, что является ключевым моментом для отключения выпадающего списка.
В современных конфигурациях отчеты работают через Библиотеку стандартных подсистем (БСП). В этом случае стандартные формы отчетов сильно кастомизированы. Вместо того чтобы копировать общую форму в свой отчет, правильно будет использовать переопределяемые модули или события, которые предоставляет БСП.
Рассмотрим ситуацию, когда нам нужно изменить поле в «Быстрых настройках». В БСП за это часто отвечает механизм, вызываемый в процедуре ПриСозданииНаСервере. Если вы создаете свою форму, вы можете вызвать настройку элементов после вызова стандартных процедур БСП:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызов стандартной инициализации БСП
ОтчетыСервер.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
// Наша донастройка
Для каждого Элемент Из Элементы Цикл
// Можно пройтись циклом по всем элементам и для определенных типов включить кнопку
Если Лев(Элемент.Имя, 25) = "ЗначениеПараметраНастроек" Тогда
Элемент.КнопкаВыбора = Истина;
Элемент.РежимВыбораИзСписка = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный нюанс: Если настройки выведены не в область быстрых настроек непосредственно на форме, а открываются по кнопке «Настройки...», то достучаться до них через коллекцию Элементы основной формы не удастся. Платформа создает отдельное всплывающее окно, которое генерируется динамически в момент обращения.
Если стандартный механизм СКД ведет себя непредсказуемо или конфигурация слишком сильно ограничивает программную правку динамических элементов, разберем «профессиональный» обходной путь. Мы можем создать собственный реквизит на форме отчета, который будет выступать в роли параметра.
ВыбранныйСклад с типом СправочникСсылка.Склады.НачалоВыбора.ПриКомпоновкеРезультата.Посмотрим на пример реализации в модуле объекта:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Если параметр заполнен в реквизите формы (передан через структуру параметров)
Если ЗначениеЗаполнено(ЭтотОбъект.ВыбранныйСклад) Тогда
ПараметрСклад = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Склад");
Если ПараметрСклад <> Неопределено Тогда
ПараметрСклад.Значение = ЭтотОбъект.ВыбранныйСклад;
ПараметрСклад.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод считается наиболее стабильным, так как вы полностью контролируете поведение элемента управления на форме и не зависите от алгоритмов генерации имен элементов платформой.
Мы проанализировали несколько подходов к решению задачи. Выясним кратко, какой выбрать:
Помните, что при использовании программного метода (Способ 2), идентификатор пользовательской настройки может измениться, если вы удалите и заново добавите параметр в схеме СКД. В таком случае код поиска элемента нужно будет актуализировать.