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