Работа с событием "ОбработкаПолученияДанныхВыбора"
"Магия или не понимание механизма работы?"
Стандартная конфигурация "УТ 3.2".
В документе "Заказ клиента" при добавлении новой строки и нажатии на ячейку номенклатуры можно начать вбивать текст в ячейку и будет появляться окно с вариантом выбора номенклатур по заданному в поле тексту. Стандартно просто вызывается событие из модуля менеджера справочника "Номенклатура" имеющее код:
Мне нужно задать свой отбор в данное событие и для этого я воспользовался методом "ПолучитьДанныеВыбора". Итак, в я прописал код на событие редактирования текста в ячейке номенклатуры:
В результате мне удалось аналогично, только программно, сформировать параметры и перейти к выполнению процедуры "ОбработкаПолученияДанныхВыбора" в номенклатуре, только вот я столкнулся с проблемой: что при стандартной обработке заполнения данных, что при моей - значения входа в процедуру одинаковые, но при моем способе не появляется список предложений. Я вообще не могу понять в чём дело. Подскажите пожалуйста.
UP: в процедуре "ОбработкаПолученияДанныхВыбора" выбирал стандартную обработку - аналогично = мой вариант не отображает окно с возможными номенклатурами, а стандартный вызов процедуры - отображает, хотя входящие параметры идентичны.
Думаю ещё важно указать что в "ДанныеВыбора" при моем программном вызове события попадает заполненный список, но в итоге не отображается.
Стандартная конфигурация "УТ 3.2".
В документе "Заказ клиента" при добавлении новой строки и нажатии на ячейку номенклатуры можно начать вбивать текст в ячейку и будет появляться окно с вариантом выбора номенклатур по заданному в поле тексту. Стандартно просто вызывается событие из модуля менеджера справочника "Номенклатура" имеющее код:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
НоменклатураВызовСервера.НоменклатураОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка);
КонецПроцедуры
Мне нужно задать свой отбор в данное событие и для этого я воспользовался методом "ПолучитьДанныеВыбора". Итак, в я прописал код на событие редактирования текста в ячейке номенклатуры:
&НаКлиенте
Процедура ТоварыНоменклатураИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаДанныхВыбора(Текст);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьМассивОтбора()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТипыНоменклатуры.Ссылка
|ИЗ
| Перечисление.ТипыНоменклатуры КАК ТипыНоменклатуры";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивОтборов=Новый Массив;
Пока Выборка.Следующий() Цикл
МассивОтборов.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат МассивОтборов;
КонецФункции
&НаСервереБезКонтекста
Процедура ОбработкаДанныхВыбора(Текст)
ПараметрыПодбора=Новый Структура;
ТЗОтборТипы=ЗаполнитьМассивОтбора();
ПараметрыПодбора.Вставить("Отбор",Новый Структура("ТипНоменклатуры",ТЗОтборТипы));
ПараметрыПодбора.Вставить("СтрокаПоиска",Текст);
ПараметрыПодбора.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
Справочники.Номенклатура.ПолучитьДанныеВыбора(ПараметрыПодбора);
КонецПроцедуры
ПоказатьВ результате мне удалось аналогично, только программно, сформировать параметры и перейти к выполнению процедуры "ОбработкаПолученияДанныхВыбора" в номенклатуре, только вот я столкнулся с проблемой: что при стандартной обработке заполнения данных, что при моей - значения входа в процедуру одинаковые, но при моем способе не появляется список предложений. Я вообще не могу понять в чём дело. Подскажите пожалуйста.
UP: в процедуре "ОбработкаПолученияДанныхВыбора" выбирал стандартную обработку - аналогично = мой вариант не отображает окно с возможными номенклатурами, а стандартный вызов процедуры - отображает, хотя входящие параметры идентичны.
Думаю ещё важно указать что в "ДанныеВыбора" при моем программном вызове события попадает заполненный список, но в итоге не отображается.
По теме из базы знаний
- Восстановление раскладки клавиатуры
- Код для поиска номенклатуры в конфигурациях 1С. Использование мнемоники по первым буквам как вариант применения
- Управление состоянием для шаблона MVC и работы с данными объекта
- Полнотекстовый поиск в 1С. №2 Самое основное для разработчика
- Установка отбора для поля ввода управляемой формы через ПараметрыВыбора (без переопределения событий "НачалоВыбора", "Автоподбор")
Найденные решения
(4)При выборе склада делайте запрос для получения номенклатуры по складу.
Далее в обработчике Автоподбор нужного поля:
Не нужна СтандартнаяОбработка=Ложь;
Далее в обработчике Автоподбор нужного поля:
// массив - это массив номенклатуры, полученной запросом по складу
// заполняете структуру ПараметрыПолученияДанных
ПараметрыПолученияДанных.Очистить();
ПараметрыПолученияДанных.Вставить("Отбор",Новый Структура("Ссылка",Массив));
ПараметрыПолученияДанных.Вставить("СтрокаПоиска",Текст);
ПараметрыПолученияДанных.Вставить("РежимПолученияДанныхВыбора",РежимПолученияДанныхВыбораПриВводеПоСтроке.Непосредственно);
ПараметрыПолученияДанных.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
ПоказатьНе нужна СтандартнаяОбработка=Ложь;
Нужно было вместо события "ТоварыНоменклатураИзменениеТекстаРедактирования" использовать событие "ТоварыНоменклатураАвтоПодбор". Поменял - работает, хоть в нём и не рекомендуют делать серверные вызовы...
Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьМассивОтбора()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыНоменклатуры.Ссылка
|ИЗ
| Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивОтборов=Новый Массив;
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.Ссылка.Наименование="топливо" Тогда
МассивОтборов.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат МассивОтборов;
КонецФункции
&НаСервереБезКонтекста
Процедура ОбработкаДанныхВыбора(Текст,ДанныеВыбора)
ПараметрыПодбора=Новый Структура;
ТЗОтборТипы=ЗаполнитьМассивОтбора();
ПараметрыПодбора.Вставить("Отбор",Новый Структура("ВидНоменклатуры",ТЗОтборТипы));
ПараметрыПодбора.Вставить("СтрокаПоиска",Текст);
ПараметрыПодбора.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
ДанныеВыбора=Справочники.Номенклатура.ПолучитьДанныеВыбора(ПараметрыПодбора);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Нужно было вместо события "ТоварыНоменклатураИзменениеТекстаРедактирования" использовать событие "ТоварыНоменклатураАвтоПодбор". Поменял - работает, хоть в нём и не рекомендуют делать серверные вызовы...
Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
Задача стояла что бы при выборе невозможно было выбрать топливо хранящееся в справочнике номенклатур. Пришлось задействовать два события. Ниже код(может есть какое то другое решение, рад буду услышать критику):
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьМассивОтбора()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыНоменклатуры.Ссылка
|ИЗ
| Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивОтборов=Новый Массив;
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.Ссылка.Наименование="топливо" Тогда
МассивОтборов.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат МассивОтборов;
КонецФункции
&НаСервереБезКонтекста
Процедура ОбработкаДанныхВыбора(Текст,ДанныеВыбора)
ПараметрыПодбора=Новый Структура;
ТЗОтборТипы=ЗаполнитьМассивОтбора();
ПараметрыПодбора.Вставить("Отбор",Новый Структура("ВидНоменклатуры",ТЗОтборТипы));
ПараметрыПодбора.Вставить("СтрокаПоиска",Текст);
ПараметрыПодбора.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
ДанныеВыбора=Справочники.Номенклатура.ПолучитьДанныеВыбора(ПараметрыПодбора);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаДанныхВыбора(Текст,ДанныеВыбора);
КонецПроцедуры
Показать
(3) Не получится так, утоню детали. Нужно что бы в поле номенклатуры выбирались только те позиции, которые отгружаются с выбранного склада в документе заказа. То есть в дальнейшем, если, например, выбрал "Склад 1", то можно выбрать "Номенклатура1", "Номенклатура2", "Номенклатура3", а если выбран "Склад2", то можно уже выбрать только "Номенклатура4"...
(4) два варианта
1.сделайте кнопку: Заполнить, запросом получаете и заполняете или дозаполняете вашу ТЧ из остатков по указанному в шапке складу в разрезе Заказа.
2.у поля Номенклатура, делаете режим выбора из списка значений, а при открытии формы или смене склада, загружаете туда доступный список номенклатуры
1.сделайте кнопку: Заполнить, запросом получаете и заполняете или дозаполняете вашу ТЧ из остатков по указанному в шапке складу в разрезе Заказа.
2.у поля Номенклатура, делаете режим выбора из списка значений, а при открытии формы или смене склада, загружаете туда доступный список номенклатуры
(4)При выборе склада делайте запрос для получения номенклатуры по складу.
Далее в обработчике Автоподбор нужного поля:
Не нужна СтандартнаяОбработка=Ложь;
Далее в обработчике Автоподбор нужного поля:
// массив - это массив номенклатуры, полученной запросом по складу
// заполняете структуру ПараметрыПолученияДанных
ПараметрыПолученияДанных.Очистить();
ПараметрыПолученияДанных.Вставить("Отбор",Новый Структура("Ссылка",Массив));
ПараметрыПолученияДанных.Вставить("СтрокаПоиска",Текст);
ПараметрыПолученияДанных.Вставить("РежимПолученияДанныхВыбора",РежимПолученияДанныхВыбораПриВводеПоСтроке.Непосредственно);
ПараметрыПолученияДанных.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Элементы);
ПоказатьНе нужна СтандартнаяОбработка=Ложь;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот