Имя: Пароль:
1C
1С v8
Обработчик "АвтоПодбор" поля ввода
,
0 yc4
 
29.11.12
12:39
Господа специалисты, помогите разобраться!

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

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

Суть проблемы:

После ввода символов в "ПолеВводаПоиска" и срабатывания обработчика АвтоПодбор текст в поле очищается. Если закомментировать строку "СписокНайденных.Очистить();" текст не пропадает.

Вопрос:

Как сделать, чтобы текст не пропадал?
1 Goggy
 
29.11.12
12:42
>>Если закомментировать строку "СписокНайденных.Очистить();" текст не пропадает.

>>Как сделать, чтобы текст не пропадал?

Такие высказывания у меня вызывают когнитивный диссонанс...
2 yc4
 
29.11.12
13:01
Кто-нибудь может что-то конструктивное ответить?
3 yc4
 
29.11.12
15:13
В каких ситуациях вы используете обработчик события "АвтоПодбор", помимо формирования собственного списка выбора?
4 Buster007
 
29.11.12
15:19
а теперь все сначала и на русском)
5 yc4
 
29.11.12
15:27
Хочу реализовать такой механизм: Пользователь вводит в поле текст. По мере ввода происходит поиск данных и они отображаются в таблице.
Для этого использую обработчик АвтоПодбор в котором происходит поиск и отображение найденных данных по введенному фрагменту текста. Все работает, но текст в поле ввода всегда очищается. В этом проблема.
6 5 Элемент
 
29.11.12
15:36
Скорее всего вот из-за этого
В обработчике события АвтоПодбор нельзя использовать серверные методы формы с директивой компиляции НаСервере.
7 yc4
 
29.11.12
15:41
(6) В моем примере в первом сообщении нет вызовов серверных процедур.
8 yc4
 
29.11.12
17:19
В ходе экспериментов обнаружил интересную вещь. Если сделать так, то будет постоянный вывод текущего времени (получится бесконечный цикл):

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

       Сообщить(Формат(ТекущаяДата(), "ДФ=мм:сс"));
   Элементы.ПолеВводаПоиска.ВыделенныйТекст = Текст;
   
КонецПроцедуры
9 5 Элемент
 
29.11.12
17:25
(7) Уверен? включи показатели производительности и посмотри есть ли вызовы сервера. Иногда что-то не очевидно :)
10 regniws
 
29.11.12
17:26
ОбработкаПолученияДанных выбора для ссылочных типов конечно же знаем?
11 yc4
 
29.11.12
17:27
(10) Ога. Только у меня строка - (0)
12 yc4
 
29.11.12
17:35
(9) В синтакс-помощнике черным по белому написано - "... нельзя использовать серверные методы формы с директивой компиляции НаСервере.", и не сказано про неявные вызовы сервера. Показатели производительности включены - нет вызова сервера.
13 yc4
 
29.11.12
17:48
Ну почему так все несправедливо!!!????

В обычном режиме все работает как надо. Поле ввода не очищается.
14 regniws
 
29.11.12
17:57
Зачем вообще СписокНайденных очищается?
15 yc4
 
29.11.12
17:59
(14) Чтобы потом заполниться найденными значениями по введенной строке в поле ввода поиска
16 regniws
 
29.11.12
18:12
а ДанныеВыбора где заполняются?
17 yc4
 
29.11.12
19:44
ДанныеВыбора не заполняю. Мне не нужно заполнять стандартный список выбора. СписокНайденных - это таблица значений, которая заполняется при срабатывании обработчика АвтоПодбор.
18 regniws
 
30.11.12
09:13
(17) какой-то бред. АвтоПодбор это событие, с помощью которого можно заполнить ДанныеВыбора, из которых пользователь выберет то, что ему выпало в этом списке ДанныеВыбора.
19 yc4
 
30.11.12
09:16
(18) Спорить не буду. Все верно. Но это при стандартной обработке. Такое описано в букварях. Читать я умею и не стал бы обращаться за помощью в таком случае.
20 regniws
 
30.11.12
09:37
(19) ну если вы используете процедуры и функции не по назначению, скажем так, платформа не всегда может однозначно отработать.
21 yc4
 
30.11.12
09:53
Очень жаль, что у нас вами такая платформа, если она по разному отрабатывает события в управляемом и обычном режиме.
22 regniws
 
30.11.12
11:23
(21) у меня прекрасная платформа, которая прекрасно работает в сценариях, которые в ней предусмотрены. Обижаться на то, что моя машина не может вылезти из кучи снега, потому что рассчитана на быструю езду по автобанам - я бы не стал. Так же и тут. Есть сценарий - он реализован, отлажен и работает. Если используется какой-то хак - это уже не проблемы платформы.

У меня есть похожий сценарий и у меня все работает, только я руками не заполняю таблицы, а устанавливаю отборы на демонический список, никаких очисток не происходит, все гуд.
23 yc4
 
30.11.12
11:57
(22) Платформа - 8.2.17.143. Накидал пример:

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


Отбор устанавливается. Текст в поле ввода очищается.
24 regniws
 
30.11.12
12:08
(23) щас у себя проверю на 17ой
25 regniws
 
30.11.12
12:14
(23) в тонком и веб у меня все норм.
26 regniws
 
30.11.12
12:15
у меня так:

&НаКлиенте
Процедура Наименование1ПриИзменении(Элемент)
   
   УстановитьОтбор("Наименование", Наименование);
   
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтбор(ИмяЭлемента, Значение)
   
   ПолеСКД = Новый ПолеКомпоновкиДанных(ИмяЭлемента);
   
   ЭлементОтбора = Неопределено;
   
   Для Каждого Элемент Из Список.Отбор.Элементы Цикл
       Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
           Если Элемент.ЛевоеЗначение = ПолеСКД Тогда
               ЭлементОтбора = Элемент;
               Прервать;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   Если ЭлементОтбора = Неопределено Тогда
       ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
       ЭлементОтбора.ЛевоеЗначение = ПолеСКД;
   КонецЕсли;
   
   ЭлементОтбора.Использование = НЕ ПустаяСтрока(СокрЛП(Значение));
   
   Если НЕ ЭлементОтбора.Использование Тогда
       Возврат;
   КонецЕсли;
   ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
   ЭлементОтбора.ПравоеЗначение = СокрЛП(Значение);
   
КонецПроцедуры
27 regniws
 
30.11.12
12:22
В толстом тоже все норм
28 yc4
 
30.11.12
12:22
(25) Проверяли мой пример?

(26) В этом примере обработчик ПриИзменении, а меня все-таки интересует АвтоПодбор
29 regniws
 
30.11.12
12:24
(28) да, виноват, соседнюю процедуру скопировал, но сути не меняет

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

нет, конкретно твой не пробовал, но отличий на взгляд не вижу, надо искать другие отличия
30 regniws
 
30.11.12
12:26
щас скриншоты настройки поля скину
31 regniws
 
30.11.12
12:29
32 yc4
 
30.11.12
12:39
(31) Отличий минимум: у меня нет обработчика ПриИзменении и положение заголовка Авто.
33 yc4
 
30.11.12
12:51
Ничего не понимаю... В другой базе запускаю похожую обработку и работает как надо.
34 yc4
 
30.11.12
13:07
(33) Правда база файловая
35 regniws
 
30.11.12
13:18
(34) я и в клиент-сервере и в файловой проверил, все ок, работает. Странно, действительно странно
36 yc4
 
30.11.12
13:37
(35) тоже проверил на другой базе клиент-серверной. Там все ок. Похоже дело в конкретной базе. Буду с ней экспериментировать.
37 yc4
 
30.11.12
14:47
(35) Режим совместимости случайно не включен? Когда в своей базе включаю режим совместимости 8.2.13, то все ок.