Имеем реквизит формы с типом СписокЗначений. Тип элемента списка – СправочникСсылка.Номенклатура. Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
В любом случае поле должно иметь возможность ввода по строке – если выбрано значение, список очищается и в него добавляется выбранное значение.
Если список не пуст, то при нажатии на кнопку выбора (...) должно работать стандартное поведение – открываться форма редактирования списка значений.
Выглядеть поле должно так же как стандартное поле ввода списка значения, то есть, если выбрано несколько значений, они отображаются в поле через запятую.
---
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.

Либо продумывать алгоритм ввода при разных событиях и условиях.
---
Как вывести на форму соответствующее поле, которое ведёт себя как поле ввода ссылочного значения, если список значений пуст, и как поле списка значений, если список не пуст?
Сделать реквизит составного типа (СписокЗначений и СправочникСсылка) и приводить к определенному типу по условию.

Либо продумывать алгоритм ввода при разных событиях и условиях.
---
Это работает за исключением того, что когда поле становится полем ввода списка значений, оно теряет возможность редактирования текста, а значит и ввода по строке. Решается очисткой поля, но хотелось бы обойтись без лишних манипуляций.
---
Тогда сложный вариант, сделать два поля. Текстовое и список значений. В текстовом показывать представление. А второе не выводить на форму и редактировать программно через изменения текста. Что то похожее есть в табеле в ЗУПе. Только там не список, а составное поле.
Сложно, зато все красиво будет выглядеть для пользователя :-)
---
редактировать программно через изменения текста
Насколько знаю, невозможно программно вызвать стандартную форму редактирования списка значений.
---
Но в типовых решениях для таких случаев нарисована общая форма... В УТ и КА точно есть.
---
Но можно нарисовать свою форму. Если конфигурация на БСП, то наверняка в составе есть уже готовая форма списка для различных ситуаций.
---
, (7) Да, видимо, имеется в виду общая форма ВводЗначенийСпискомСФлажками. Но нашёл однако и стандартную – ValueListForm. Код через представление получился слишком громоздким, поэтому для себя выбрал вариант с составным реквизитом.
Так выглядит вариант с представлением:
```1c
    &НаКлиенте
    Процедура НоменклатураПредставлениеПриИзменении(Элемент)

    НоменклатураПредставление = Строка(Номенклатура);

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

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

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

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

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

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

    Номенклатура.Очистить();

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

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

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

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

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

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

    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыСпискаЗначений", ЭтотОбъект, ФормаСпискаЗначений.ValueList);
    ФормаСпискаЗначений.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
    ФормаСпискаЗначений.Открыть();

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

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

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

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

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

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

    НоменклатураПредставление = Строка(Номенклатура);

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

    &НаКлиенте
    Процедура НоменклатураПредставлениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)

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

    КонецПроцедуры
```
---
Но нашёл однако и стандартную – ValueListForm. Кстати, буду признателен за источник информации о системных формах. Откуда черпаете?
---
Просматривал ресурсы с помощью этих публикаций:
https://infostart.ru/public/538300/
https://infostart.ru/public/546529/
---
Спасибо!
---
(10) Только надо быть осторожным со встроенными в платформу формами. В следующем релизе могут поменять название формы и работать код перестанет.
---
Ну к такому изнасилованию уже давно все привыкли...