Имеем реквизит формы с типом СписокЗначений. Тип элемента списка – СправочникСсылка.Номенклатура. Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
В любом случае поле должно иметь возможность ввода по строке – если выбрано значение, список очищается и в него добавляется выбранное значение.
Если список не пуст, то при нажатии на кнопку выбора (...) должно работать стандартное поведение – открываться форма редактирования списка значений.
Выглядеть поле должно так же как стандартное поле ввода списка значения, то есть, если выбрано несколько значений, они отображаются в поле через запятую.
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.
Либо продумывать алгоритм ввода при разных событиях и условиях.
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.
Либо продумывать алгоритм ввода при разных событиях и условиях.
(2) Это работает за исключением того, что когда поле становится полем ввода списка значений, оно теряет возможность редактирования текста, а значит и ввода по строке. Решается очисткой поля, но хотелось бы обойтись без лишних манипуляций.
(3) Тогда сложный вариант, сделать два поля. Текстовое и список значений. В текстовом показывать представление. А второе не выводить на форму и редактировать программно через изменения текста. Что то похожее есть в табеле в ЗУПе. Только там не список, а составное поле.
Сложно, зато все красиво будет выглядеть для пользователя :-)
(6), (7) Да, видимо, имеется в виду общая форма ВводЗначенийСпискомСФлажками. Но нашёл однако и стандартную – ValueListForm. Код через представление получился слишком громоздким, поэтому для себя выбрал вариант с составным реквизитом.
Так выглядит вариант с представлением:
&НаКлиенте
Процедура НоменклатураПредставлениеПриИзменении(Элемент)
НоменклатураПредставление = Строка(Номенклатура);
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если Номенклатура.Количество() = 0 Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
Иначе
ПоказатьФормуРедактированияСпискаЗначений();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураПредставлениеОчистка(Элемент, СтандартнаяОбработка)
Номенклатура.Очистить();
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураПредставлениеОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Номенклатура.Количество() = 1 Тогда
ПоказатьЗначение(, Номенклатура[0].Значение);
Иначе
ПоказатьФормуРедактированияСпискаЗначений();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьФормуРедактированияСпискаЗначений()
ФормаСпискаЗначений = ПолучитьФорму("sysForm:ValueListForm", , Элементы.НоменклатураПредставление);
ФормаСпискаЗначений.ValueList.ЗагрузитьЗначения(Номенклатура.ВыгрузитьЗначения());
ФормаСпискаЗначений.ValueList.ТипЗначения = Номенклатура.ТипЗначения;
ФормаСпискаЗначений.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыСпискаЗначений", ЭтотОбъект, ФормаСпискаЗначений.ValueList);
ФормаСпискаЗначений.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
ФормаСпискаЗначений.Открыть();
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияФормыСпискаЗначений(Результат, ДополнительныеПараметры) Экспорт
Если Результат = 1 Тогда
Номенклатура = ДополнительныеПараметры;
НоменклатураПредставление = Строка(Номенклатура);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда
Номенклатура.Очистить();
Номенклатура.Добавить(ВыбранноеЗначение);
ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
Номенклатура.ЗагрузитьЗначения(ВыбранноеЗначение);
КонецЕсли;
НоменклатураПредставление = Строка(Номенклатура);
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураПредставлениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если Ожидание = 0 Тогда
Возврат
КонецЕсли;
СтандартнаяОбработка = Ложь;
ДанныеВыбора = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Номенклатура"), ПараметрыПолученияДанных);
КонецПроцедуры