"Магия или не понимание механизма работы?"

Стандартная конфигурация "УТ 3.2".
В документе "Заказ клиента" при добавлении новой строки и нажатии на ячейку номенклатуры можно начать вбивать текст в ячейку и будет появляться окно с вариантом выбора номенклатур по заданному в поле тексту. Стандартно просто вызывается событие из модуля менеджера справочника "Номенклатура" имеющее код:

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

Мне нужно задать свой отбор в данное событие и для этого я воспользовался методом "ПолучитьДанныеВыбора". Итак, в я прописал код на событие редактирования текста в ячейке номенклатуры:

```1c
    &НаКлиенте
    Процедура ТоварыНоменклатураИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    ОбработкаДанныхВыбора(Текст);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция ЗаполнитьМассивОтбора()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТипыНоменклатуры.Ссылка
    |ИЗ
    | Перечисление.ТипыНоменклатуры КАК ТипыНоменклатуры";
    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();
    МассивОтборов=Новый Массив;
    Пока Выборка.Следующий() Цикл
    МассивОтборов.Добавить(Выборка.Ссылка);
    КонецЦикла;

    Возврат МассивОтборов;
    КонецФункции

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

В результате мне удалось аналогично, только программно, сформировать параметры и перейти к выполнению процедуры "ОбработкаПолученияДанныхВыбора" в номенклатуре, только вот я столкнулся с проблемой: что при стандартной обработке заполнения данных, что при моей - значения входа в процедуру одинаковые, но при моем способе не появляется список предложений. Я вообще не могу понять в чём дело. Подскажите пожалуйста.

UP: в процедуре "ОбработкаПолученияДанныхВыбора" выбирал стандартную обработку - аналогично = мой вариант не отображает окно с возможными номенклатурами, а стандартный вызов процедуры - отображает, хотя входящие параметры идентичны.

Думаю ещё важно указать что в "ДанныеВыбора" при моем программном вызове события попадает заполненный список, но в итоге не отображается.
---
При выборе склада делайте запрос для получения номенклатуры по складу.

Далее в обработчике Автоподбор нужного поля:

```1c
    // массив - это массив номенклатуры, полученной запросом по складу
    // заполняете структуру ПараметрыПолученияДанных

    ПараметрыПолученияДанных.Очистить();
    ПараметрыПолученияДанных.Вставить("Отбор",Новый Структура("Ссылка",Массив));
    ПараметрыПолученияДанных.Вставить("СтрокаПоиска",Текст);

    ПараметрыПолученияДанных.Вставить("РежимПолученияДанныхВыбора",РежимПолученияДанныхВыбораПриВводеПоСтроке.Непосредственно);
    ПараметрыПолученияДанных.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
```

Не нужна СтандартнаяОбработка=Ложь;
---
Нужно было вместо события "ТоварыНоменклатураИзменениеТекстаРедактирования" использовать событие "ТоварыНоменклатураАвтоПодбор". Поменял - работает, хоть в нём и не рекомендуют делать серверные вызовы...

Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):

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

    &НаСервереБезКонтекста
    Функция ЗаполнитьМассивОтбора()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВидыНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры";
    РезультатЗапроса = Запрос.Выполнить();

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

    Возврат МассивОтборов;
    КонецФункции

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

    &НаКлиенте
    Процедура ТоварыНоменклатураОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
    КонецПроцедуры
```
---
Нужно было вместо события "ТоварыНоменклатураИзменениеТекстаРедактирования" использовать событие "ТоварыНоменклатураАвтоПодбор". Поменял - работает, хоть в нём и не рекомендуют делать серверные вызовы...

Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):

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

    &НаСервереБезКонтекста
    Функция ЗаполнитьМассивОтбора()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВидыНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры";
    РезультатЗапроса = Запрос.Выполнить();

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

    Возврат МассивОтборов;
    КонецФункции

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

    &НаКлиенте
    Процедура ТоварыНоменклатураОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
    КонецПроцедуры
```
---
просто на поле с номенклатурой в конструкторе, в конфигураторе, добавьте Отбор
и тогда на ваш стандартный автоподбор будет накладываться указанный отбор!
в этом случае (гов)кодить вообще не надо!!!
---
Не получится так, утоню детали. Нужно что бы в поле номенклатуры выбирались только те позиции, которые отгружаются с выбранного склада в документе заказа. То есть в дальнейшем, если, например, выбрал "Склад 1", то можно выбрать "Номенклатура1", "Номенклатура2", "Номенклатура3", а если выбран "Склад2", то можно уже выбрать только "Номенклатура4"...
---
два варианта
1.сделайте кнопку: Заполнить, запросом получаете и заполняете или дозаполняете вашу ТЧ из остатков по указанному в шапке складу в разрезе Заказа.

2.у поля Номенклатура, делаете режим выбора из списка значений, а при открытии формы или смене склада, загружаете туда доступный список номенклатуры
---
При выборе склада делайте запрос для получения номенклатуры по складу.

Далее в обработчике Автоподбор нужного поля:

```1c
    // массив - это массив номенклатуры, полученной запросом по складу
    // заполняете структуру ПараметрыПолученияДанных

    ПараметрыПолученияДанных.Очистить();
    ПараметрыПолученияДанных.Вставить("Отбор",Новый Структура("Ссылка",Массив));
    ПараметрыПолученияДанных.Вставить("СтрокаПоиска",Текст);

    ПараметрыПолученияДанных.Вставить("РежимПолученияДанныхВыбора",РежимПолученияДанныхВыбораПриВводеПоСтроке.Непосредственно);
    ПараметрыПолученияДанных.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
```

Не нужна СтандартнаяОбработка=Ложь;