Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Поиск и переход на строку поиска.

Поиск и переход на строку поиска.
Я
   fantomask
 
13.10.16 - 06:25
есть в табличной части неуправляемых форм штатный механизм поиска при вводе. Что то подобное мне надо реализовать на тонком клиенте. Написал кое какой код, вот только беда, при вводе постоянно затираются буквы что ввели, из за чего результаты поиска постоянно скачут.
Написал следующий код:

&НаКлиенте
Процедура ТоварыНаименованиеТовараИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)    
    СтандартнаяОбработка=ложь;
    Если ПустаяСтрока(Текст) ТОгда
        ТекДанные = Элементы.Товары.ТекущиеДанные;
        ТекДанные.НаименованиеТовара = ПолучитьНаименованиеТОвара(ТекДанные.Номенклатура);
        товары.Сортировать("НаименованиеТовара");
        Элементы.Товары.ТекущаяСтрока=товары[0];
        Элементы.Товары.ОтборСтрок = Неопределено;
    Иначе
        найденнаяСтрока = СделатьОтбор(Текст);
        
        Стр = новый Структура;
        Стр.Вставить("НаименованиеТовара",найденнаяСтрока);
        Строки = товары.НайтиСтроки(Стр);
        Если Строки.Количество()>0 Тогда
            Элементы.Товары.ТекущаяСтрока = Строки[0].НомерСтроки;
        КонецЕсли;
        
        //Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(Стр);

        
    КонецЕсли;
КонецПроцедуры

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

    Если Результат.Количество()>0 Тогда
        Возврат Результат[0].НаименованиеТовара;
    КонецЕсли;
    
КонецФункции
 
 
   DrZombi
 
1 - 13.10.16 - 07:19
(0) На тонком клиенте все работает через Менеджер того справочника, который ты редактируешь...
Метод "ОбработкаПолученияДанныхВыбора"

СправочникМенеджер.<Имя справочника>.ОбработкаПолученияДанныхВыбора (CatalogManager.<Имя справочника>.ChoiceDataGetProcessing)
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
ОбработкаПолученияДанныхВыбора (ChoiceDataGetProcessing)
Синтаксис:

ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)
Параметры:

<ДанныеВыбора>

Тип: СписокЗначений.
В обработчике можно сформировать и передать в этом параметре данные для выбора. При этом параметр <СтандартнаяОбработка> должен быть установлен в Ложь.
В элемент списка значений можно помещать не только конкретное значение, но и структуру.
Анализ значения на предмет того, является ли она структурой или просто значением, используется полем ввода управляемой формы в случаях:
Выбора из списков, возвращаемых событиями поля ввода;
Выбора из списка в поле ввода, содержащегося в свойстве СписокВыбора.
В случае, если в значение элемента списка значений используется Структура, она должна иметь следующий состав свойств:
Значение (Value) – собственно значение (обязательный элемент структуры); 
ПометкаУдаления (DeletionMark) – (Булево) содержит признак пометки значения на удаление. Если Истина, то при выборе такого элемента из списка значений выдаст стандартное предупреждение; 
Предупреждение (Warning) – (Строка) содержит текст предупреждения, которое будет показано при выборе элемента из списка значений.
<Параметры>

Тип: Структура.
Содержит параметры выбора.
Их можно дополнительно настроить в обработчике события.
Структура, в которой обязательно должны содержаться следующие ключи:
СтрокаПоиска (SearchString) - строка, используемая при поиске данных, Неопределено - осуществляется быстрый выбор; 
Отбор (Filter) - отбор, используемый при поиске данных; 
ВыборГруппИЭлементов (ChoiceFoldersAndItems) - указывается использование групп и элементов (только для иерархических данных); тип ИспользованиеГруппИЭлементов; 
СпособПоискаСтроки (StringSearchMode) - указывается способ поиска при вводе по строке; тип СпособПоискаСтрокиПриВводеПоСтроке; параметр может отсутствовать; 
ПолнотекстовыйПоиск (FullTextSearch) - указывается необходимость использования полнотекстового поиска при вводе по строке; тип - ПолнотекстовыйПоискПриВводеПоСтроке; параметр может отсутствовать; 
РежимПолученияДанныхВыбора (ChoiceDataGettingMode) - указывает режим запуска поиска. Тип РежимПолученияДанныхВыбораПриВводеПоСтроке; параметр может отсутствовать.
<СтандартнаяОбработка>

Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Значение по умолчанию: Истина.
Описание:

Возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе, а также при выполнении метода ПолучитьДанныеВыбора.
--------------------------------------------------------------------------------

     Методическая информация
   DrZombi
 
2 - 13.10.16 - 07:22
Параметры можно послать через Элемент на форме, "Параметры выбора ПараметрыВыбора, ChoiceParameters"

Оформляешь там свой параметр и в "ОбработкаПолученияДанныхВыбора" его обработываешь, как надо.

Минус!... Если запрос должен быть быстрым.
Больше 50-ти элементов все ровно не отобразится, так что не имеет смысла искать больше...
   DrZombi
 
3 - 13.10.16 - 07:23
+ Параметр можно задавать произвольный, это необходимо, что бы выборка работала в штатном режиме из других форм :)
   DrZombi
 
4 - 13.10.16 - 07:25
+ Не обессудь, если не угадал с ответом, утро :)
   fantomask
 
5 - 13.10.16 - 09:56
(4) ничего, сам писал пост утром, не уточнил некоторые моменты.
Есть на форме обработки таблица значений, в эту таблицу заполняются товары с ценами и остатками, Вот по колонке наименованиетовара я делаю поиск.
   fantomask
 
6 - 13.10.16 - 10:45
Есть мысли?
   FIXXXL
 
7 - 13.10.16 - 10:47
(6) НайтиСтроки, ИдентификаторСтроки, ТекущаяСтрока = НайденныйИДСтроки
   FIXXXL
 
8 - 13.10.16 - 10:48
примечание: НайтиСтроки() неявно вызывает Сервер
   fantomask
 
9 - 13.10.16 - 11:21
Найти строки не будет отрабатывать при неявном поиске. Допустим товар линекс. При вводе лин он ничего не найдет...
   FIXXXL
 
10 - 13.10.16 - 11:28
(9) будет, если напишешь :) тебе много колонок этим поиском надо обеспечить?
как вариант: НаСервере выгружаешь твою ТЗ с формы в ТЗ, ТЗ в запрос, запросом получаешь Номенклатуру по Название СОДЕРЖИТ и уже эту номенклатуру в НайтиСтроки

короче, что бы найти строку - надо найти строку :)
 
 Рекламное место пустует
   FIXXXL
 
11 - 13.10.16 - 11:40
(10) тут еще возникает момент "несколько одинаковых строк"
   fantomask
 
12 - 13.10.16 - 14:29
(10) С содержит тоже не годится, потому что есть товар ЛеоВИТ и есть товар ВИТрум. в такое случае поиск тоже будет криво отрабатывать.
НайтиСтроку из ТЗ работает только в случае когда название полностью соответствует значению колонки.
Эхх придется костылить и в процессе додумывать
   FIXXXL
 
13 - 13.10.16 - 15:05
(12) а как работает поиск в толстой форме? возвращает первую строку по вхождению, так и тут получится
тут надо эксперимент, что бы проверить, что порядок строк нигде не слетит и вернется точно первая по порядку в ТЗ строка
   FIXXXL
 
14 - 13.10.16 - 15:08
(13) сорри не то
тебе ж нужен поиск СНАЧАЛА строки, тогда ПОДОБНО СтрокаПоиска%

% - только на хвосте параметра в запросе, попробуй, должно взлететь

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует