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