Добрый день, коллеги!
Помогите, пожалуйста, с множественным выбором
Ситуация
Интерфейс - обычные формы.
Есть отчёт, в отчёте есть поле отбора справочника "Номенклатура".
Необходимо реализовать множественный выбор.

Основная форма отчета - Управляемая.
Справочник "номенклатура" реализован на обычных формах.
Итак, добавил в "формаВыбора" в "ПередОткрытием"

 ЭтаФорма.МножественныйВыбор = Истина;

лад, множественный выбор заработал как Номенклатура ВСписке

- как теперь реализовать единичный выбор как Номенклатура Равно ?

- как передать в "ФормаВыбора" Номенклатуры, например, имя отчета из которого идет вызов, чтобы можно было условие ставить на "ЭтаФорма.МножественныйВыбор"?

СправочникСписокВыбор и иже с ним пустые
---
Тогда знаю только через "костыль"
1) В толстой Форме выбора номенклатуры ловите форму отчета через отладчик, взводите множественность выбора и меняете ВладелецФормы на форму отчету (не знаю как перехватить обработку выбора в элементе компоновщика, поэтому обработку выбора делаем в форме отчета):

```1c
    Попытка
    Если ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель.ИмяФормы = "Отчет.МойСуперОтчет.Форма.ФормаОтчета" Тогда
    ФормаОтчета = ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель;
    ЭтаФорма.ВладелецФормы = ФормаОтчета;
    ЭтаФорма.МножественныйВыбор = Истина;
    КонецЕсли;
    Исключение
    КонецПопытки;
```

2) Затем в форме отчета в предопределенной процедуре ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) добавляете примерно такой код:

```1c
    &НаКлиенте
    Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

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

    Если КоличествоВыбранных = 1 Тогда
    ЭлементПользовательскойНастройки_л.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементПользовательскойНастройки_л.ПравоеЗначение = ВыбранноеЗначение[0];
    Иначе
    СписокНоменклатуры = Новый СписокЗначений;
    СписокНоменклатуры.ЗагрузитьЗначения(ВыбранноеЗначение);
    ЭлементПользовательскойНастройки_л.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементПользовательскойНастройки_л.ПравоеЗначение = СписокНоменклатуры;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

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

Здесь "Отчет" - главный реквизит формы отчета, у вас может быть другое название, но по умолчанию - такое.

Нюанс в том, что надо попасть в Пользовательские настройки, а там нет нормальных имен, но есть идентификатор, который можно получить из элементов отбора. Как раз недавно разбирался с похожей задачей, получилось как-то так.
---
про последний вопрос:
1) Можно по быстрому закостылить через ВладелецФормы у формы выбора справочника Номенклатуры.
Посмотрите в отладчике у себя.
Как пример:
У меня обе формы толстые. В вызываемой форме ВладелецФормы - это ПолеВвода, у которого доступно свойство "Подсказка". Соответственно, задав этой подсказке, значение "МойКостыль", в форме выбора Номенклатуры в предопределенной процедуры ПередОткрытием() сделать проверку:

```1c
    Попытка
    Если ЭтаФорма.ВладелецФормы.Подсказка = "МойКостыль" Тогда
    ЭтаФорма.МножественныйВыбор = Истина;
    КонецЕсли;
    Исключение
    КонецПопытки
```
---
Таки заинтриговали. Проверил как у Вас: На УФ отчета сделал элемент ПолеВвода к справочнику с толстой формой выбора. В этом случае набор доступных свойств у владельца формы гораздо богаче. Например, через имя родителя.
Тогда код в ПередОткрытием() в толстой форме выбора можно сделать так:

```1c
    Попытка
    Если ЭтаФорма.ВладелецФормы.Родитель.ИмяФормы = "Отчет.МойСуперОтчет.Форма.ФормаОтчетаУправляемая" Тогда
    ЭтаФорма.МножественныйВыбор = Истина;
    КонецЕсли;
    Исключение
    КонецПопытки
```

Ну и, соответственно, смотрите у себя, как там у Вас отчет называется и его форма.
Также напоминаю, что это "костыль", но быстро.
---
Теперь про не костыльное решение. Кое-что пришлось вспомнить/проверить.
Тут есть пару моментов, которые хотелось бы отметить.

1) Уже несколько лет рекомендуется использовать ОткрытьФорму() вместо ПолучитьФорму(), ПолучитьФормуВыбора() и т.д.
Но, почему-то, многие разработчики не подозревают, что рекомендуемый метод ОткрытьФорму() так же, как и ПолучитьФорму(), возвращает ссылку на форму, с которой можно проводить всевозможные манипуляции.
Как правило, если поискать в интернете, то используют дополнительные параметры и уже с ними работают в методе ПриСозданииНаСервере() вызываемой формы. Что не всегда удобно, например, форма может быть захвачена в хранилище другим разработчиком.

2) Ещё интересно: сначала срабатывает ОткрытьФорму(), потом срабатывают обработчики открываемой формы. Для толстой формы это ПередОткрытием(), затем ПриОткрытии(), Для УФ: ПриСозданииНаСервере() затем ПриОткрытии(). Далее же управлении возвращается к команде, следующей за командой "ОткрытьФорму()". Предлагаю Вам самому в отладчике выставить везде точки останова и посмотреть для понимания.

3) Нужно понимать, что форма, у которой взведен флажок РежимВыбора возвращает выбранное пользователем значение в предопределенный обработчик "...ОбработкаВыбора" того элемента, который указан как ВладелецФормы. Он передается в параметре "ВыбранноеЗначение".

4) Если Вы всё правильно указали при вызове формы выбора и также у Вас не множественный выбор, то платформа сама подставит выбранное значение. Если же нужен множественный выбор, как у Вас, то в параметре "ВыбранноеЗначение" приедет массив, который нужно будет обработать.
Примерный код для вашего случая:

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

    ФормаВыбора = ОткрытьФорму("Справочник.Материалы.ФормаВыбора",, Элемент);
    ФормаВыбора.МножественныйВыбор = Истина;
    ФормаВыбора.РежимВыбора = Истина;
    СтандартнаяОбработка = Ложь;

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

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

    Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
    СтандартнаяОбработка = Ложь;
    КоличествоВыбранных = ВыбранноеЗначение.Количество();
    Если КоличествоВыбранных = 0 Тогда
    Возврат;
    ИначеЕсли КоличествоВыбранных = 1 Тогда
    ЭтаФорма.Материал = ВыбранноеЗначение[0];
    Иначе
    // Тут ваши действия по обработке выбора множества значений
    // у меня просто дополнительное сообщение пользователю
    ЭтаФорма.Материал = ВыбранноеЗначение[0];
    Текст = "Выбрано позиций:" + КоличествоВыбранных
    + " первое использовано. Надо что-то делать с остальными";
    Сообщить(Текст);
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```

Только у меня вместо Вашей "Номенклатура" используется "Материал".
СтандартнаяОбработка = Ложь, чтобы платформа ничего не делала от себя. Если не сделать, то у Вас будет открываться две формы выбора.
---
Также можно сделать, чтобы в форме выбора текущей строкой было имеющееся в поле значение. Платформа это сама делает, а здесь придется всё самому. Или там ещё что-то.

Поищите в интернете по "1с выбор из произвольной формы".
---
Коллега, спасибо за ответы
я забыл уточнить - Отчет полностью на СКД, поэтому Номенклатура в отчете не имеет "НачалоВыбора", это элемент компоновщика, поле отбора, а не "ПолеВвода"
---
Тогда знаю только через "костыль"
1) В толстой Форме выбора номенклатуры ловите форму отчета через отладчик, взводите множественность выбора и меняете ВладелецФормы на форму отчету (не знаю как перехватить обработку выбора в элементе компоновщика, поэтому обработку выбора делаем в форме отчета):

```1c
    Попытка
    Если ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель.ИмяФормы = "Отчет.МойСуперОтчет.Форма.ФормаОтчета" Тогда
    ФормаОтчета = ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель;
    ЭтаФорма.ВладелецФормы = ФормаОтчета;
    ЭтаФорма.МножественныйВыбор = Истина;
    КонецЕсли;
    Исключение
    КонецПопытки;
```

2) Затем в форме отчета в предопределенной процедуре ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) добавляете примерно такой код:

```1c
    &НаКлиенте
    Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

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

    Если КоличествоВыбранных = 1 Тогда
    ЭлементПользовательскойНастройки_л.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементПользовательскойНастройки_л.ПравоеЗначение = ВыбранноеЗначение[0];
    Иначе
    СписокНоменклатуры = Новый СписокЗначений;
    СписокНоменклатуры.ЗагрузитьЗначения(ВыбранноеЗначение);
    ЭлементПользовательскойНастройки_л.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементПользовательскойНастройки_л.ПравоеЗначение = СписокНоменклатуры;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

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

Здесь "Отчет" - главный реквизит формы отчета, у вас может быть другое название, но по умолчанию - такое.

Нюанс в том, что надо попасть в Пользовательские настройки, а там нет нормальных имен, но есть идентификатор, который можно получить из элементов отбора. Как раз недавно разбирался с похожей задачей, получилось как-то так.
---
Дорогой друг, спасибо!!! респект и уважуха!
ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель.ИмяФормы только у меня 4-й родитель.
ЭтаФорма.ВладелецФормы.Родитель.Родитель.Родитель.Родитель.ИмяФормы.

Ларчик просто открывался.

Я что-то не додумался до Родитель.Родитель.Родитель.Родитель...

Ещё раз спасибо, я уж просто форму перерисовал на управляемые и вообще шаманить ничего не надо, всё на уровне платформы.