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