Работа с событием "ОбработкаПолученияДанныхВыбора"

1. SantiouS 15.05.20 14:34 Сейчас в теме
"Магия или не понимание механизма работы?"

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


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

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

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


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

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

Думаю ещё важно указать что в "ДанныеВыбора" при моем программном вызове события попадает заполненный список, но в итоге не отображается.
По теме из базы знаний
Найденные решения
6. vladimirovva 26.02.21 14:59 Сейчас в теме
(4)При выборе склада делайте запрос для получения номенклатуры по складу.

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

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


Не нужна СтандартнаяОбработка=Ложь;
assa; SantiouS; +2 Ответить
2. SantiouS 15.05.20 15:04 Сейчас в теме
Нужно было вместо события "ТоварыНоменклатураИзменениеТекстаРедактирования" использовать событие "ТоварыНоменклатураАвтоПодбор". Поменял - работает, хоть в нём и не рекомендуют делать серверные вызовы...

Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры

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

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

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

Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры

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

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

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

2.у поля Номенклатура, делаете режим выбора из списка значений, а при открытии формы или смене склада, загружаете туда доступный список номенклатуры
SantiouS; +1 Ответить
6. vladimirovva 26.02.21 14:59 Сейчас в теме
(4)При выборе склада делайте запрос для получения номенклатуры по складу.

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

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


Не нужна СтандартнаяОбработка=Ложь;
assa; SantiouS; +2 Ответить
Оставьте свое сообщение

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