Автоподбор: почему в списке выбора появляются значения, которых нет в ДанныеВыбора?

1. xaozai 20.03.18 10:47 Сейчас в теме
Есть внешняя обработка, на форме которой размещено поле для выбора пользователя из справочника Пользователи.
Выбирать можно только тех пользователей, которые занесены в регистр сведений (при открытии формы выбора устанавливается отбор).
Но есть еще ввод по строке. Пытаюсь переопределить обработку автоподбора...
В ОбработкаПолученияДанныхВыбора формирую список значений ДанныеВыбора, использую его в ПользовательАвтоПодбор().
В ПолучитьДанныеВыбора() передаю параметры, среди которых ПолнотекстовыйПоиск, равный ПолнотекстовыйПоискПриВводеПоСтроке.НеИспользовать.
При этом, в списке автоподбора на форме появляются значения, которых нет в данных выбора (проверял в отладчике).
ИсторияВыбораПриВводе у поля "Не использовать"...
Почему в выпадающем списке автоподбора появляются данные, которых нет в ДанныеВыбора?
8.3.11.3034
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MariusUrsus 20.03.18 17:20 Сейчас в теме
Здесь скорее всего стоит использовать поле ввода с быстрым выбором.
Поля, по которым производится поиск в быстром выборе определяются в свойстве "Ввод по строке" справочника. У типового справочника "Пользователи" это "Наименование". Для своего поля выбора переопределяете событие НачалоВыбора примерно так:
&НаКлиенте
Процедура ПолеВводаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	// Устанавливаем отбор на список быстрого выбора.
	ДанныеВыбора = ПолучитьСписокДоступныхЭлементов();
	
КонецПроцедуры // ПолеВводаНачалоВыбора()
Показать
3. MariusUrsus 21.03.18 11:33 Сейчас в теме
Если всё таки упереться и переопределять АвтоПодбор, то для получения корректных данных вывода необходимо учитывать также введенный текст, т.к. параметры получения данных не отрабатывают. Как минимум так:


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

&НаСервереБезКонтекста
Функция ПолучитьДанныеВыбораДляПоляВвода(Текст)
	
	ДанныеВыбора = Новый СписокЗначений;
	
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("Текст", Текст);
	
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Пользователи.Ссылка КАК Пользователи
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	НЕ Пользователи.ПометкаУдаления
	|	И НЕ Пользователи.ЭтоГруппа
	|	И Пользователи.Наименование ПОДОБНО &Текст + ""%""";
	ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
	
	ДанныеВыбора.ЗагрузитьЗначения(ТаблицаЗапроса.ВыгрузитьКолонку("Пользователи"));
	
	Возврат ДанныеВыбора;
	
КонецФункции // ПолучитьДанныеВыбораДляПоляВвода(Текст)
Показать
Светлый ум; +1 Ответить
4. PerlAmutor 129 21.10.18 10:34 Сейчас в теме
Конкретно в моем случае это оказался банальный баг платформы http://downloads.v8.1c.ru/content//Platform/8_3_7_2008/1cv8upd.htm
Наблюдалось в толстом клиенте УФ. Функция ПолучитьДанныеВыбора() не заходила в мой обработчик, а тут же возвращалась с заполненным откуда-то списком всех значений справочника.
5. Светлый ум 406 05.09.19 05:31 Сейчас в теме
(4) О, коллега - я тоже наткнулся на другой баг платформы: 8.3.12.1855

Событие поля "АвтоПодбор" по разному ведет себя в "форме списка" и в "форме элемента"
- в форме элемента (в отличии от списка) не отрабатывает полностью функция "СтандартнаяОбработка = ложь": в данные выбора попадают не только назначенные программно элементы.

Решением в данной ситуации стало применение сразу двух видов отборов для события "АвтоПодбор":
1) "СтандарнтнаяОбработка = Ложь" + " ДанныеВыбора = СписокСсылок"
2) "Элемент.ПараметрыВыбора = фПараметры, где фПараметры фиксированный массив ссылок.

Пример кода:

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

Показать
romankoav; kod_infostart; asbest; +3 Ответить
7. asbest 03.04.20 04:24 Сейчас в теме
(5) Огромное Вам спасибо. Чертовы баги.
6. user1345957 01.03.20 20:03 Сейчас в теме
Подскажите пожалуйста как обратиться к реквизиту справочника Логин (справочник Пользователи) ?
Стоит ли использовать событие автоподбор на общей форме Авторизация?
Так как, после регистрации пользователем, в справочник Пользователи заносится его данные, в том числе и логин (логин может являться и почтой тоже).
А во время авторизации зарегистрированному пользователю если совпадают хотя бы первые несколько цифр, букв его логина, выведется логин из справочника Пользователи.
Примерный код, так как я не доконца всё понял:

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

	Если Не ПустаяСтрока(Текст) Тогда
		СтандартнаяОбработка = Ложь;
		СЗЛогинов = Справочники.Пользователи.ПолучитьДанныеВыбора(); //СписокЗначенийЛогинов
	КонецЕсли;
	
	
	
КонецПроцедуры


&НаКлиенте
Процедура ПочтаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ДанныеВыбора = ПолучитьСписокДоступныхЭлементов();
	
КонецПроцедуры
Показать
8. Andy_sh 09.11.21 14:41 Сейчас в теме
Ситуация наблюдается если включена опция ИсторияВыбораПриВводе, для корректной работы автоподбора ее нужно отключать.
romankoav; detro; +2 Ответить
9. romankoav 4 19.09.23 16:30 Сейчас в теме
(8) Да. сработало четко. Это проще, чем код писать
Оставьте свое сообщение

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