Всем привет!
Конфа - любая на обычных формах. Обработка, на ней элемент формы ПолеВвода с типом значения Спр. Номенклатура.
Хочу в событии НачалоВыбора предопределить доступный список номенклатуры. Не проблема - накладываю нужные отборы на открываемую форму списка и профит. Но! Не открывая форму выбора, руками можно впечатать любую номенклатуру, а я так не хочу. На поле ввода можно сделать РелактированиеТекста = Ложь, но такой вариант не нравится.
Вопрос - на обычных формах можно как-то наложить предопределённый список и в том числе на редактирование текста?
---
ZergKRSK, извиняюсь, сам забылся, это вариант только для УФ, на ОФ нужно чуто допилить помимо модуля менеджера:
Код окончание ввода (его достаточно, автоподбор ничего не даст)
```1c
    Процедура ПокупательОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;

    ПроверкаТелефон = Текст;
    НомерПоиск = Отправка_СМС_Уведомлений_Клиент.МобильныйОставитьТолькоЦифры(ПроверкаТелефон);
    ПоискПоТелефону = Ложь;
    Если СтрДлина(НомерПоиск)>6 Тогда //значит это телефон
    Текст = НомерПоиск;
    ПоискПоТелефону = Истина;
    КонецЕсли;

    ТекстПоискаПок = Текст;

    СписокНайденных = НайтиКонтрагентаНАСервереПоТексту(Текст); //тут как раз обращение к той процедуре из модуля менеджера

    Если СписокНайденных.Количество()>1 ИЛИ (ПоискПоТелефону=Истина И СписокНайденных.Количество()>0) Тогда
    Если СписокНайденных.Количество() = 1 И ТипЗнч(СписокНайденных[0].Значение)=Тип("СправочникСсылка.Контрагенты") Тогда
    Значение = СписокНайденных[0].Значение;
    ИначеЕсли СписокНайденных.Количество() = 1 Тогда
    Значение = СоздатьКонтрагентаПоСтроке(); //создаем нового
    Иначе
    Значение = СписокНайденных; //выведем список для выбора
    КонецЕсли;

    Возврат; //выведем список для выбора
    КонецЕсли;
    СтандартнаяОбработка = Ложь;

    ФормаВводаКонтрагента = ПолучитьФорму("ОбщаяФорма.ФормаВводаПокупателя");

    Если СтрДлина(НомерПоиск)>6 Тогда //значит это телефон
    ФормаВводаКонтрагента.ПереданныйМобильныйНомер = Текст;
    Иначе
    ФормаВводаКонтрагента.НаименованиеКонтрагента = Текст;
    КонецЕсли;

    Значение = СоздатьКонтрагентаПоСтроке();
    КонецПроцедуры

    Функция НайтиКонтрагентаНАСервереПоТексту(Текст)

    ПараметыВыбора = Новый Структура;
    Параметывыбора.Вставить("СтрокаПоиска",Текст);
    Результат = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Контрагенты"),ПараметыВыбора);

    Возврат Результат;

    КонецФункции
```

На поле ввода вешаете обработчик окончание ввода и в "Значение" передаете либо 1 значение если найдено 1 конткретное, либо список значений для выбора из него.
Данный код рабочий на ОФ на 100%, используем в работе именно такой метод (сеть магазинов>30).
---
ZergKRSK, ОбработкаВыбора, делать проверку на соответствие нужной номенклатуре.
---
spacecraft, после редактирования текста? Хочу чтобы уже при вводе номенклатур (в поле ввода) она даже не начинала там светиться.
(3) hexus, можно подробнее? С обработкой выбора проблем нет, есть проблемы с вводом текста. Пример был бы очень кстати.
---
ZergKRSK, смотрите обработчик "Автоподбор текста". На УФ точно делал такое, в ОФ не помню уже.
---
necropunk, на УФ есть решение, на ОФ не получается
---
ZergKRSK, я как-то так делал вроде

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

    СтандартнаяОбработка = Ложь;
    Значение = Новый СписокЗначений;
    Значение.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("ТоварРаз"));
    Значение.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("ТоварДва"));

    КонецПроцедуры
```
---
necropunk, в Значение что добавляем? Непонятно
---
ZergKRSK,
Хочу в событии НачалоВыбора предопределить доступный список номенклатуры.

ну вы же формируете этот список. в событии начало выбора. Тут нужно сформировать такой же.
---
necropunk, куда его затолкать, извиняюсь :)
---
ZergKRSK, А какие отборы накладываете ? Может стоит наложить отбор через Параметры Выбора у элемента формы ? тогда даже набор текста будет давать только доступную номенклатуру
---
vadim1011985, например, у каждого элемента Номенклатуры есть собственный реквизит КорневойРодитель. И обработка выбора может бытьтакой, например

```1c
    Для Каждого Настройка ИЗ мМассивАктивныхНастроек Цикл
    Для Каждого ЭлМассива ИЗ Настройка.ГруппаНоменклатуры Цикл
    СписокГрупп.Добавить(ЭлМассива);
    КонецЦИкла;
    КонецЦикла;
    ФормаВыбора.СправочникСписок.Отбор.КорневойРодитель.ВидСравнения = ВидСравнения.НеВСписке;
    ФормаВыбора.СправочникСписок.Отбор.КорневойРодитель.Значение = СписокГрупп;
    ФормаВыбора.СправочникСписок.Отбор.КорневойРодитель.Использование = Истина;
```
---
vadim1011985, тут на обычных формах, у них вроде нет параметров выбора. С ними-то все легко решается.

(13) ZergKRSK, ради интереса сейчас набросал свой код - все работает. Видимо, я не совсем правильно понял цель.
Какое поведение вы ожидаете от системы, если у вас есть номенклатура Товар1, Товар2, Товар3, в списке выбора у вас только Товар2 и Товар3, а пользователь ввел в поле ввода на форме Товар1?
---
necropunk, Какое поведение вы ожидаете от системы, если у вас есть номенклатура Товар1, Товар2, Товар3, в списке выбора у вас только Товар2 и Товар3, а пользователь ввел в поле ввода на форме Товар1?
Как только пользователь начинает печатать в поле ввода, то система уже не предлагает Товар1.
---
ZergKRSK, в модуле менеджера создайте процедуру
```1c
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = Новый СписокЗначений;

    ТекстПоиска = Параметры.СтрокаПоиска; //тут текст который ввели в поле ввода

    Запрос = новый запрос("ваш запрос с нужными параметрами"); //лучше делать ПЕРВЫЕ чуть-чуть если ищите по ПОДОБНО

    Выборка = Запрос.Выполнить().Выбрать();
    Пока выборка.следующий() Цикл
    ДанныеВыбора.Добавить(Выборка.ВыбранныйЭлемент,ПредставлениеЭлемента,Пометка,Картинка);
    Конеццикла;

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

Собственно замените так стандартный список выбора.
---
spenser123, ДанныеВыбора.Добавить(Выборка.ВыбранныйЭлемент,ПредставлениеЭлемента,Пометка,Картинка);
Первый параметр это Ссылка на элемент?
Что пихать в ПредставлениеЭлемента?
Пометка и Картинка для чего?
---
переопеделяй события связанные с вводом текста и обработкой выбора и будет тебе счастье
---
Ну, там ВыбратьИзСписка добавьте если надо, давно писал, не помню подробностей.
---
Возможно не самый оптимальный вариант, но работает.
Собираем список элементов для ограничения, собираем список текстовых представлений этих элементов.
При ручном вводе текста проверяем на соответствие имеющимся текстовым представлениям.
Если не соответствует стираем.
Соответствует - стандартный подбор покажет нужный элемент.
А если рукам не хочется - будет отбор из заданного нами списка.

```1c
    Перем Список;
    Перем МассивТекста;

    Процедура ПодразделениеНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ФормаВыбораНом = Справочники.Подразделения.ПолучитьФормуВыбора(, Элемент);

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

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

    Список = Новый СписокЗначений;
    МассивТекста = Новый Массив;
    ВыбПодр = Справочники.Подразделения.Выбрать();
    Итератор = 1;
    Пока ВыбПодр.Следующий() Цикл
    Итератор = Итератор + 1;
    Если Итератор > 3 Тогда
    Прервать;
    КонецЕсли;
    Список.Добавить(ВыбПодр.Ссылка);
    МассивТекста.Добавить(ВыбПодр.Ссылка.Наименование);
    КонецЦикла;
```
---
cargobird, ну еще можно в автоподбор текста запихать запрос с условием на ПОДОБНО для переменной Текст. Тогда по идее само очищаться будет. Ну, выбирать, скажем, первые 10 элементов и запихивать в список.
---
cargobird, работает. Но в поле ввода можно напечатать недоступный элемент. Да, он потом стирается, но нельзя ли сделать так чтобы система даже не предлагала там такой элемент?
---
ZergKRSK, печатать можно всё что угодно, этого пользователю не запретить.
Но как только закончил ввод - сразу идет анализ без предложения ввода ненужного нам элемента из справочника, разве нет?
---
cargobird, я так понял на УФ можно сделать так что даже когда печатаешь в поле ввода то там УЖЕ нет запрещенных элементов. Хотелось такое же на ОФ получить...
---
cargobird, еще мне видится минус в таком подходе. Если будет поле выбора в табличной части, и справочник будет номенклатура с тысячами позиций, то в каждой строке после выбора номенклатур будет проверка и возможно затратная по времени...
---
ZergKRSK, перебор да, долго, я писал что не оптимально.
Можно запросом через ПОДОБНО, будет побыстрее.
Раз нет предустановленного фильтра на поле, приходится всяко вертеться.
---
P.S. описанный мной выше метод работает и на УФ и на ОФ, если что.
---
spenser123, Не взлетело. Список номенклатур не фильтруется.
---
ZergKRSK, извиняюсь, сам забылся, это вариант только для УФ, на ОФ нужно чуто допилить помимо модуля менеджера:
Код окончание ввода (его достаточно, автоподбор ничего не даст)
```1c
    Процедура ПокупательОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;

    ПроверкаТелефон = Текст;
    НомерПоиск = Отправка_СМС_Уведомлений_Клиент.МобильныйОставитьТолькоЦифры(ПроверкаТелефон);
    ПоискПоТелефону = Ложь;
    Если СтрДлина(НомерПоиск)>6 Тогда //значит это телефон
    Текст = НомерПоиск;
    ПоискПоТелефону = Истина;
    КонецЕсли;

    ТекстПоискаПок = Текст;

    СписокНайденных = НайтиКонтрагентаНАСервереПоТексту(Текст); //тут как раз обращение к той процедуре из модуля менеджера

    Если СписокНайденных.Количество()>1 ИЛИ (ПоискПоТелефону=Истина И СписокНайденных.Количество()>0) Тогда
    Если СписокНайденных.Количество() = 1 И ТипЗнч(СписокНайденных[0].Значение)=Тип("СправочникСсылка.Контрагенты") Тогда
    Значение = СписокНайденных[0].Значение;
    ИначеЕсли СписокНайденных.Количество() = 1 Тогда
    Значение = СоздатьКонтрагентаПоСтроке(); //создаем нового
    Иначе
    Значение = СписокНайденных; //выведем список для выбора
    КонецЕсли;

    Возврат; //выведем список для выбора
    КонецЕсли;
    СтандартнаяОбработка = Ложь;

    ФормаВводаКонтрагента = ПолучитьФорму("ОбщаяФорма.ФормаВводаПокупателя");

    Если СтрДлина(НомерПоиск)>6 Тогда //значит это телефон
    ФормаВводаКонтрагента.ПереданныйМобильныйНомер = Текст;
    Иначе
    ФормаВводаКонтрагента.НаименованиеКонтрагента = Текст;
    КонецЕсли;

    Значение = СоздатьКонтрагентаПоСтроке();
    КонецПроцедуры

    Функция НайтиКонтрагентаНАСервереПоТексту(Текст)

    ПараметыВыбора = Новый Структура;
    Параметывыбора.Вставить("СтрокаПоиска",Текст);
    Результат = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Контрагенты"),ПараметыВыбора);

    Возврат Результат;

    КонецФункции
```

На поле ввода вешаете обработчик окончание ввода и в "Значение" передаете либо 1 значение если найдено 1 конткретное, либо список значений для выбора из него.
Данный код рабочий на ОФ на 100%, используем в работе именно такой метод (сеть магазинов>30).
---
spenser123, сейчас протестирую!
---
Посмотри в УПП ПроцедурыПоискаПоСтроке.ОкончаниеВводаТекстаВЭлементеУправления( может оно
---
Это типовое добавление в список значений, добавить (значение, представление, пометка, картинка) значение - ссылка на элемент, представление это то что будет написано у пользователя( то что он будет видеть вместо значения. Тип строка) пометка - выбран элемент по умолчанию или нет, а картинка это картинка которая будет слева от представления. Пометку и картинку если не нужны - просто не устанавливайте)
---
spenser123, спасибо, твое решение мне подошло.