Как получить список значений из формы выбора в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность выбрать не один объект (документ, элемент справочника), а сразу несколько. По умолчанию стандартная форма выбора настроена на возврат одного значения, но платформенные механизмы позволяют легко изменить это поведение. Разберем подробно, как реализовать множественный выбор, правильно установить программные фильтры и обработать полученный результат.

Основной механизм: Параметры открытия формы

Для того чтобы форма выбора позволила пользователю выделить несколько строк и вернуть их в вызывающий код, необходимо использовать метод ОткрытьФорму с передачей специальных параметров. Рассмотрим наиболее современный и правильный подход, который работает в управляемом приложении (в том числе в веб-клиенте).

Проанализируем ключевые параметры, которые нам понадобятся в структуре ПараметрыВыбора:

  1. РежимВыбора — установка этого параметра в значение Истина сообщает форме, что она открывается именно для выбора объекта.
  2. МножественныйВыбор — самый важный параметр. При значении Истина в форме разрешается выделение нескольких строк (через клавиши Shift или Ctrl), а кнопка «Выбрать» возвращает массив ссылок.
  3. ЗакрыватьПриВыборе — определяет, закроется ли форма сразу после нажатия кнопки выбора.

Рассмотрим пример кода, который открывает форму выбора документов «Реализация товаров и услуг» с возможностью множественного выделения:


&НаКлиенте
Процедура ВыбратьНесколькоДокументов(Команда)
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("РежимВыбора", Истина);
    ПараметрыВыбора.Вставить("МножественныйВыбор", Истина);
    
    // Подготовим описание оповещения для обработки результата
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатВыбора", ЭтаФорма);
    
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаВыбора", 
                 ПараметрыВыбора, 
                 ЭтаФорма, 
                 ,,, 
                 ОписаниеОповещения);
    
КонецПроцедуры

Программная установка отборов в форме выбора

Часто перед открытием формы требуется ограничить список доступных данных (например, по дате или списку номеров). В управляемых формах для этого лучше всего использовать ФиксированныеНастройки компоновки данных. Это гарантирует, что пользователь не сможет случайно отключить эти фильтры, и они будут корректно применены на сервере.

Разберем, как добавить отбор по списку номеров и по дате начала месяца:


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

Обработка результата: Массив или одиночное значение?

Выясним важную особенность: какой тип данных возвращает форма? Если установлен флаг МножественныйВыбор = Истина, система всегда возвращает Массив. Даже если пользователь выделил только один документ, результатом будет массив с одним элементом. Если пользователь нажал «Отмена» или закрыл форму крестиком, результатом будет Неопределено.

Рассмотрим процедуру обработки выбора:


&НаКлиенте
Процедура ОбработатьРезультатВыбора(ВыбранныеЗначения, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныеЗначения = Неопределено Тогда
        // Пользователь ничего не выбрал
        Возврат;
    КонецЕсли;
    
    // Так как был включен МножественныйВыбор, работаем с массивом
    Для Каждого СсылкаИзСписка Из ВыбранныеЗначения Цикл
        Сообщить("Выбран документ: " + Строка(СсылкаИзСписка));
        // Здесь может быть логика добавления в табличную часть или обработки
    КонецЦикла;
    
КонецПроцедуры

Важные нюансы настройки формы и интерфейса

Проанализируем несколько технических моментов, которые могут помешать работе кода:

  1. Режим выделения таблицы: Чтобы пользователь мог физически выделить несколько строк в открывшейся форме, у элемента управления «Таблица» (связанного с динамическим списком) свойство РежимВыделения должно стоять в значении Множественный. Обычно в стандартных формах выбора это настроено автоматически при передаче параметра МножественныйВыбор, но в самописных формах это стоит проверить вручную.
  2. Отличие Выбора от Подбора: Если вам нужно, чтобы форма выбора не закрывалась после каждого нажатия на кнопку «Выбрать» (режим «подбора»), передавайте параметр РежимПодбора = Истина. В этом случае форма будет генерировать событие ОповещениеОВыборе, которое нужно ловить в соответствующем обработчике формы-владельца.
  3. Использование в веб-клиенте: Крайне не рекомендуется использовать метод ОткрытьМодально. Он не поддерживается во многих браузерах и блокирует работу интерфейса. Использование ОткрытьФорму с ОписаниеОповещения — это универсальный стандарт для платформы 8.3.
  4. Программный возврат из своей формы: Если вы создаете свою уникальную форму выбора и хотите вернуть из нее произвольный список значений, используйте метод Закрыть(), передав в него ваш СписокЗначений или Массив.

Резюмируем: Для получения списка значений из формы выбора достаточно передать структуру параметров с установленным флагом МножественныйВыбор и описать асинхронную процедуру обработки результата. Это позволяет гибко настраивать взаимодействие пользователя с данными, обеспечивая при этом высокую производительность и совместимость с веб-технологиями.

← На главную