Как реализовать гибридное поле ввода, работающее как выбор ссылки и как список значений?

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

Часто в процессе разработки конфигураций на платформе 1С:Предприятие 8 возникает задача реализовать поле, поведение которого зависит от состояния данных. Пользователю хочется, чтобы поле выглядело как обычное поле ввода СправочникСсылка, когда там выбрано одно значение, и автоматически превращалось в список, если значений несколько. Давайте разберем, как добиться такого «гибридного» поведения, сохранив при этом удобство ввода по строке.

Суть проблемы и концепция решения

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

Реализация через строковое представление

Для реализации этой задачи мы добавим на форму дополнительный строковый реквизит, который будет служить «лицом» нашего поля. Весь основной код будет сосредоточен в обработчиках событий этого реквизита.

Разберем основные шаги реализации:

  1. Создадим реквизит формы с типом СписокЗначений (хранилище данных).
  2. Создадим реквизит формы типа Строка (для отображения представления на форме).
  3. Настроим обработчики событий для строкового реквизита.

Программная реализация обработчиков

Рассмотрим детально, как управлять логикой выбора и открытия формы списка.

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


&НаКлиенте
Процедура НоменклатураПредставлениеПриИзменении(Элемент)
    НоменклатураПредставление = Строка(Номенклатура);
КонецПроцедуры

Ключевой момент — обработка события НачалоВыбора. Здесь мы определяем, открывать ли стандартную форму выбора справочника или вызывать форму редактирования списка значений:


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

Использование системной формы редактирования

Для редактирования списка значений мы можем воспользоваться системной формой sysForm:ValueListForm. Это позволяет пользователю работать с привычным интерфейсом добавления, удаления и изменения позиций в списке.


&НаКлиенте
Процедура ПоказатьФормуРедактированияСпискаЗначений()
    ФормаСпискаЗначений = ПолучитьФорму("sysForm:ValueListForm", , Элементы.НоменклатураПредставление);
    ФормаСпискаЗначений.ValueList.ЗагрузитьЗначения(Номенклатура.ВыгрузитьЗначения());
    ФормаСпискаЗначений.ValueList.ТипЗначения = Номенклатура.ТипЗначения;
    ФормаСпискаЗначений.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
    
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыСпискаЗначений", ЭтотОбъект, ФормаСпискаЗначений.ValueList);
    ФормаСпискаЗначений.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
    ФормаСпискаЗначений.Открыть();
КонецПроцедуры

Обработка результатов выбора

После закрытия формы редактирования нам необходимо обновить данные и отображаемое представление:


&НаКлиенте
Процедура ПослеЗакрытияФормыСпискаЗначений(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = 1 Тогда
        Номенклатура = ДополнительныеПараметры;
        НоменклатураПредставление = Строка(Номенклатура);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации

При использовании данного метода важно учитывать следующее:

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

← На главную