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