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