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