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