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

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

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

Причины и ограничения стандартного диалога платформы

Выясним причину, по которой стандартные свойства элемента управления не дают нужного результата:

  1. Окно редактирования объекта СписокЗначений является системным диалогом платформы. К его внутренним элементам управления и табличной части у разработчика нет прямого программного доступа из кода управляемой формы.
  2. Событие НачалоВыбора, привязанное к самому полю ввода, срабатывает только при открытии всего списка, но не перехватывает добавление отдельных строк внутри системного окна.
  3. Свойства поля ввода ФормаВыбора и ПараметрыВыбора не транслируются платформой внутрь системного редактора списка значений. При нажатии кнопки выбора в строке списка платформа обращается к основной форме выбора объекта метаданных.

Способ 1. Замена системного окна на множественный выбор из нужной формы (рекомендуемый подход)

Наиболее удобный и лаконичный способ — полностью отказаться от вызова системного окна редактирования списка значений и сразу открывать нужную форму выбора в режиме множественного выбора. Разберем по шагам, как это реализовать.

Шаг 1. Перехват события начала выбора поля ввода

В событии НачалоВыбора поля ввода отключаем стандартную обработку и программно вызываем требуемую форму выбора с передачей параметра МножественныйВыбор:


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

Шаг 2. Обработка полученного результата

Когда пользователь выбирает несколько элементов в открытой форме и подтверждает выбор, форма возвращает массив значений. Обработаем этот массив в процедуре оповещения:


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

Способ 2. Создание собственной формы подбора и редактирования списка

Если пользователю требуется не просто выбрать элементы из справочника, а видеть текущий список, удалять отдельные позиции, менять пометки или порядок, лучшим решением будет создание собственной вспомогательной формы:

  1. Создаем новую управляемую форму обработки или общую форму.
  2. Добавляем в нее реквизит типа СписокЗначений или ТаблицаЗначений и выводим его в виде таблицы на форму.
  3. Для колонки значений в таблице настраиваем свойства ФормаВыбора, ПараметрыВыбора, СвязиПараметровВыбора или назначаем собственный обработчик события НачалоВыбора, где доступно открытие абсолютно любой формы с произвольными параметрами.
  4. Открываем созданную форму из основного поля ввода с передачей текущего значения реквизита и возвращаем измененный список при закрытии.

Способ 3. Использование типовых механизмов Библиотеки стандартных подсистем (БСП)

В конфигурациях, использующих БСП, предусмотрены готовые универсальные диалоги для редактирования списков значений с поддержкой отборов и переопределения форм выбора. Рассмотрим применение общей формы ввода значений списком:

  1. В обработчике НачалоВыбора вызывается общая форма выбора значений списком (например, форма подбора или ввода значений списком с флажками).
  2. В параметры формы передаются текущий СписокЗначений, целевой тип данных, имя нестандартной формы выбора и структура отборов.
  3. Типовой механизм БСП берет на себя отображение элементов и вызов указанной формы при добавлении новых строк.

Способ 4. Множественный выбор в современных версиях платформы 1С

В современных версиях платформы 1С:Предприятие (начиная с 8.3.23) расширены возможности стандартных полей ввода: доступен встроенный режим множественного выбора ссылочных данных непосредственно из выпадающего списка или поля формы. Это позволяет полностью уйти от устаревшего системного диалога редактирования списка значений и реализовать гибкий интерфейс выбора элементов.

← На главную