1 2 3 ► |
1С:Предприятие
:: 1С:Предприятие 7.7 и ранее
|
|
| ||
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 | |||
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 | |||
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 | |||
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 | |||
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 | |||
Злопчинский 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 | |||
Злопчинский 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 | |||
MWWRuza 62 - 19.05.20 - 16:16 | (55) Показ отладки - это Форма.ИнфСтрПоиска.Заголовок(СтрПоиска); Просто должно тупо выводить на форму содержимое поля ввода. А оно выводится не верно почему-то... | ||
Злопчинский 63 - 19.05.20 - 16:17 | я не вникал что да как...
при нажатии (или отжатии) фиксируем символ. добавляем его к "подстрокепоиска", выполняем поиск. выходим из "принажатии". имеем результат поиска по "подстроке поиска", в поле ввода - фиксируется введенный символ . так что, не работает? | ||
MWWRuza 64 - 19.05.20 - 16:19 | |||
Злопчинский 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 | |||
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 | |||
Ёпрст 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 | |||
Volodja 87 - 19.05.20 - 19:09 | |||
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 ► |
Список тем форума
|