Как в отчете СКД настроить выбор параметров через кнопку выбора вместо выпадающего списка

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с тем, что платформа автоматически превращает поле выбора параметра в выпадающий список (Combo Box). Это удобно, если список значений ограничен несколькими пунктами, но становится крайне неудобным, когда речь идет о справочниках с тысячами элементов (например, «Номенклатура» или «Контрагенты»). В таких случаях пользователю гораздо привычнее и быстрее использовать стандартное окно выбора со всеми функциями поиска и иерархии.

В этой статье мы подробно разберем, как «заставить» управляемую форму отчета показывать стандартную кнопку выбора (три точки) и открывать полноценную форму списка вместо выпадающего перечня.

Способ 1. Настройка на уровне схемы компоновки данных и метаданных

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

  1. Свойство «Быстрый выбор» в метаданных: Если тип параметра — СправочникСсылка, найдем этот справочник в дереве конфигурации. На вкладке «Представление» проверим свойство Быстрый выбор. Если установлена опция «Использовать», платформа будет навязывать выпадающий список. Попробуем установить «Не использовать».
  2. Доступные значения в СКД: Перейдем в схему компоновки на закладку «Параметры». Найдем наш параметр и проверим колонку Доступные значения. Если там заполнен список, 1С всегда будет предлагать выбор именно из этого списка в виде выпадающего меню. Чтобы вернуть кнопку выбора, этот список должен быть пустым.
  3. Параметры редактирования: В той же закладке «Параметры» СКД найдем колонку Параметры редактирования. Здесь можно явно указать Форму выбора. Иногда простая установка ссылки на конкретную форму заставляет платформу добавить кнопку выбора на форму отчета.

Способ 2. Программное изменение элементов управляемой формы

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

Разберем алгоритм поиска этих элементов. Платформа генерирует имена полей по следующему шаблону:

Рассмотрим пример кода, который нужно разместить в модуле формы отчета (в процедуре ПриСозданииНаСервере или в специализированных процедурах БСП):


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

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

Проанализируем этот код. Мы используем функцию СтрЗаменить, так как идентификатор настройки является объектом типа УникальныйИдентификатор, а платформа при генерации имен элементов убирает из него дефисы. Также мы принудительно устанавливаем РежимВыбораИзСписка = Ложь, что является ключевым моментом для отключения выпадающего списка.

Способ 3. Интеграция в конфигурациях на базе БСП (ERP, УТ 11, БП 3.0)

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

Рассмотрим ситуацию, когда нам нужно изменить поле в «Быстрых настройках». В БСП за это часто отвечает механизм, вызываемый в процедуре ПриСозданииНаСервере. Если вы создаете свою форму, вы можете вызвать настройку элементов после вызова стандартных процедур БСП:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызов стандартной инициализации БСП
    ОтчетыСервер.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
    
    // Наша донастройка
    Для каждого Элемент Из Элементы Цикл
        // Можно пройтись циклом по всем элементам и для определенных типов включить кнопку
        Если Лев(Элемент.Имя, 25) = "ЗначениеПараметраНастроек" Тогда
             Элемент.КнопкаВыбора = Истина;
             Элемент.РежимВыбораИзСписка = Ложь;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Способ 4. Использование собственных реквизитов формы

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

  1. Добавим на форму реквизит, например, ВыбранныйСклад с типом СправочникСсылка.Склады.
  2. Вынесем его на форму. Для обычного реквизита формы в конфигураторе нам доступны все настройки: и кнопка выбора, и кнопка очистки, и события типа НачалоВыбора.
  3. Скроем стандартный параметр «Склад» из пользовательских настроек в схеме СКД (уберем галочку «Включать в пользовательские настройки»).
  4. Свяжем наш реквизит с параметром СКД программно. Лучше всего это сделать в модуле объекта отчета в предопределенной процедуре ПриКомпоновкеРезультата.

Посмотрим на пример реализации в модуле объекта:


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

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

Этот метод считается наиболее стабильным, так как вы полностью контролируете поведение элемента управления на форме и не зависите от алгоритмов генерации имен элементов платформой.

Резюме

Мы проанализировали несколько подходов к решению задачи. Выясним кратко, какой выбрать:

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

← На главную