Имя: Пароль:
1C
1С v8
Отбор при вводе строки в управляемом приложении 1с 8.3
0 JinAir
 
08.03.17
09:25
Здравствуйте, уважаемые форумчане. столкнулся с проблемой при реализации отбора при вводе в строку. Сам смысл задачи: "Сотрудник" является реквизитом табличной части "Сотрудники", при задании Организации в соответствующем реквизите формы при вводе должен формироваться список сотрудников, работающих только в данной организации.

Вот код собственно:


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

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

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

Помогите пожалуйста
1 Мимохожий Однако
 
08.03.17
10:12
Так в чём проблема?
2 Web00001
 
08.03.17
10:15
(0)>>начинаю вводить и кроме двух женщин, ещё этот мужик в списке почему-то
Значит в списке который возвращает запрос, этот мужик еще есть почему-то.
Для начала надо отладить запрос и убедиться, что он возвращает нужные данные. Потом, может можно как то закешировать список сотрудников, что бы не дергать базу каждый раз?
3 Мимохожий Однако
 
08.03.17
10:18
(0) Отладь запрос в консоли, а потом вставь в свой код
4 JinAir
 
08.03.17
10:36
(1) (2) (3)

проблема как и говорил не в запросе, это я давно отладил. вот пруфы http://devtrainingforum.v8.1c.ru/forum/mess_files/1_LTGD.jpg

http://devtrainingforum.v8.1c.ru/forum/mess_files/2_oRy4.jpg
5 Мимохожий Однако
 
08.03.17
10:43
По большому счету, я бы вообще не стал менять и отключать стандартные механизмы автоподобора. Этот механизм и так работает нормально.
6 Vladal
 
08.03.17
10:45
(2) предлагаю «что бы» добавить в матофильтр.
7 h-sp
 
08.03.17
10:48
(4) попробуйте

СтандартнаяОбработка = Истина
8 Web00001
 
08.03.17
11:04
+(0)Ну и и еще у меня вот такой вот код работает:
Элемент.СписокВыбора.ЗагрузитьЗначения(ЗдесьМассивСЗначениями);
9 Web00001
 
08.03.17
11:11
+(8) То есть вот так выглядит весь код

&НаКлиенте
Процедура ДанныеДляВводаНазваниеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    Если СтрДлина(Текст) > 2 Тогда
        Элемент.СписокВыбора.Очистить();    
        Элемент.СписокВыбора.ЗагрузитьЗначения(НайтиВозможныеВарианты(Текст, ВариантыНазваний));
    КонецЕсли;
КонецПроцедуры
10 JinAir
 
08.03.17
12:02
(9) а ВариантыНазваний это что у вас?
11 JinAir
 
08.03.17
12:11
(9) почему у вас:

СтандартнаяОбработка = Ложь;

он же без этого по стандартному алгоритму ищет и на:

Элемент.СписокВыбора.Очистить();    
        Элемент.СписокВыбора.ЗагрузитьЗначения(НайтиВозможныеВарианты(Текст, ВариантыНазваний));

ему пофиг
12 RomanYS
 
08.03.17
12:24
Непонятно почему (0) ошибку не выдает:
"...АвтоПодбор ...
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере. "
13 RomanYS
 
08.03.17
12:26
Ну и
"КадроваяИсторияСотрудниковСрезПоследних.Сотрудник.Наименование КАК Сотрудник"
возвращает строку, а не ссылку
14 JinAir
 
08.03.17
12:37
(13) точно, спасибо ошибся
15 Web00001
 
08.03.17
13:30
(10) ВариантыНазваний - закэшированные значения в массиве, что бы не ходить к базе каждый раз.
(11)Это работающий код.
16 JinAir
 
08.03.17
13:41
У меня ругается, когда делаю как вы.

{Документ.ИЦК_ПриказОПоощрении.Форма.ФормаДокумента.Форма(13)}: Ошибка при вызове метода контекста (ЗагрузитьЗначения)
        Элемент.СписокВыбора.ЗагрузитьЗначения(ПолучитьДанныеВыбораСотрудников(Текст, Объект.Организация));
по причине:
Несоответствие типов (параметр номер '1')

в интернете прочитал, что так надо делать для события НачалоВыбораИзСписка
17 JinAir
 
08.03.17
14:00
(15) простите. можете скинуть полный код вашей программы
18 Web00001
 
08.03.17
15:28
(16)Это по той причине, что Элемент.СписокВыбора это список значений и в ЗагрузитьЗначения, он ожидает массив а у тебя функция возвращает, список значений
ЗЫ можно говорить мне ты, я не расстроюсь.
19 JinAir
 
08.03.17
17:14
Сделал всё как у тебя вместо структуры в функции на сервере объявил массив, всё туда аккуратненько добавляю. Вызывается при автоподборе: Элемент.СписокВыбора.ЗагрузитьЗначения(ПолучитьДанныеВыбораСотрудников(Текст, Объект.Организация));
и через отладчик даже смотришь, что в массиве столько же элементов сколько и должно выводиться. вот только теперь при написании: Стандартнаяобработка = Ложь; - вообще ничего не ищет, а при Стандартнаяобработка = Истина; - ищет всё (18)
20 TeMochkiN
 
08.03.17
18:10
А почему нужно в регистре сведений эту информацию брать? Разве в карточке сотрудника нет реквизита Организация? И почему бы не использовать параметры выбора у колонки при изменении организации?
21 Web00001
 
09.03.17
01:19
(19) это у тебя точно к событию автоподбор привязано? при вводе текста это событие срабатывает?
22 JinAir
 
09.03.17
03:17
(21) срабатывает, скрины кидал же с отладчика (4)
23 Web00001
 
09.03.17
05:44
(22)Сложно сказать, где проблема. Надо смотреть глазами. У меня текстовое поле и там нет стандартной обработки автоподбора текста. Поэтому и проблемы с ее включением\выключением, тоже нет.
24 h-sp
 
09.03.17
06:57
(22) поставь все-таки правильно

СтандартнаяОбработка = Истина;

у тебя же стандартная обработка.
25 TeMochkiN
 
09.03.17
08:45
(22) так вы не можете пояснить, почему не подходят параметры выбора для вашей задачи? Организация то одна на весь документ, как я понял. Вот при выборе организации устанавливали бы параметры выбора у поля сотрудник.
26 TeMochkiN
 
09.03.17
09:13
даже не параметры выбора, а связи параметров выбора.
27 TeMochkiN
 
09.03.17
09:14
оно ж на автоподбор тоже влияет