Вход | Регистрация
    1  2  3   
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Глюк Формекс? Или я чего-то не понял...

v7: Глюк Формекс? Или я чего-то не понял...
Я
   MWWRuza
 
18.05.20 - 14:15
Добрый день!
Чего-то эта тема Полнотекстовый поиск по одному полю. Как можно реализовать? (полнотекстовый поиск) навеяла... Не то, что-бы оно нужно, но... Захотелось.

Вот что получилось, видеоролик: https://cloud.mail.ru/public/ZvVh/58WQVKN7H

Вот текст в обработке:

Перем ПодстрокаПоиска;
Перем СтрДоИзм;

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт)
    Если ФлСт                         = 0 Тогда
        Возврат;
    КонецЕсли;
    Если Форма.АктивныйЭлемент()     = "СтрПоиска" Тогда
        Если КодКлавиши             = 13 Тогда
            СтатусВозврата(0);
            Возврат;
        ИначеЕсли КодКлавиши         = 8 Тогда
            ДлинаСтрокиПоиска         = СтрДлина(СокрЛП(СтрПоиска));
            Если Прав(СтрДоИзм, 1)     = " " Тогда
                 ДлинаСтрокиПоиска    = ДлинаСтрокиПоиска + 1;  
            КонецЕсли;
            Если ДлинаСтрокиПоиска     < 2 Тогда
                НоваяСтрокаПоиска     = "";
            Иначе
                НоваяСтрокаПоиска     = Лев(СтрПоиска, ДлинаСтрокиПоиска - 1);
            КонецЕсли;
            ПодстрокаПоиска            = НоваяСтрокаПоиска;
        ИначеЕсли Символ             = " " Тогда
            ПодстрокаПоиска            = ПодстрокаПоиска + Символ;
            ВведПробел                 = 1;
        Иначе
            ПодстрокаПоиска            = ПодстрокаПоиска + Символ;
        КонецЕсли;    
        СтрПоиска                    = ПодстрокаПоиска;
        СтрДоИзм                    = ПодстрокаПоиска;
    //    Сообщить(ПодстрокаПоиска);
        Форма.ИнфСтрПоиска.Заголовок(ПодстрокаПоиска);
        
        Рез                         = ПопробоватьНайти();
        Если Рез                     = 0 Тогда
             РезПоиска.УдалитьСтроки();
             СпШкВыбТовара.УдалитьСтроки();
        КонецЕсли;
    КонецЕсли;    
КонецПроцедуры

Функция ПопробоватьНайти() у меня была и раньше, она на SQL-Lite сделана, и работает нормально.
В принципе - нового только то, что решил сделать с помощью Формекса так, что-бы искалось не нажимая ентер в строке или кнопку, просто при вводе символов в строку.

В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются...
Что это - глюк? Попытка асинхронности в Формекс?
Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться...
   Arbuz
 
1 - 18.05.20 - 14:46
ПопробоватьНайти() надо делать не из ПриНажатииКнопкиКлавиатуры(), а по формексовскому таймеру с интервалом мс 300, (пере)запуская который при изменении ПодстрокаПоиска
   MWWRuza
 
2 - 18.05.20 - 14:54
(1) Костыль конечно, но, можно попробовать... Должно прокатить.
   Arbuz
 
3 - 18.05.20 - 15:21
посмотрел, у меня не в таком, но похожем случае стоит 220мс, это порог 4,5 симв/сек. и это никакой не костыль, это pipelining performance enhancements - целая теория конвейеризации вычислений.
   АЛьФ
 
4 - 18.05.20 - 16:01
Все значимые действия лучше делать в "при отжатии".
   MWWRuza
 
5 - 18.05.20 - 20:17
(4) Переделал. Видимых отличий не заметил, но, пусть будет, раз так правильнее...

(1)(3) Сделал... Закомментировал вызов ПопробоватьНайти() в процедуре ПриОтжатииКнопкиКлавиатуры(), добавил предопределенную процедуру:

Процедура ПослеОткрытия()
    Расш = СоздатьОбъект("РасширениеФормы");
     Расш.ОбработкаОжидания("ПопробоватьНайти",300);    
КонецПроцедуры

Пока, для пробы не реализовывал сравнение - изменилась строка или нет...
Все равно "двоит" символы при быстром вводе... Как и ничего не менял...
Функцию поменял на процедуру:

Процедура ПопробоватьНайти()
    НаимПоиск    = СокрЛП(СтрПоиска);
    Рез = НайтиТоварSqlLite(НаимПоиск);
    ДостКнопкиПривязатьШК();
КонецПроцедуры

Стоит закомментировать строку "Рез = НайтиТоварSqlLite(НаимПоиск);", вызывающую поиск товара - "двоить" перестает, работает, как и задумывалось, только, естественно ничего не ищет...

Может я чего-то не вижу, что-нибудь сам накосячил, где-нибудь имена пересекаются? Вообще, это должно работать?
   Злопчинский
 
6 - 18.05.20 - 20:23
смотри может где-то лишняя перерисовка формы
   MWWRuza
 
7 - 18.05.20 - 20:32
(6) Да х.з.... Вроде нет ничего такого... Сейчас попробую комментировать строки в функции поиска, что-бы определиться - косяки от самого запроса или от обработки его результатов...
   MWWRuza
 
8 - 18.05.20 - 21:55
(4) Выяснилось еще ода проблема... ПриОтжатии, если удерживать клавишу "БакСпейс"(код клавиши 8), что-бы удалить несколько символоа за раз, отрабатывает как одно событие... Когда ПриНажатии, такого нет, передается последовательность нажатий по количеству символов...
Вот, если непонятно объяснил, видео: https://cloud.mail.ru/public/3TR1/Bg7mf9pgw
ИМХО, ПриНажатии более правильно работает...
   MWWRuza
 
9 - 18.05.20 - 22:37
По сабжу... Если ничего не находится, то и символы не задваиваются.
Например - если ввести "йцукенгшщзхъ", т.е. верхнюю строку клавиатуры, быстро, как только мне пальцы позволяют, никаких задвоений нет...
Если вводить что-то реальное, например "сигареты", то, начиная со второго символа, начинает "двоить" - получается ПодСтрока поиска "сиигареты", а в поле ввода - нормально, "сигареты"...
При чем, делает чаще всего только одно задвоение - по тому, что после первого-же задвоения, в базе товар перестает находиться...
Хотя, если попытаться набрать "синие"(ну, видимо есть такие сигареты), то после набора "си", он задваивает букву "и", выдает "сии", и находит товар - потому, как встречается в наименованиях слово "России"(это не сигареты - "Минеральная вода родники России"), и начинает двоить следующий...
Фигня какая-то... Вообще не понятно, куда копать...
   Salimbek
 
10 - 19.05.20 - 07:35
(9) А пошаговая отладка чего говорит?
Хотя лично я делал такое на ActiveX-контроле, потому что проще было с событиями. Нашел, тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421 в последнем сообщении

Сначала тоже думал делать как у тебя, но, вот, например, поведение юзера - выделяю часть неправильно введенного текста мышкой и нажимаю Del или Бакспейс - ожидаю, что удалится именно эта часть.
   Salimbek
 
11 - 19.05.20 - 07:48
+(10) И еще вот такая тема нашлась: http://www.1cpp.ru/forum/YaBB.pl?num=1152157445/30
   MWWRuza
 
12 - 19.05.20 - 09:05
(10) Отладка... А отладка ничего не говорит, так, как при отладке вводишь символы медленно, и все работает правильно...
Вставил сразу в начало процедуры такое: Сообщить(Символ + " " + СтрДлина(Символ));
Вот, скриншот: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-309.jpg
Вижу, что символы прилетают не задвоенные, одиночные(я думал - Формекс два символа в одном событии выдает, а нет), нормально... Но, с повторами, типа событие возникает дважды, при одном физическом нажатии. И при отжатии - то-же самое...

(10) Нашел, тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421 в последнем сообщении.
Скачал, спасибо, сейчас буду разбираться...
   Djelf
 
13 - 19.05.20 - 09:21
(5) Ты не туда таймер повесил. Его нужно взводить хоть в ПриНажатии, хоть в ПриОтжатии.
При повторном взводе он не сработает, а будет отложен до того момента пока кнопки не нажимаются.
Ну и естественно сбрасывать при начале поиска в sqlite.
   Salimbek
 
14 - 19.05.20 - 09:41
(12) Странно, такое ощущение, что у тебя само вызывается где-то повторно, типа через sendkeys или тупой повторный вызов процедуры. Возможно стоит пересмотреть процедуру "НайтиТоварSqlLite"
   MWWRuza
 
15 - 19.05.20 - 09:46
(13) Сейчас попробую...

(14) Возможно стоит пересмотреть процедуру "НайтиТоварSqlLite"

Да ничего там особенного нет, стандартная, как в демо-примере от этой компоненты:

Функция НайтиТоварSqlLite(Наим)
//    Тз = СоздатьОбъект("ТаблицаЗначений"); // Отладка

    Перем Запрос;
    Попытка
        БазаДанных = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        БазаДанных = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    Если ПустоеЗначение(Наим) = 1 Тогда
        Возврат 0;
    КонецЕсли;
    РазбиваемаяСтрока = СтрЗаменить(РазбиваемаяСтрока,"'","''");
    РазбиваемаяСтрока = СтрЗаменить(СокрЛП(Наим)," ",РазделительСтрок);
    БазаДанных.Открыть(":memory:");
    Запрос = БазаДанных.НовыйЗапрос();
    Запрос.ВыполнитьЗапрос("create virtual table Товары using dbeng(Справочник.Номенклатура)");
    Текст =     "SELECT
                |code Код,
                |id [Товар :Справочник.Номенклатура]
                |FROM Товары
                |WHERE isfolder=2 and ismark <> '*'"; 
    Для Индекс = 1 По СтрКоличествоСтрок(РазбиваемаяСтрока) Цикл
        Слово = СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс); 
        Если ПустоеЗначение(Слово) = 0 Тогда
            Текст = Текст + "
                |AND descr LIKE '%" + Слово + "%'";
        КонецЕсли;
    КонецЦикла;            
    Попытка
        Тз = Запрос.ВыполнитьЗапрос(Текст);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    РезПоиска.УдалитьСтроки();
    Если Тз.КоличествоСтрок() > 0 Тогда
         Тз.ВыбратьСтроки();
         Пока Тз.ПолучитьСтроку() = 1 Цикл
             РезПоиска.НоваяСтрока();
             БазЕд                    = Тз.Товар.БазоваяЕдиница;
             Тов                        = Тз.Товар;
             РезПоиска.ШКБаз            = СокрЛП(БазЕд.ШтрихКод);
             РезПоиска.Наименование     = СокрЛП(Тз.Товар);
             РезПоиска.Ед            = СокрЛП(БазЕд.ОКЕИ);
             РезПоиска.Цена            = глВернутьЦенуПоТипу(БазЕд, Константа.ТипЗакЦены, РабочаяДата());
             РезПоиска.Ост            = ПолТекОст(Тов);
             РезПоиска.НайдТов       = Тов;
         КонецЦикла;
         Возврат 1;
    Иначе
         СпШкВыбТовара.УдалитьСтроки();
        Возврат 0;    
    КонецЕсли;
//    Возврат 1; // Отладка    

КонецФункции
   Salimbek
 
16 - 19.05.20 - 09:59
А если закомментировать часть команд в этой функции - так же двоит? Или это происходит начиная с какого-то тайминга?


Кстати да, я бы сделал так: твою сформированную строку отправлял за пределы процедуры "ПриНажатии" через ВызватьВнешнееСобытие

И уже в обработке внешнего события производил поиск или что-там еще
   Salimbek
 
17 - 19.05.20 - 10:01
+(16) Имеется в виду это: http://www.1cpp.ru/docum/html/FormEx.html#asyncevent
   MWWRuza
 
18 - 19.05.20 - 10:03
(16) Пробовал еще вчера... Как только добавляю в процедуру ПриНажатии ВнешнееСобытие, сразу двоить начинает. Даже если это событие не обрабатываю, и ничего не ищу...
   MWWRuza
 
19 - 19.05.20 - 10:06
+(18) Тут похоже проблема не в поиске, а в том, что вообще "что-то делается" сразу за событием ПриНажатии/отжатии... И даже вызов таймера, тот-же эффект вызывает...
   MWWRuza
 
20 - 19.05.20 - 10:15
(19) А вообще - нет. Если в таймере закомментировать вызов поиска, то не двоит...

(13) Сейчас вот так сделал:

Процедура ПослеОткрытия()
    Расш = СоздатьОбъект("РасширениеФормы");
КонецПроцедуры

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

Процедура ПриОтжатииКнопкиКлавиатуры() 
    Расш.ОбработкаОжидания("ПопробоватьНайти",300);
КонецПроцедуры

Эффект = 0. Все то-же самое, один в один... Так-же работает правильно при вводе "не спеша", и так-же двоит, когда вводишь нормально.
   MWWRuza
 
21 - 19.05.20 - 10:16
+(20) Да, в попробовать найти:

Процедура ПопробоватьНайти()
    Расш.ОбработкаОжидания("ПопробоватьНайти", 0);
    НаимПоиск    = СокрЛП(СтрПоиска);
    Рез = НайтиТоварSqlLite(НаимПоиск);
    ДостКнопкиПривязатьШК();
КонецПроцедуры
   Djelf
 
22 - 19.05.20 - 10:21
(15) Ну что же ты так то? Конечно нужно запрос пересмотреть, чтобы тз не перебирать.
На самом деле значительно веселее такой поиск на sqlitedataprovider + ТабличноеПоле 1С++

(20) Трассируй в самой обработке вызовы поиска. При наборе символов поиска быть не должно. Он же не асинхронный...
   Djelf
 
23 - 19.05.20 - 10:24
+(22) А еще лучше сначала загнать в память sqlite всю номенклатуру, со всеми нужными реквизитами и дергать из памяти.
   Djelf
 
24 - 19.05.20 - 10:29
Держи быстрый поиск в тп https://cloud.mail.ru/public/UW9g/4p4YkHUry
   Salimbek
 
25 - 19.05.20 - 10:55
(18) Если время есть, то я могу потестировать после обеда. По идее - такого быть не должно, даже любопытно...
   MWWRuza
 
26 - 19.05.20 - 11:05
(24) Красиво, спасибо. Но, в "чистом виде" не пойдет, она не ищет когда фрагменты слов не по порядку набираешь(ну, это я думаю можно дописать). Но, все равно прикольно, изучу работу с табличным полем, я когда-то уже что-то делал на нем, давно, не помню уже...

(25) Да времени сейчас - хоть отбавляй :-)  Мне тоже кажется, что не должно. Самому уже не столько с "прикладной точки" это хочется доделать, а просто хочется понять, почему не работает... Сейчас соберу отдельно, внешней обработкой, и выложу сюда...
   Djelf
 
27 - 19.05.20 - 11:08
(26) У тебя в коде (15) алгоритм поиска уже есть. Замени эти 6 строчек и будет не по порядку искать.
   MWWRuza
 
28 - 19.05.20 - 11:17
(27) Да это понятно...
   Djelf
 
29 - 19.05.20 - 11:49
(28) А можно и pcre подключить... https://cloud.mail.ru/public/5JnR/2guHn6364

База.РазрешитьЗагрузкуРасширений(1);
SELECT load_extension('sqlite3_mod_pcre.dll');

SELECT
  ID  [Номенклатура $Справочник.Номенклатура]
FROM Справочник_Номенклатура
WHERE REGEXP('белое.*вино|вино.*белое',descr)
GROUP BY ID

   Злопчинский
 
30 - 19.05.20 - 12:29
отрыли стюардессу...
 
 Рекламное место пустует
   Salimbek
 
31 - 19.05.20 - 12:35
(0) Потестил в твоем варианте - тоже в какой-то момент выдало задвоение символов на пустом месте.
Убрал вот эту странность:

СтрПоиска                    = ПодстрокаПоиска;

И никаких задвоений не стало...
   Djelf
 
32 - 19.05.20 - 12:50
(30) Эээээ.... Погоди пока выкапывать! Я только начал разогреваться ;)

Поиск с помощью fts3 https://cloud.mail.ru/public/3ihK/2W9oLtGqm

SELECT load_extension('sqlite3_mod_fts3.dll');
CREATE VIRTUAL TABLE test USING fts3(content TEXT);
INSERT INTO test SELECT DESCR from Справочник_Номенклатура;
SELECT * FROM test WHERE content MATCH 'темное пиво';

   Salimbek
 
33 - 19.05.20 - 13:07
(32) Это немного другой поиск:

Например, запрос LIKE находит также строки, которые содержат такие термины как "linuxophobe" или "EnterpriseLinux". В нашем случае этого не происходит только потому, что Энроновская коллекция E-Mail не содержит таких термов. А запрос MATCH на таблице FTS3 выбирает только те строки, которые содержат "linux" как отдельный токен.

Отсель: http://xbb.uz/db/SQLite-FTS3-i-FTS4/
   Djelf
 
34 - 19.05.20 - 13:27
(33) Это да, поиск токена должен начинаться с определенных букв, но он не обязан ими заканчиваться.
А поскольку наименование достаточно стандартизировано, запрос 'тем* пи*' выведет адекватные результаты.
Можно и StrMatch еще прикрутить (не собирал как расширение для sqlite).
   Arbuz
 
35 - 19.05.20 - 13:33
(32) а оно с SQLITE_ENABLE_ICU?
   Djelf
 
36 - 19.05.20 - 14:03
(35) Нет, но он с токинайзером unicode61. icu - жирная штука...
   Arbuz
 
37 - 19.05.20 - 14:09
(36) харош! а вилдкарды везде работают? не нашёл в доках упоминания вообще. ну там '*ное пи*' или 'пив?' ?
   Djelf
 
38 - 19.05.20 - 14:18
(37) Нет, я же написал в (34), поиск только с самого начала токена ну и '*' - все символы до конца. Плата за скорость.
Но никто же не мешает вложенный fts запрос еще раз обработать.

Есть вот такая штука: http://xbb.uz/db/SQLite-FTS3-i-FTS4/5-Tokenajzery.html
Я fts`ом сам не пользуюсь, поэтому плотно эту тему не изучал.
   Arbuz
 
39 - 19.05.20 - 14:28
(38) ага увидел, в оригинальных доках, почему-то на русском проглядел. вообщем нужно тому у кого большие объёмы текста и нужен именно полнотекстовый поиск по термам. причём в dbf особого смысла нет, только в скулайтной базе. в нашем случае strmatch как расширение 1sqlite выглядит куда как интересней.
   Ёпрст
 
40 - 19.05.20 - 15:09
Интересно, сколько еще времени надо, чтоб они открыли для себя turbomd.dll и turbomd.vbs ?
   Ёпрст
 
41 - 19.05.20 - 15:10
И.. хреново, что в снеговике этого нема (
   MWWRuza
 
42 - 19.05.20 - 15:20
Стоило отъехать на три часа, вернулся - а вы тут уже в такие дебри полезли...
Вот, моя обработка, выдернутая из конфы в отдельный файл: https://cloud.mail.ru/public/3f2Y/3n5ZrojRy должна работать на любой конфе, где есть справочник "Номенклатура". Ну, естественно ВК должны быть доступны.
Работает точно так-же, как исходная, в конфе.
(31) Убрал вот эту странность:
А вот это, можно чуть разжевать? Без этого СтрПоиска будет пустой всегда... Или я не понял, что значит "убрал" - ? Как-то по другому сделал?
   Arbuz
 
43 - 19.05.20 - 15:21
(40) эээ... причём здесь turbomd? может svcsvc и strmatch?
   Ёпрст
 
44 - 19.05.20 - 15:26
(42) вот это нахрен писать не надо:

>>>>create virtual table Товары using dbeng

сто лет в обед есть подключение таблиц автоматом

(43) кровь из глаз смотреть, как закрывают 1с-ину и пересохраняют конфу
   Злопчинский
 
45 - 19.05.20 - 15:34
(42) ну положил бы в зип все ВК заодно.
а то на домашнем у меня толком окружения нет, чтобы проверить
   MWWRuza
 
46 - 19.05.20 - 15:36
(43) кровь из глаз смотреть, как закрывают 1с-ину и пересохраняют конфу

Ну, это в мой огород камень, точнее в критику моего видео...
На самом деле, база мизерная, "экспериментальная", на домашнем компе... По этому - пофик, она сохраняется пару секунд, использовать в данном случае турбо мд... Ну, можно конечно, но смысл?
   MWWRuza
 
47 - 19.05.20 - 15:44
(45) Вот: https://cloud.mail.ru/public/2CjJ/ABwdT3yd6
Там еще 1CPP.dll, она не используется, но грузится, так, по инерции, из ГМ конфы скопировал...
   MWWRuza
 
48 - 19.05.20 - 15:49
+(47) Можно закомментировать в обработке, для чистоты эксперимента...
   Arbuz
 
49 - 19.05.20 - 15:58
(47) ох ты и наворотил. вангую проблема в обработке бакспэйса ;) там адъ
пока не начнёшь стирать - всё ведь норм?
   Злопчинский
 
50 - 19.05.20 - 15:58
(47) Открыл.
выделно поле ввода, бэкспейс - поле очистилось, содержимое поля подставилось в инфо "отладка", бяка
   Злопчинский
 
51 - 19.05.20 - 16:00
ой, не бэкспейсом. а делом
   MWWRuza
 
52 - 19.05.20 - 16:02
(49) Нет. БакСпейс тут ни при чем. Просто начинаешь быстро набирать текст, и начинает двоить... Когда не спеша, "одним пальцем", по букве - все нормально.

(51) Делет я пока не обрабатывал, руки не дошли... Это не сложно сделать, если остальное заработает...
   Злопчинский
 
53 - 19.05.20 - 16:07
Криво "склеивается" строка "отладка". висят старые поисковые символы, при обнулении проля ввода - не очищается
   Ёпрст
 
54 - 19.05.20 - 16:09
(0) короче, через штатный контрол нормально не слепишь, даже отлавливая нажатия/отжатия клавиш.
Ибо "обновление" атрибута не "совпадает" с нажатием клавиш, он часть тупо игнорит.
Максимум, своя переменная в принажатии и уже её значения показывать на форме, делая фсо=0.
А так, любой активикс, типа текстбокс от мелкомягких, там такой проблемы нет, не надо ничего ловить (клавиши) там и так есть штатный отлов того, что в контроле.
   Злопчинский
 
55 - 19.05.20 - 16:10
1. У меня при быстром наборе вообще поиск не происходит -.
2. у тебя криво отрабатывает "показ" отладки, вообще не клеится с тем что я ввожу в поле
   Salimbek
 
56 - 19.05.20 - 16:11
(42) Ну вот смотри - у тебя есть поле ввода, куда буквы и так попадут, потому как мы их нажимаем. Но в этот момент, ты это поле переприсваиваешь, и, видимо, ловишь момент, когда поле перерисовалось и оно уже нажатую кнопку ловит как необработанную и потому принимает во второй раз.
Вместо этого - я предлагаю обрабатывать в твоем коде _только_ нажатия, и строить у себя "в памяти" в ПодстрокаПоиска аналог того, что в поле ввода и так само появится. Для этого достаточно 1) убрать то самое присваивание; 2) Вместо использования СтрПоиска использовать ПодстрокаПоиска
   MWWRuza
 
57 - 19.05.20 - 16:13
(53) При каком "обнулении" - ? Если выделяешь, и дел жмешь - то да, смотри выше. Если БакСпейсом - то все нормально, при условии, что вводил медленно и СтрПоиска соответствует тому, что отладка выводит.
   Злопчинский
 
58 - 19.05.20 - 16:14
(56) "Но в этот момент, ты это поле переприсваиваешь, и, видимо, ловишь момент, когда поле перерисовалось"
- как он это словит? поле перерисуется только после того как с ФСО=1 закончится "приНажатии".
   Злопчинский
 
59 - 19.05.20 - 16:15
а так - да, я у себя держал текстовую переменную и достраивал ее при нажатии кнопок. но у меян это попроще было, для NCL/ там вариантивности ввода не много.
   Злопчинский
 
60 - 19.05.20 - 16:15
(57) да пофиг как.
если поле ввода - пустое - то по логике и "отладка" д.б. пусто.
а у тебя этого нет.
 
 Рекламное место пустует
   Salimbek
 
61 - 19.05.20 - 16:16
(58) Дык, в коде (0) ФлСт в 1 то нигде и не присваивается )))
   MWWRuza
 
62 - 19.05.20 - 16:16
(55) Показ отладки - это Форма.ИнфСтрПоиска.Заголовок(СтрПоиска); Просто должно тупо выводить на форму содержимое поля ввода. А оно выводится не верно почему-то...
   Злопчинский
 
63 - 19.05.20 - 16:17
я не вникал что да как...
при нажатии (или отжатии) фиксируем символ.
добавляем его к "подстрокепоиска", выполняем поиск. выходим из "принажатии". имеем результат поиска по "подстроке поиска", в поле ввода - фиксируется введенный символ
.
так что, не работает?
   MWWRuza
 
64 - 19.05.20 - 16:19
(56)(63) Сейчас попробую...
   Злопчинский
 
65 - 19.05.20 - 16:20
(62) "Просто должно тупо выводить на форму содержимое поля ввода."
не будет оно так выводить. штатное поле ввода "фиксируется" (введенное значение) только после энтера/ухода фокуса с поля ввода. то есть ввод должен быть закончен.
   Злопчинский
 
66 - 19.05.20 - 16:21
поэтому - введенные символы штатно из поля ввода ты можешь получить только после окончания ввода.
если этого недостаточно - то отслеживаешь нажимаемые символы и строишь "паралельную" строку.
.так я себе представляю
   Ёпрст
 
67 - 19.05.20 - 16:25
Так, хотя бы.. курсора, правда не видно и хрен с ним

Перем ПодстрокаПоиска;
Перем Расш,АтрФ;
Перем БазаДанных;

Процедура ПриОткрытии()
    ПодстрокаПоиска = "Сигареты ""Курить вредно!""";
    СтрПоиска     = ПодстрокаПоиска;
    РезПоиска.НоваяКолонка("НайдТов"); 
    ЗагрузитьВнешнююКомпоненту("1CPP.dll");
    ЗагрузитьВнешнююКомпоненту("FormEx.dll"); 
    ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
    БазаДанных = СоздатьОбъект("SQLiteBase");
    БазаДанных.Открыть(":memory:");

    Расш = СоздатьОбъект("РасширениеФормы");
    Расш.УстановитьФорму(Форма);
    АтрФ = Расш.ПолучитьАтрибут("СтрПоиска");
КонецПроцедуры 

Функция НайтиТоварSqlLite(Наим)
    Если ПустоеЗначение(Наим) = 1 Тогда
        Возврат 0;
    КонецЕсли;
    РазбиваемаяСтрока = СтрЗаменить(РазбиваемаяСтрока,"'","''");
    РазбиваемаяСтрока = СтрЗаменить(СокрЛП(Наим)," ",РазделительСтрок);
    Запрос = БазаДанных.НовыйЗапрос();
    Текст = "SELECT
                |code Код,
                |id [Товар :Справочник.Номенклатура]
                |FROM [Справочник.Товары]
                |WHERE isfolder=2 and ismark <> '*'"; 
    Для Индекс = 1 По СтрКоличествоСтрок(РазбиваемаяСтрока) Цикл
        Слово = СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс); 
        Если ПустоеЗначение(Слово) = 0 Тогда
            Текст = Текст + "
                |AND descr LIKE '%" + Слово + "%'";
        КонецЕсли;
    КонецЦикла;            
    Тз = Запрос.ВыполнитьЗапрос(Текст);
    РезПоиска.УдалитьСтроки();
    Если Тз.КоличествоСтрок() > 0 Тогда
         Тз.ВыбратьСтроки();
         Пока Тз.ПолучитьСтроку() = 1 Цикл
             РезПоиска.НоваяСтрока();
             РезПоиска.НайдТов       = Тз.Товар;
         КонецЦикла;
         Возврат 1;
    Иначе 
         РезПоиска.УдалитьСтроки();
        Возврат 0;    
    КонецЕсли;
КонецФункции

Процедура ПопробоватьНайти()
    Рез = НайтиТоварSqlLite(СокрЛП(ПодстрокаПоиска));
КонецПроцедуры

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт)    
    Если Форма.АктивныйЭлемент()     = "СтрПоиска" Тогда
        ФлСт=0;
        Если КодКлавиши             = 13 Тогда
            ПопробоватьНайти();
            Возврат;
        ИначеЕсли КодКлавиши         = 8 Тогда 
            ПодстрокаПоиска     = Лев(ПодстрокаПоиска, СтрДлина(ПодстрокаПоиска) - 1);
        Иначе
            ПодстрокаПоиска            = ПодстрокаПоиска + Символ;
        КонецЕсли;
        Форма.ИнфСтрПоиска.Заголовок(ПодстрокаПоиска);
        АтрФ.Значение = ПодстрокаПоиска;
        Форма.Обновить(0);
        ПопробоватьНайти();
    КонецЕсли;    
КонецПроцедуры

   Salimbek
 
68 - 19.05.20 - 16:26
(65) В ветке из (11) http://www.1cpp.ru/forum/YaBB.pl?num=1152157445
был прикольный вариант:

Сервис.ЭмулироватьКлавиатуру("{ENTER}", 0, );
Система = СоздатьОбъект("Система");
Система.РазрешитьАктивацию();
Система.Активизировать("Реквизит");
Сервис.ЭмулироватьКлавиатуру("{END}", 0, );

Правда это надо обернуть в ЗащитаОтАльфа пример, вроде бы тут: http://www.1cpp.ru/forum/YaBB.pl?num=1152157445/23#23
   MWWRuza
 
69 - 19.05.20 - 16:27
(64) Попробовал. Работает, но, точно-так же...

(66) .так себе представляю

Я тоже. Поэтому у меня и была строка: СтрПоиска    = ПодстрокаПоиска; Подстрока - искуственно сформированная, содержимое СтрПоиска пытаюсь на нее менять.
   Djelf
 
70 - 19.05.20 - 16:27
(39) Да не вопрос. Слепил: https://cloud.mail.ru/public/4pym/4S9Y59T1f
Давно хотел такое попробовать. Это и ВК для 1С, без регистрации в реестре и одновременно плагин под sqlite3.
Как ВК оно совместно со старой strmatc.dll
А в sqlite3 так:
SELECT load_extension('strmatch.dll');
SELECT 
descr,
strmatch(descr,'1Стакан из пластмасс Желтый 200мл')
from Справочник_Номенклатура
order by strmatch(descr,'1Стакан из пластмасс Желтый 200мл') desc


Обработка на 1С ~3c, на sqlite 300мс ;)
   Злопчинский
 
71 - 19.05.20 - 16:36
(69) "СтрПоиска    = ПодстрокаПоиска"
- нахера?
поиск отработал.
подстрока поиска сформированан ДО выхода из "Принажатии. после выхода СтПоиска - сформируется штатно отработкой введенного символа.
нахрен априсваивать-то?
   MWWRuza
 
72 - 19.05.20 - 16:43
(67) Да, так не двоит... По крайней мере, с моей скоростью печати, мне не удалось получить такой эффект.
Курсор, правда, всегда в начале строки визуально... но отрабатывает так, как будто он в конце стоит :-)
   MWWRuza
 
73 - 19.05.20 - 17:02
(71) нахрен априсваивать-то?
Да уже убрал... Но, сути не поменяло - все равно не правильно выводит на форму содержимое поля ввода.
   Salimbek
 
74 - 19.05.20 - 17:02
(72) Потому что у него установлено ФлСт=0;
И присваивание строки, а у тебя в (0) и обработка нажатия символов, и ФлСт - не было, потому символы пролетали в поле ввода, и это поле ты переприсваивал.
   Salimbek
 
75 - 19.05.20 - 17:03
Кстати, попробовал я свою обработку из (10) запустить и не заработало - похоже ей нужен установленный офис для Forms.TextBox.1
   Злопчинский
 
76 - 19.05.20 - 17:04
(74) ;-)
   MWWRuza
 
77 - 19.05.20 - 17:06
(67) А что мешает в процедуре "ПриНажатииКнопкиКлавиатуры" перед строкой "ПопробоватьНайти();" вернуть флаг ФлСт в единицу - ? Попробовал, вроде не двоит и курсор на месте.

PS В принципе - делет обработать, и вполне себе рабочая фиговина получилась :-)))
   Злопчинский
 
78 - 19.05.20 - 17:08
я правда нихера не понял. в чем проблема была. как обычно - в коде?
   MWWRuza
 
79 - 19.05.20 - 17:08
(78) в ДНК :-)
   Злопчинский
 
80 - 19.05.20 - 17:09
   MWWRuza
 
81 - 19.05.20 - 17:12
(54) (0) короче, через штатный контрол нормально не слепишь, даже отлавливая нажатия/отжатия клавиш.

Ну, вот, а ты говорил... Совместными усилиями слепили из г***а конфетку :-)))
   Ёпрст
 
82 - 19.05.20 - 17:13
(81) не.. у тебя тут просто искусственная "задержка" нажатия из-за поиска, если его выкинешь, то штатный контрол не успевает обработать все нажатия кнопки
   Ёпрст
 
83 - 19.05.20 - 17:14
он часть нажатий теряет
   MWWRuza
 
84 - 19.05.20 - 17:18
Ну, понятно... Но, работает, даже без поиска, когда его комментируешь.
   MWWRuza
 
85 - 19.05.20 - 17:21
+(84) Это надо жо** копиркой вытирать(это я анекдот про секретаря-машинистку вспомнил :-) ), что-бы штатный контрол не успел отработать... Это-ж сколько знаков в секунду надо печатать...
   Злопчинский
 
86 - 19.05.20 - 17:37
(82) это как? ни разу не встречал чтобы штатный контрол терял нажатия...
???
   Volodja
 
87 - 19.05.20 - 19:09
(70)
База.РазрешитьЗагрузкуРасширений(1);
SELECT load_extension('strmatch.dll');
ошибка not authorized. 
Как включить возможность выполнения load_extension?
версия 1sqlite 3.25.1.23
   MWWRuza
 
88 - 19.05.20 - 19:25
Вот, рабочий вариант обработки, может кому-то пригодится "для дальнейших изысканий": https://cloud.mail.ru/public/4uvv/E8xmF1GwJ
Добавил орлаботку "Delete", правда, только полная очистка строки поиска. Сделать, что-бы очищался выделенный фрагмент строки - проблематично... Может когда-нибудь, под настроение, поразбираюсь... Или кто-то, кому не лень - доведет до ума... Пока, и так сойдет, вполне прилично работает.
   MWWRuza
 
89 - 19.05.20 - 19:30
+(88) Там, в контоле, удаляешь часть строки, а из кода видна как исходная, до удаления... Надо или "ентер" эмулировать, или с флагом СтандартнойОбработки  играть, так, "с наскоку" победить не получилось.
   Volodja
 
90 - 19.05.20 - 19:34
(89) А через обработку ожидания это реализовать разве не получится. Вызывать обработчик скажем через 100ms
   Volodja
 
91 - 19.05.20 - 19:38
(89) и клавиатуру опрашивать не придется
   MWWRuza
 
92 - 19.05.20 - 19:42
(91) Вызывать обработчик скажем через 100ms

Обработчик чего? В поле, до нажатия ентер, старые данные, до удаления части строки делетом...
   Djelf
 
93 - 19.05.20 - 19:42
(87) Для начала нужен ответ от SELECT sqlite_version(), потом уже каталоги и т.п.
Я просто кинул в 1С/BIN и оно там завелось.
   Volodja
 
94 - 19.05.20 - 19:45
(92) Таймер
   Volodja
 
95 - 19.05.20 - 19:48
(94)
ОбработкаОжидания(<?>,)
Синтаксис:
ОбработкаОжидания(<Имя>,<Интервал>)
Назначение:
Вызывает глобальную процедуру с заданным интервалом в милисекундах.
ПРИМЕР:
Сервис = СоздатьОбъект(''Сервис'');
Сервис.ОбработкаОжидания(''глПолучитьНовыеЗаявки'',100);
   Volodja
 
96 - 19.05.20 - 19:52
(93) sqlite_version() выдал 3.25.1
   Volodja
 
97 - 19.05.20 - 19:58
(93) кинул strmatch в \bin
Крах системы
   Volodja
 
98 - 19.05.20 - 19:59
т.е. приложения
   Volodja
 
99 - 19.05.20 - 20:00
Вылет на 
БазаДанных.РазрешитьЗагрузкуРасширений(1);
   MWWRuza
 
100 - 19.05.20 - 20:09
(95) Я знаю, как обработчик ожидания подключать...
Вопрос - что по нему вызывать, если в поле, не смотря на то, что мы видим на экране, содержатся "старые" данные, до редактирования, пока ентером не подтвердишь.
  1  2  3   

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