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