Гибридное поведение поля ввода списка значений на управляемой форме

1. SlavaKron 17.11.20 14:59 Сейчас в теме
Имеем реквизит формы с типом СписокЗначений. Тип элемента списка – СправочникСсылка.Номенклатура. Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
В любом случае поле должно иметь возможность ввода по строке – если выбрано значение, список очищается и в него добавляется выбранное значение.
Если список не пуст, то при нажатии на кнопку выбора (...) должно работать стандартное поведение – открываться форма редактирования списка значений.
Выглядеть поле должно так же как стандартное поле ввода списка значения, то есть, если выбрано несколько значений, они отображаются в поле через запятую.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. oleg-x 22 17.11.20 15:28 Сейчас в теме
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?

Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.

Либо продумывать алгоритм ввода при разных событиях и условиях.
SlavaKron; FatPanzer; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. oleg-x 22 17.11.20 15:28 Сейчас в теме
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?

Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.

Либо продумывать алгоритм ввода при разных событиях и условиях.
SlavaKron; FatPanzer; +2 Ответить
3. SlavaKron 17.11.20 16:37 Сейчас в теме
(2) Это работает за исключением того, что когда поле становится полем ввода списка значений, оно теряет возможность редактирования текста, а значит и ввода по строке. Решается очисткой поля, но хотелось бы обойтись без лишних манипуляций.
Прикрепленные файлы:
ВнешняяОбработка1.epf
4. oleg-x 22 17.11.20 17:15 Сейчас в теме
(3) Тогда сложный вариант, сделать два поля. Текстовое и список значений. В текстовом показывать представление. А второе не выводить на форму и редактировать программно через изменения текста. Что то похожее есть в табеле в ЗУПе. Только там не список, а составное поле.
Сложно, зато все красиво будет выглядеть для пользователя :-)
5. SlavaKron 17.11.20 17:31 Сейчас в теме
(4)
редактировать программно через изменения текста

Насколько знаю, невозможно программно вызвать стандартную форму редактирования списка значений.
7. FatPanzer 17.11.20 17:53 Сейчас в теме
(5) Но в типовых решениях для таких случаев нарисована общая форма... В УТ и КА точно есть.
6. oleg-x 22 17.11.20 17:50 Сейчас в теме
(5) Но можно нарисовать свою форму. Если конфигурация на БСП, то наверняка в составе есть уже готовая форма списка для различных ситуаций.
8. SlavaKron 18.11.20 12:14 Сейчас в теме
(6), (7) Да, видимо, имеется в виду общая форма ВводЗначенийСпискомСФлажками. Но нашёл однако и стандартную – ValueListForm. Код через представление получился слишком громоздким, поэтому для себя выбрал вариант с составным реквизитом.
Так выглядит вариант с представлением:
&НаКлиенте
Процедура НоменклатураПредставлениеПриИзменении(Элемент)
	
	НоменклатураПредставление = Строка(Номенклатура);
	
КонецПроцедуры

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

&НаКлиенте
Процедура НоменклатураПредставлениеОчистка(Элемент, СтандартнаяОбработка)
	
	Номенклатура.Очистить();
	
КонецПроцедуры

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

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

КонецПроцедуры

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

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

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

&НаКлиенте
Процедура НоменклатураПредставлениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	Если Ожидание = 0 Тогда
		Возврат
	КонецЕсли;
	СтандартнаяОбработка = Ложь;
	ДанныеВыбора = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Номенклатура"), ПараметрыПолученияДанных);
	
КонецПроцедуры
Показать
Прикрепленные файлы:
ГибридноеПолеСпискаЗначений.epf
FatPanzer; +1 Ответить
9. FatPanzer 18.11.20 12:16 Сейчас в теме
(8)
Но нашёл однако и стандартную – ValueListForm.
Кстати, буду признателен за источник информации о системных формах. Откуда черпаете?
10. SlavaKron 18.11.20 12:18 Сейчас в теме
(9) Просматривал ресурсы с помощью этих публикаций:
https://infostart.ru/public/538300/
https://infostart.ru/public/546529/
FatPanzer; +1 Ответить
11. FatPanzer 18.11.20 12:29 Сейчас в теме
12. oleg-x 22 18.11.20 13:06 Сейчас в теме
(11) (10) Только надо быть осторожным со встроенными в платформу формами. В следующем релизе могут поменять название формы и работать код перестанет.
13. FatPanzer 18.11.20 13:08 Сейчас в теме
(12) Ну к такому изнасилованию уже давно все привыкли...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот