Имя: Пароль:
1C
1C 7.7
v7: Глюк Формекс? Или я чего-то не понял...
0 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 сделана, и работает нормально.
В принципе - нового только то, что решил сделать с помощью Формекса так, что-бы искалось не нажимая ентер в строке или кнопку, просто при вводе символов в строку.

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

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

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

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

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

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

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

Сначала тоже думал делать как у тебя, но, вот, например, поведение юзера - выделяю часть неправильно введенного текста мышкой и нажимаю Del или Бакспейс - ожидаю, что удалится именно эта часть.
11 Salimbek
 
19.05.20
07:48
+(10) И еще вот такая тема нашлась: http://www.1cpp.ru/forum/YaBB.pl?num=1152157445/30
12 MWWRuza
 
гуру
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 в последнем сообщении.
Скачал, спасибо, сейчас буду разбираться...
13 Djelf
 
19.05.20
09:21
(5) Ты не туда таймер повесил. Его нужно взводить хоть в ПриНажатии, хоть в ПриОтжатии.
При повторном взводе он не сработает, а будет отложен до того момента пока кнопки не нажимаются.
Ну и естественно сбрасывать при начале поиска в sqlite.
14 Salimbek
 
19.05.20
09:41
(12) Странно, такое ощущение, что у тебя само вызывается где-то повторно, типа через sendkeys или тупой повторный вызов процедуры. Возможно стоит пересмотреть процедуру "НайтиТоварSqlLite"
15 MWWRuza
 
гуру
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; // Отладка    
КонецФункции
16 Salimbek
 
19.05.20
09:59
А если закомментировать часть команд в этой функции - так же двоит? Или это происходит начиная с какого-то тайминга?


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

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

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

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

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

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

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

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

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

(25) Да времени сейчас - хоть отбавляй :-)  Мне тоже кажется, что не должно. Самому уже не столько с "прикладной точки" это хочется доделать, а просто хочется понять, почему не работает... Сейчас соберу отдельно, внешней обработкой, и выложу сюда...
27 Djelf
 
19.05.20
11:08
(26) У тебя в коде (15) алгоритм поиска уже есть. Замени эти 6 строчек и будет не по порядку искать.
28 MWWRuza
 
гуру
19.05.20
11:17
(27) Да это понятно...
29 Djelf
 
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
отрыли стюардессу...
31 Salimbek
 
19.05.20
12:35
(0) Потестил в твоем варианте - тоже в какой-то момент выдало задвоение символов на пустом месте.
Убрал вот эту странность:

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

И никаких задвоений не стало...
32 Djelf
 
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 'темное пиво';
33 Salimbek
 
19.05.20
13:07
(32) Это немного другой поиск:

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

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

Есть вот такая штука: http://xbb.uz/db/SQLite-FTS3-i-FTS4/5-Tokenajzery.html
Я fts`ом сам не пользуюсь, поэтому плотно эту тему не изучал.
39 Arbuz
 
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
И.. хреново, что в снеговике этого нема (
42 MWWRuza
 
гуру
19.05.20
15:20
Стоило отъехать на три часа, вернулся - а вы тут уже в такие дебри полезли...
Вот, моя обработка, выдернутая из конфы в отдельный файл: https://cloud.mail.ru/public/3f2Y/3n5ZrojRy должна работать на любой конфе, где есть справочник "Номенклатура". Ну, естественно ВК должны быть доступны.
Работает точно так-же, как исходная, в конфе.
(31) Убрал вот эту странность:
А вот это, можно чуть разжевать? Без этого СтрПоиска будет пустой всегда... Или я не понял, что значит "убрал" - ? Как-то по другому сделал?
43 Arbuz
 
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) ну положил бы в зип все ВК заодно.
а то на домашнем у меня толком окружения нет, чтобы проверить
46 MWWRuza
 
гуру
19.05.20
15:36
(43) кровь из глаз смотреть, как закрывают 1с-ину и пересохраняют конфу

Ну, это в мой огород камень, точнее в критику моего видео...
На самом деле, база мизерная, "экспериментальная", на домашнем компе... По этому - пофик, она сохраняется пару секунд, использовать в данном случае турбо мд... Ну, можно конечно, но смысл?
47 MWWRuza
 
гуру
19.05.20
15:44
(45) Вот: https://cloud.mail.ru/public/2CjJ/ABwdT3yd6
Там еще 1CPP.dll, она не используется, но грузится, так, по инерции, из ГМ конфы скопировал...
48 MWWRuza
 
гуру
19.05.20
15:49
+(47) Можно закомментировать в обработке, для чистоты эксперимента...
49 Arbuz
 
19.05.20
15:58
(47) ох ты и наворотил. вангую проблема в обработке бакспэйса ;) там адъ
пока не начнёшь стирать - всё ведь норм?
50 Злопчинский
 
19.05.20
15:58
(47) Открыл.
выделно поле ввода, бэкспейс - поле очистилось, содержимое поля подставилось в инфо "отладка", бяка
51 Злопчинский
 
19.05.20
16:00
ой, не бэкспейсом. а делом
52 MWWRuza
 
гуру
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. у тебя криво отрабатывает "показ" отладки, вообще не клеится с тем что я ввожу в поле
56 Salimbek
 
19.05.20
16:11
(42) Ну вот смотри - у тебя есть поле ввода, куда буквы и так попадут, потому как мы их нажимаем. Но в этот момент, ты это поле переприсваиваешь, и, видимо, ловишь момент, когда поле перерисовалось и оно уже нажатую кнопку ловит как необработанную и потому принимает во второй раз.
Вместо этого - я предлагаю обрабатывать в твоем коде _только_ нажатия, и строить у себя "в памяти" в ПодстрокаПоиска аналог того, что в поле ввода и так само появится. Для этого достаточно 1) убрать то самое присваивание; 2) Вместо использования СтрПоиска использовать ПодстрокаПоиска
57 MWWRuza
 
гуру
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) да пофиг как.
если поле ввода - пустое - то по логике и "отладка" д.б. пусто.
а у тебя этого нет.
61 Salimbek
 
19.05.20
16:16
(58) Дык, в коде (0) ФлСт в 1 то нигде и не присваивается )))
62 MWWRuza
 
гуру
19.05.20
16:16
(55) Показ отладки - это Форма.ИнфСтрПоиска.Заголовок(СтрПоиска); Просто должно тупо выводить на форму содержимое поля ввода. А оно выводится не верно почему-то...
63 Злопчинский
 
19.05.20
16:17
я не вникал что да как...
при нажатии (или отжатии) фиксируем символ.
добавляем его к "подстрокепоиска", выполняем поиск. выходим из "принажатии". имеем результат поиска по "подстроке поиска", в поле ввода - фиксируется введенный символ
.
так что, не работает?
64 MWWRuza
 
гуру
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);
        ПопробоватьНайти();
    КонецЕсли;    
КонецПроцедуры
68 Salimbek
 
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
69 MWWRuza
 
гуру
19.05.20
16:27
(64) Попробовал. Работает, но, точно-так же...

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

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

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

Ну, вот, а ты говорил... Совместными усилиями слепили из г***а конфетку :-)))
82 Ёпрст
 
19.05.20
17:13
(81) не.. у тебя тут просто искусственная "задержка" нажатия из-за поиска, если его выкинешь, то штатный контрол не успевает обработать все нажатия кнопки
83 Ёпрст
 
19.05.20
17:14
он часть нажатий теряет
84 MWWRuza
 
гуру
19.05.20
17:18
Ну, понятно... Но, работает, даже без поиска, когда его комментируешь.
85 MWWRuza
 
гуру
19.05.20
17:21
+(84) Это надо жо** копиркой вытирать(это я анекдот про секретаря-машинистку вспомнил :-) ), что-бы штатный контрол не успел отработать... Это-ж сколько знаков в секунду надо печатать...
86 Злопчинский
 
19.05.20
17:37
(82) это как? ни разу не встречал чтобы штатный контрол терял нажатия...
???
87 Volodja
 
19.05.20
19:09
(70)
База.РазрешитьЗагрузкуРасширений(1);

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

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

В общем, покрутил я и так и этак, и пришел к выводу - проще вообще "отключить" Делете - СтатусВозврата(0)... Вполне можно и без него прожить, Пользоваться только БакСпейсом.
Все равно, конечно остается "кривизна", если мышкой курсор поставят в середину строки, и начнут БакСпейс жмакать... В строке удаляется как и должно, слева от курсора, а в подстроке - с конца... Ну, тут, похоже уже "малой кровью" не обойтись. Ничего, к этому можно и приспособиться.
102 Volodja
 
20.05.20
09:38
(88)
а (10) не пробовал. вроде отрабатывает как надо
103 MWWRuza
 
гуру
20.05.20
10:05
(102) а (10) не пробовал. вроде отрабатывает как надо

Попробовал... Но, честно говорю - не разобрался.
Сама идея понятна - на форме рисуем кнопку, и назначаем на нее АктивеИкс TextBox... Запускаю. Редактирую текст... А дальше что? Что должно происходить? Как ловить события изменения текста в этом элементе? Добавить в эту кнопку вызов процедуры? Не работает... Просто никогда с таким не сталкивался, объясните дураку...
104 MWWRuza
 
гуру
20.05.20
10:11
+(103) А вообше, начинаю понимать... Отладчиком посмотрел - в сыойство ДопХа получаю позицию курсора... Прикольно...
Дальше, надо будет поковыряться...
105 MWWRuza
 
гуру
20.05.20
11:09
+(104) Ну, в принципе - разобрался. Вот: https://cloud.mail.ru/public/4t6x/fnNTK75fx
К исходной добавлена обработка БакСпейса, Делете, с любого места, в том числе и выделенного фрагмента.
Действительно работает...
106 Djelf
 
20.05.20
11:11
(99) Спасибо, воспроизвел!
Чтобы не было краха, сначала Базу нужно открыть.

  База = СоздатьОбъект("SQLiteBase");
  База.Открыть(":memory:"); // без этого будет вылет
  База.РазрешитьЗагрузкуРасширений(1);

Как нибудь попозже добавлю на это проверку.
107 MWWRuza
 
гуру
20.05.20
11:19
(75) Кстати, попробовал я свою обработку из (10) запустить и не заработало - похоже ей нужен установленный офис для Forms.TextBox.1

Таааккк... Новая проблема?
У 90% моих клиентов - ОпенОфис... Что, не заработает?
108 Djelf
 
20.05.20
11:23
(107) Есть шикарная альтернатива MS`овским контролам http://www.vbforums.com/showthread.php?841929-VB6-ActiveX-CommonControls-(Replacement-of-the-MS-common-controls)
109 Salimbek
 
20.05.20
11:30
(107) А х.з. смотреть надо - какие контролы могут быть доступны. Я вот обработку из (10) сейчас у себя тоже нигде запустить и потестить не могу :-)

Что касаемо "Как ловить события изменения текста в этом элементе?"
По стандарту 1С++, когда создаешь АктивИкс, то потом:

При возникновении события вызывается процедура модуля формы с именем:

<ИдентификаторЭлементаДиалога>_<Событие>

т.е. если элемент диалога, на котором строится АктивИкс, у меня в обработке назван: ФФлеш, значит я могу обрабатывать событие:

ФФлеш_TextChanged

Надо просто создать процедуру у себя в модуле с нужным количеством переменных
110 Volodja
 
20.05.20
11:33
Вот так твою обработку изменил. Вроде лучше стало. Но иногда прилетает что-то левое

Перем ВремяНажатия;
....
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт)
    Интервал=(_GetPerformanceCounter()-ВремяНажатия);
    Если Интервал<120 Тогда //Слишком быстро пришел. Мусор
        Возврат;
    КонецЕсли;
    //Сообщить(Интервал);
    ВремяНажатия=_GetPerformanceCounter();
111 Salimbek
 
20.05.20
11:34
(108) Интересно, можно будет посмотреть. Жаль только, что нету чего-нибудь такого, что не надо устанавливать
112 Salimbek
 
20.05.20
11:35
+(109) Подробнее про АктивИкс в 1С++ тут: http://www.1cpp.ru/docum/icpp/html/ActiveX.html
113 MWWRuza
 
гуру
20.05.20
11:36
(108) А у меня, почему-то не открывается ссылка...
114 Salimbek
 
20.05.20
11:38
(113) У меня из сети предприятия тоже не открылась. А с другого сервака - без проблем, вот на ГитХаб там есть ссылка:
https://github.com/Kr00l/VBCCR/tree/master/ActiveX%20Control%20Version
115 Djelf
 
20.05.20
11:38
(113) А сам http://www.vbforums.com открывается? Если нет то OperaVPN в помощь.
116 Djelf
 
20.05.20
11:45
(111) Что делать, ActiveX. Cтавить придется. Можно, конечно в ВК завернуть, но там адское количество методов.
Смотреть особенно нечего, заявлена совместность с MS`овсекими по методам.
Кое что не работает из-за того что 7ке использует 4ю версия Microsoft.Windows.Common-Controls, а для полноценной работы нужна 6я.
117 MWWRuza
 
гуру
20.05.20
11:46
(115) Ну, да, не открывается... Буду разбираться...

А кстати, РанТайм, Проблему не решит?
"Access 2007 Runtime — это бесплатная программа, которую можно использовать для распространения созданных вами приложений Access 2007 пользователям, на компьютерах которых не установлена программа Access 2007
Наличие лицензии на офис не требуется"
Теоретически - должно... Вот только попробовать не на чем, на своем компе полноценный офис установлен...
118 Volodja
 
20.05.20
11:51
(106)
Спасибо. Все работает.
119 MWWRuza
 
гуру
20.05.20
11:58
(112) Я правильно понял, что на компах без Офиса, достаточно с помощью RegSvr32 зарегить библиотеку VBCCR16.OCX - ? Или еще чего-то надо?
120 Djelf
 
20.05.20
12:01
(119) Держи https://cloud.mail.ru/public/3py9/2Ku9HRRBJ
Экспериментировал слегка над этой штукой.
121 Djelf
 
20.05.20
12:05
122 MWWRuza
 
гуру
20.05.20
12:22
//    Флешка        = АтрФормы.СоздатьЭУ("Forms.TextBox.1");
    Флешка        = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");

Так работает...
123 MWWRuza
 
гуру
20.05.20
12:24
(120) Спасибо, интересные эксперименты... Буду разбираться.
124 MWWRuza
 
гуру
20.05.20
12:26
Остается попробовать на компе без Офиса. Но, по идее - должно заработать. Тут же явное указание, какой объект создавать... И, если библиотека будет зарегистрирована в системе, то, чего-бы ему не заработать :-)
125 MWWRuza
 
гуру
20.05.20
15:47
Финальный вариант: https://cloud.mail.ru/public/gZmd/256P4zcod
Ну, тут уж даже и не знаю, чего еще можно улучшить... АктивеИкс пытается грузить МайкроСофтовский, если не получается - пытается загрузить альтернативный, из(114).
Обрабатываются делет, бакспейс, пробел. По табу, переходит на таблицу результатов, если что-то нашлось, если нет - игнорируется.
В общем - супер! Спасибо всем, кто участвовал! :-)
126 serpentt
 
20.05.20
16:36
БэкСпэйс не отрабатывает с частью выделенного текста, т.е. Выделил часть текста, нажал БэксПэйс.... выделенный текст не удаляется, а удаляется первый символ перед курсором.
127 Злопчинский
 
20.05.20
16:54
(125) я так и не понял зачем какие-то офисные контролы/аналоги..? просветит вкратце?
128 Djelf
 
20.05.20
18:02
(127) 1С`овский контрол не меняет своего содержимого, пока не нажмешь enter.
Поэтому костыли на костылях и работает криво.
ActivX - меняет.
Аналог ActivX`а MS бесплатный, но если уже есть ActivX от MS, то аналог можно не ставить.
129 Djelf
 
20.05.20
18:30
Еще чуток ускорил. Стало ~140мс на 5к строк (было 300 мс).
Добавил в архив ссылки на первоисточники, и краткое описание.
strmatch.dll https://cloud.mail.ru/public/4th1/qavXTDgwv
Это гибридная библиотека: ВК для 1С 7.7 без регистрации в реестре и для любой винды и одновременно плагин для sqlite3 v.3.0.3

З.Ы. возможно еще на 20-30% ускорить, но это будет не быстро.
130 MWWRuza
 
гуру
20.05.20
19:50
(126) Ага.. Спасибо, мне чего-то не пришло в голову, что так будет кто-то делать. Сейчас посмотрю, думаю, можно поправить...

(127) А ты попробуй, прикольно работает. Просто набираешь в строке текст, оно само ищется, без нажатия на ентер или какую-то дополнительную кнопку.
А без "офисного контрола", все работает и так... Но, невозможно определить позицию курсора и длину выделенного фрагмента строки. Поэтому, кривенько работает. А так - вполне прилично.
131 MWWRuza
 
гуру
20.05.20
20:29
(126) Вот, будет время - потестируйте, может еще что-то вылезет: https://cloud.mail.ru/public/zRPA/256eeZBYt
132 MWWRuza
 
гуру
20.05.20
21:06
(129) У меня хоть и маленькие базы, думаю, я не почувствую разницу. Но... Все равно интересно.
Что-то не понял, если не регистрируется в реестре, то откуда она должна грузиться?

Сейчас вот так:

    БазаДанных.Открыть(":memory:");
    БазаДанных.РазрешитьЗагрузкуРасширений(1);
    Запрос = БазаДанных.НовыйЗапрос();
    Запрос.ВыполнитьЗапрос("SELECT load_extension('strmatch.dll')");
    Текст = "SELECT
                |code Код
*****************************

Получаю ошибку:

Запрос.ВыполнитьЗапрос("SELECT load_extension('strmatch.dll')");
{D:\BASA_1C\СЕДОВ\MAGAZIN\EXTFORMS\ПРОБАПОИСКАПРИВВОДЕАКТИВИКС_2.ERT(44)}: Не найден указанный модуль.

Что я не так делаю?
133 MWWRuza
 
гуру
20.05.20
21:07
Дллка, в каталоге базы лежит...
134 Злопчинский
 
20.05.20
21:08
(131) фу бяка, снова огрызок а не пакет полный
135 MWWRuza
 
гуру
20.05.20
21:08
Может ее надо загрузить, как внешнюю компоненту?
136 MWWRuza
 
гуру
20.05.20
21:11
(134) Все, что выкладывал вчера, ничего нового... Я надеюсь, MS-офис у тебя установлен? Если вдруг нет(не верю!) то в (114) ссылка на "заменитель".
137 MWWRuza
 
гуру
20.05.20
21:18
1CPP.dll    - если вчера, грузил "по инерции", и она была по большому счету не нужна, то для сегодняшней - обязательна.
FormEx.dll
1sqlite.dll

То, про что я в (132) писал - в выложенную ерт-шку не вошло, естественно, это я пока у себя экспериментирую...
138 Злопчинский
 
20.05.20
22:20
(136) нафига мне на компе нелицензионный офис? нет конечно, не юзаю дома. вместо него няшный WPS
139 MWWRuza
 
гуру
20.05.20
22:43
(138) :-)))

Вот, полный набор библиотек: https://cloud.mail.ru/public/2E4V/21kET26ob

VBCCR16.OCX надо зарегистрировать с помощью RegSvr32
140 MWWRuza
 
гуру
21.05.20
08:09
+(132) По поводу скорости работы... На маленькой базе(~ 7 000+ позиций) работает мгновенно, тормозов вообще не заметил.
А вот на базе где ~50 000+ наименований, первое обращение(после ввода первой буквы в поле), задержка примерно 1.5 секунды. Потом, работает мгновенно, все последующие буквы вводятся вообще без задержек.
Видимо, первый раз задержка потому, что база грузится в память, а потом поиск происходит уже по загруженной базе, и тут уже тормозов нет...
Ну, в целом, даже на такой базе - вполне терпимо.
141 MWWRuza
 
гуру
21.05.20
08:41
(130) (126) Ага.. Спасибо, мне чего-то не пришло в голову, что так будет кто-то делать. Сейчас посмотрю, думаю, можно поправить...

Еще нашел... Стрелки право/лево обработать надо, и наверное хоме/енд...
142 MWWRuza
 
гуру
21.05.20
08:46
+(141) А хотя, нет... И так все работает во внешней обработке... Это я чего-то накосячил, когда в основную конфу доработку переносил.. Почему-то при нажатии на стрелки, курсор остается на месте а рамки групп выделяются жирным шрифтом... Буду разбираться.
143 Djelf
 
21.05.20
08:52
(132) Я из bin гружу. Т.е. оттуда откуда грузится и sqlite.
144 serpentt
 
21.05.20
08:55
(141) Вроде работает..
145 Злопчинский
 
21.05.20
09:25
(139) ну как отладишь все в виде отдельной обработки - то и выложи отдельным полным готовым пакетом. а то я уже запутался в "версиях".. ;-)
146 Djelf
 
21.05.20
09:59
+(132) Либо указывать полный путь, но тогда обязательно указать имя колонки "SELECT load_extension('r:\strmatch.dll') as ret;"
147 MWWRuza
 
гуру
21.05.20
10:05
(143) Да, положил в BIN, заработала...
Но, особой разницы в скорости не заметил... Думаю, тут просто мне надо ограничить длину строки поиска, например минимум 3 символа. Иначе, он вываливает в РезПоиска чуть-ли не весь справочник, по одной, первой букве. Тут, скорее в этом проблема, а не в загрузке базы в память.

Что касается загрузки расширения... Работает конечно, когда ВК в BIN лежит. Но, это как-то не по стандарту: Книга знаний: Загрузка внешних компонент 1С: проблемы и решения
"Где 1С ищет внешнюю компоненту?

Если при загрузке внешней компоненты вы не указываете полный путь, такой как E:\Events\Events.dll или сетевой путь наподобие \\ВашСервер\ПапкаГдеЛежатВК\Events.dll, то 1С ищет внешние компоненты

-относительно папки 1Cv7\BIN (КаталогПрограммы())
-относительно каталога информационной базы (КаталогИБ())"

Относительно каталога ИБ не ищет...
148 Djelf
 
21.05.20
10:11
(147) Ты не путай ВК и sqlite. Это гибридная библиотека с двумя разными точками входа и с разными api.
Как ВК она работает точно так же как всегда.
А как плагин к sqlite по другому. sqlite без указания пути ищет через переменную patch, как туда bin попадает я не в курсе, но каталога базы точно там нет.
Поэтому если нужно грузить плагин в sqlite из каталога базы, путь нужно указывать явно.
149 Djelf
 
21.05.20
10:13
(147) Туда не 3 буквы нужно вводить, а целиком всю строку, которую ты сопоставляешь. http://catalog.mista.ru/public/237186/
150 MWWRuza
 
гуру
21.05.20
10:29
(149) Это я понял, просто что-бы меньше грузить программу лишним поиском, я хочу ограничить длину поисковой строки снизу, что-бы пока, в самом начале, не введешь хотя-бы три символа, никакого поиска не происходило... А то начинаешь набирать с пустой строки - и после первого символа он вываливает весь справочник, где в наименованиях есть этот символ...
151 Djelf
 
21.05.20
10:33
(150) Это же нечеткий поиск. Это совершенно другой принцип. Он не предназначен для поиска по двум-трем буквам.
Туда нужно подавать всю строку, которую ты ищешь. Эта строка упрощается до фонетических значений, всякий мусор оттуда выкидывается.
Строки с которыми сравнивается исходная строка, обрабатываются аналогично.
Дальше идет хитрый алгоритм сравнения и вычислений рейтинга совпадения.
152 MWWRuza
 
гуру
21.05.20
10:37
+(150) Сделал. Задержка после ввода первого символа в поисковой строке на большой базе - исчезла. Сейчас работает так: Начинаешь с пустой строки набирать "с", ничего не происходит, "и", ничего, "р" - вываливается весь список сигарет, мгновенно. Дальше, можно пробел поставить и вводить следующие символы для конкретизации, какие именно мы сигареты ищем.
(151) Я читал про исходную компоненту нечеткого поиска, еще вчера... Но, пока не разбирался - кроме ее загрузки, наверно надо еще какие-то параметры указывать? Я пока ничего в запросе не менял, кроме загрузки расширения...
153 MWWRuza
 
гуру
21.05.20
10:57
(145) Вот, со всеми компонентами, последний рабочий вариант: https://cloud.mail.ru/public/2KMC/4MERDS444 Пока без расширения нечеткого поиска. Это отдельная тема... Там не все так просто.
154 Djelf
 
21.05.20
10:59
(153) Нечеткий поиск это отдельный метод. На, попробуй https://cloud.mail.ru/public/maPd/3vERiuLeL и ткни "Искать в базе".
155 MWWRuza
 
гуру
21.05.20
11:34
(154) Попробовал, правда пришлось по убирать все АкивеИксы и т.п., иначе строку не ввести...
Вот что получается: https://cloud.mail.ru/public/2huH/3Pev4VbuX
Я так понял, что "Рейтинг", это типа "уровень похожести" :-)
И как в реальной задаче понимать, начиная с какого рейтинга выводить в результат? В данном примере, со 116 по 254 - туда-сюда, все, что ниже - вообще не похоже...
156 Djelf
 
21.05.20
11:42
(155) Покрути, посмотри. Я эту штуку не использовал, потому что с sqlite она не работала ;)
Возможно стоит отсечь нули, и/или limit 100, маловероятно что не найдется в первых 100 записей.
А если в 100 записей не найдется, то можно переходить на твой алгоритм и уже рыть базу более тщательно.
Там не уровень похожести, а непонятные попугаи, автор ВК не отранжировал в %.
157 MWWRuza
 
гуру
21.05.20
11:49
Понятно... Будет настроение - поиграюсь, штука интересная.
Но, пока, для реальной задачи - свой алгоритм оставляю, вроде работает правильно, и понятно для конечных пользователей будет.
Грузить расширение, в моем случае, как я понимаю, смысла не имеет - никакого ускорения не будет, только память занимать лишней библиотекой, правильно - ?
158 Djelf
 
21.05.20
12:14
(157) Вроде читал где в описании, что sqlite саму библиотеку выгружает из памяти, когда она не используется.
Ну а так да, зачем грузить что-то неиспользуемое?
159 MWWRuza
 
гуру
21.05.20
12:34
(158)Вроде читал где в описании, что sqlite саму библиотеку выгружает из памяти, когда она не используется.

Я чето-такое тоже видел. Поэтому и гружу ее при каждом запросе заново...
160 MWWRuza
 
гуру
24.05.20
23:38
(119) (112) Я правильно понял, что на компах без Офиса, достаточно с помощью RegSvr32 зарегить библиотеку VBCCR16.OCX

Гладко было на бумаге, да забыли про овраги... Оказалось - не так все просто :-( Сегодня поставил реальному клиенту, у которого нет MS офиса. Заработало, сразу, все вводится, ищется и т.д... Ровно до закрытия формы где есть ЭУ АктивеИкс. 1Ска падает... Почему - не понятно. Возможно, надо что-то прибивать перед закрытием формы, может еще что, х.з... Экспериментировать не стал, поставил МайкроСофтовский RunTime Acess-2007, благо он бесплатный, и все заработало отлично, падать перестало, так, как стали работать ТекстБоксы от МС.
С АктивеИкс, создаваемым с помощью альтернативной компоненты, надо разбираться, как правильно ее уничтожать, или выгружать из памяти при закрытии формы...
161 Злопчинский
 
25.05.20
00:06
Если про рейтинг в StrMatch - то там не процент похожести, а безразмерная величина, чем она больше - тем больше похожесть. Причем чем длинее стравниваемы строки тем индекс похожести больше. Отранжировать в проценты можно взяв индекс похожести самой строки с собой. кстати, автор говорит, что в общем случае даже "100%" похлжесть не свидетельствует о совпадении строк. Я стрматс юзал часто и долго, особых проблем нет, все работанет на мой взягля дочень хорошо. можно варитровать вес чисел. Чем длинее сравниваемые строки - тем легче искать похожие. мой опыт говорит что если нет в первых 40-50 позиуиях - то значит скорее всего нет вообще. в подавляющем колве случаев искомая позиция находилась на первом экране похожих, чаще - в верхней половине списка из 10 позиций. путем эвристик можно доевтси практически до попадания 1-в-1. Трудности с поиском короткизх строк. чем короче - тем труднее. есть еще некоторые тонкости - надро посмотреть алгоритмы реализации, там бывают моменты когда индекс похожести не выдается из-за неверного применения. Самое нагрузочное - это сформировать кэш. А так, на этой компоненте я людя запускал магазин игрушек, бытовую технику, большой оборот торговли дисками с кино и музыкой где в прайсах трэш и угар и магазин радиодеталей - с ним было сложнее всего, так как "названия" очень короткие пришлось подключасть отраслевые эвристики. если сранвение впили в скулай это нечеткое это вообще красотулечка должна получиться... И еще - если с ее помощб привязывать позиции/новые прайсы - то привязку следует проверять не только со своей номнегнклатурой, но и с уже привязанными другими прайсам - там похожесть может быть больше.
162 Злопчинский
 
25.05.20
00:07
(160) "очему - не понятно. Возможно, надо что-то прибивать перед закрытием формы, может еще что, х.з... " - не решил.. костылестроитель.. ;-)
163 MWWRuza
 
гуру
25.05.20
09:15
(162)  не решил.. костылестроитель.. ;-)
Ну дык... Куда-же в семерке без них... https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-313.jpg
164 Salimbek
 
25.05.20
09:52
(160) Попробовал твою обработку из (153) - без проблем и открывается и при закрытии 1С-ка не крашится.
165 MWWRuza
 
гуру
25.05.20
10:43
(160) У меня - тоже. У клиента крашится. Судя по всему, потому, что у нее из продуктов MS только винда. Офис там ЛибреОффис.
У меня в обработке, в попытке создается элемент управления "Forms.TextBox.1". В случае неудачи, создается "VBCCR16.RichTextBox". Дальше, работает тот, который удалось создать.
И почему-то во втором случае, при закрытии формы 1С крашится.

PS Правда, у меня в той форме, что у клиента - там не один ЭУ, а целых 17 штук, в массиве... Может по этому? Но, ЭУ от MS при этом работает, ничего не падает.
Вот, где используется такой "изврат": https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-314.jpg
166 Ёпрст
 
25.05.20
10:45
Посмотрел (153)... Полный ПЭ.
Весть код в топку.
167 Ёпрст
 
25.05.20
10:57
На счет крашится, це очевидно, нефик делать переменные ( Перем = ) с именем идентификаторов формы.
И.. весь код в 153 превращается в :


Перем КонтролТекста;
Перем АтрФормы;
Перем БазаДанных;
Процедура ПослеОткрытия()
        АтрФормы         = СоздатьОбъект("АктивИкс");
    АтрФормы.УстановитьАтрибут(Форма, "СтрПоиска");
    Попытка
        КонтролТекста    = АтрФормы.СоздатьЭУ("Forms.TextBox.1");
    Исключение    
        КонтролТекста    = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");
    КонецПопытки;
    КонтролТекста.Text    = "всяка хрень, что надо найти";
КонецПроцедуры

Процедура ПриОткрытии()
    РезПоиска.НоваяКолонка("НайдТов");
    ЗагрузитьВнешнююКомпоненту("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;    
    КонецЕсли;
КонецФункции

Функция ПопробоватьНайти()
    Если СтрДлина(СокрЛП(КонтролТекста.Text)) < 3 Тогда
        Рез = 0;
        РезПоиска.УдалитьСтроки();
    Иначе    
        Рез = НайтиТоварSqlLite(СокрЛП(КонтролТекста.Text));    
    КонецЕсли;
    Возврат Рез;
КонецФункции


Процедура СтрПоиска_Change()
    ПопробоватьНайти();
КонецПроцедуры


Процедура ОчиститьСтрПоиска()
    КонтролТекста.Text    = "";
    РезПоиска.УдалитьСтроки();
КонецПроцедуры
168 MWWRuza
 
гуру
25.05.20
11:24
(167) нефик делать переменные ( Перем = ) с именем идентификаторов формы.

А где у меня такое? Элемент управления - "СтрПоиска", а переменная - "СтПоиска", без буквы "р".

Остальное - ща гляну...
169 MWWRuza
 
гуру
25.05.20
11:30
(167) И.. весь код в 153 превращается в :

Ии... Не работает, символы не вводятся в строку поиска, так, как нажатия клавиш не обрабатываются, и текст в строке не меняется.
170 Ёпрст
 
25.05.20
12:19
(169) работает для ричтекста, для мелкософта используй свой метод
171 Ёпрст
 
25.05.20
12:19
Мне лень офис ставить
172 Ёпрст
 
25.05.20
12:20
И ПриНажатии клавиши и весб тот бред в нем, не нужен
173 MWWRuza
 
гуру
25.05.20
12:33
(172) А... Теперь понял. У меня-то дома мелкомягкий офис стоит.
Ссейчас попробую принудительно грузить альтернативу, и посмотрю...
174 MWWRuza
 
гуру
25.05.20
12:49
+(173) Да, сделал так:

//    Попытка
//        КонтролТекста    = АтрФормы.СоздатьЭУ("Forms.TextBox.1");
//    Исключение    
          КонтролТекста    = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");
//    КонецПопытки;

и все работает без дополнительной кучи кода... Спасибо. С контролом от MS, так не прокатывает, нужно все очевидные, стандартные действия "пешком" обрабатывать :-(
Остается попробовать на клиентском компе, на предмет "падения" 1С, но, это только вечером, там сейчас люди работают...
175 Ёпрст
 
25.05.20
12:55
(174) посмотри свойства контрола и какие там события . Напиши процу, там типа TextAlignChanged  или еще чего
176 Ёпрст
 
25.05.20
12:59
Хотя не.. це же мелкомягкие, так добавь еще




Процедура СтрПоиска_Change() //рич
    ПопробоватьНайти();
КонецПроцедуры
Процедура СтрПоиска_onChange()//мелкомягкие
    ПопробоватьНайти();
КонецПроцедуры
177 MWWRuza
 
гуру
25.05.20
13:26
(176) Не, СтрПоиска_onChange() не отрабатывает с MS. Надо читать, разбираться. Не все так просто.
В строке поиска делет и бакспейс работают, стрелки курсор перемещают, а новые символы не вводятся :-(
178 MWWRuza
 
гуру
25.05.20
13:47
Кто вообще должен вызывать эту процедуру "СтрПоиска_onChange()" - ? Не понимаю... Тут: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox читал, ясности не добавило... Или это надо про АктивеИкс читать?
179 Злопчинский
 
25.05.20
14:00
может, все-таки на 8-ку.. а, коллеки?
180 Ёпрст
 
25.05.20
14:01
Посмотрел, там тоже событие Event Change()
Так что, Процедура СтрПоиска_Change() должно работать и с TextBox
181 Ёпрст
 
25.05.20
14:04
(177) Куда чего не долетает ? Там фиолетово, какие ты кнопки нажимаешь, в Change() смотрится Text у контрола и всё
182 Ёпрст
 
25.05.20
14:33
Короче, если Forms.TextBox.1 то так

Процедура СтрПоиска_Change()
    Сообщить(КонтролТекста.Text);
    ПопробоватьНайти();
КонецПроцедуры
Процедура СтрПоиска_KeyPress(Символ)
    КонтролТекста.Text = КонтролТекста.Text+Симв(Символ.value);
КонецПроцедуры
183 MWWRuza
 
гуру
25.05.20
16:13
(182) Супер! Так работает. Спасибо. Действительно "весь код в топку"... Это ты еще не видел, чего я нагородил в форме сокращения наименования, где 17 контролов... Там, через массивы сделано, гимор еще тот...
184 Ёпрст
 
25.05.20
17:55
(182) единственное, надо свойство контрола поглядеть, на предмет копи-пасте.
Там просто либо флаг есть соответствующий, либо это "ручками" пишется.
185 Ёпрст
 
25.05.20
17:56
Ну и у ричтекста тоже есть событие KeyPress, его надо игнорить, да и прилетает там не тоже самое что и для текстбокса
186 Ёпрст
 
25.05.20
17:59
И..если не пользовать активикс вообще, а только штатный контрол, можно воткнуть "защиту от АЛьФа"
тип того:


Перем гЗащитаОтАльфа;

Процедура ПриНажатииКнопкиКлавиатуры(Код, А, Ш, К, Символ, ФСО)
    Если гЗащитаОтАльфа=1 Тогда
        Возврат;
    КонецЕсли;
    гЗащитаОтАльфа=1;
    Если (Код = 71) И (А = 0) И (Ш = 0) И (К = 1) Тогда
                  //////////
        КонецЕсли;  
    гЗащитаОтАльфа=0;
КонецПроцедуры
187 Ёпрст
 
25.05.20
18:00
это убережет от "двойных нажатий"
188 MWWRuza
 
гуру
25.05.20
18:54
Ясно...
А просветите плиз, из какой вообще оперы эта синтаксическая конструкция: "СтрПоиска_KeyPress(Символ)" - ?
Ну, понятно, "СпрПоиска" - имя контрола. "Keypress" - имя события. А почему между ними "жесткий пробел", нижнее подчеркивание? Это из какого языка?

Мне стыдно, но я дожил до своих лет, а кроме 1С больше никаких ЯП не изучил... Ну, Дельфи немного, но, там я тоже такого не встречал...
189 Ёпрст
 
25.05.20
19:00
190 Ёпрст
 
25.05.20
19:02
Ну и ежели свои классы писать, как наследник от активикса, там по-другому будет вызов событий внутри класса, без "идентификатора-контрола"
191 Ёпрст
 
25.05.20
19:03
ежели че, все доки тут
http://www.1cpp.ru/docum/
192 MWWRuza
 
гуру
25.05.20
19:18
Спасибо, понял... Как я только без als от этой ВК жил... Я хоть пока и не собираюсь писать свои классы(вроде нет таких задач, хватает стандартных), но даже со штатными функциями удобнее разбираться когда есть куда заглянуть.
193 MWWRuza
 
гуру
25.05.20
21:17
(183) Супер! Так работает.
Поспешил обрадоваться тому, что кода почти нет, а все работает... Работает, да не совсем правильно. Ставишь курсор в любое место имеющейся строки, начинаешь вводить текст, а он в конец строки добавляется, и плевать ему на позицию курсора... Получается, нужно определять позицию курсора, делить на текст "до" и "после", и вставлять новые символы "между" этими частями. А это опять приведет к усложнению текста процедуры, практически до того, от чего начинал. Ну, не совсем - делет, бакспейс и стрелки вправо/влево без лишних действий в модуле программы обрабатываются правильно. А вот со вводом символов, в процедуре "СтрПоиска_KeyPress(Символ)" все равно мудрить надо.
Но, это только МелкоМягкого контрола касается - RichTextBox работает нормально без каких-либо дополнительных обработок нажатий клавиш...
194 MWWRuza
 
гуру
25.05.20
22:10
+(193) Может какое свойство для этого есть? Тут: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox все пересмотрел, ничего похожего не вижу... Вот этим: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox.selstart можно определить позицию курсора, но как ему объяснить, что это:  КонтролТекста.Text + Симв(Символ.value) надо делать не в конец строки, а с позиции курсора, вставкой со сдвигом оставшейся части строки, не понятно...
195 Злопчинский
 
25.05.20
22:24
(194) да ну нах такие сложности. проще очистить поле и заново набрать. втсавлять в середину - раз из ста...
196 MWWRuza
 
гуру
25.05.20
22:44
Да в принципе - вот так работает:

Процедура СтрПоиска_KeyPress(Символ)
//    КонтролТекста.Text = КонтролТекста.Text + Симв(Символ.value);
    Если (ПустаяСтрока(Символ) = 0) или (Символ = " ") Тогда
        ДопХа                 = КонтролТекста.SelStart;
        ДлинаВыделения         = КонтролТекста.SelLength;
        ПодстрокаПоиска     = КонтролТекста.Text;
        Начало                 = Лев(ПодстрокаПоиска, ДопХа);
        Финиш                 = Сред(ПодстрокаПоиска, ДопХа + ДлинаВыделения + 1);
        КонтролТекста.Text    = Начало + Симв(Символ.value) + Финиш;
        КонтролТекста.SelStart    = ДопХа + 1;
    КонецЕсли;
КонецПроцедуры

Хоть это и возврат к коду, который Ёпрст отправил в топку, но, это только малая часть того, что было "нагорожено" - только добавление символов обрабатывается, все остальные клавиши - автоматом. У меня было еще полсотни строк для обработки курсора, делета, бакспейса...
197 Ёпрст
 
25.05.20
22:49
(193) М-магия

Процедура СтрПоиска_KeyPress(Символ)
    Старт = КонтролТекста.SelStart;
    ТекстКонтрола = КонтролТекста.text;
    Начало = Лев(ТекстКонтрола,Старт+КонтролТекста.CurLine);
    КонтролТекста.text=Начало+Симв(Символ.value)+Сред(ТекстКонтрола,Старт+КонтролТекста.SelLength+1+КонтролТекста.CurLine);
    КонтролТекста.SelStart=Старт+СтрДлина(Симв(Символ.value));
КонецПроцедуры
198 MWWRuza
 
гуру
25.05.20
23:06
Ага... Работает :-)
Только такого свойства "CurLine" у ТекстБокса нет... Он его похоже от "Microsoft Forms" наследует...
Но, вообще, все равно не понятно... При чем здесь номер строки и позиция курсора в строке?
Из описания: Задает текущую строку элемента управления.
Примечания
Текущей строкой элемента управления является та, в которой находится точка вставки.
Первая строка имеет номер 0. Свойство CurLine применяется только для элементов управления с фокусом.

Но работает! Точно магия :-)
199 Ёпрст
 
25.05.20
23:12
(198)
всё есть

Property CurLine As Long
    Member of MSForms.TextBox
200 Ёпрст
 
25.05.20
23:15
этот кусок от MultiLine = true в коде у меня завалялся.. можешь и выкинуть
201 MWWRuza
 
гуру
25.05.20
23:23
(200) А... Тогда все понятно.
А вообще, в описании ТекстБокса от Акцесс, действительно нет такого свойства.
Но, зато есть в Оутлоке: TextBox.CurLine Property (Outlook Forms Script): https://docs.microsoft.com/ru-ru/office/vba/api/outlook.textbox.curline
Это получается, у МайкроСофта для разных программ одного семейства, разные контролы-? Или просто описание так построено?
202 MWWRuza
 
гуру
25.05.20
23:31
Работает:

Процедура СтрПоиска_KeyPress(Символ)
    Старт             = КонтролТекста.SelStart;
    ТекстКонтрола         = КонтролТекста.text;
    Начало             = Лев(ТекстКонтрола,Старт);
    КонтролТекста.text        = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + КонтролТекста.SelLength + 1);
    КонтролТекста.SelStart    = Старт + СтрДлина(Симв(Символ.value));
КонецПроцедуры

По сути, то-же самое, что и у меня в (196), только в  одну строку написано.
203 MWWRuza
 
гуру
25.05.20
23:36
И +(202) Наверное можно и это упростить:

КонтролТекста.SelStart    = Старт + СтрДлина(Симв(Символ.value));

до

КонтролТекста.SelStart    = Старт + 1;

Все равно длина строки вводимого символа всегда 1 будет, так, как событие будет срабатывать после ввода каждого символа.
204 Ёпрст
 
25.05.20
23:37
осталось копи-пасте
205 Ёпрст
 
25.05.20
23:38
прикрутить
206 MWWRuza
 
гуру
25.05.20
23:45
Ага. Но, это уже если только из чисто "спортивного интереса" - я с трудом представляю, зачем такое в реальных задачах может понадобится.

Но, хотя... Я сильно ошибаюсь, задача есть - далеко ходить не надо, моя "сокращалка" из поста(165). Вдруг захотят слова местами поменять в контролах - вот тут, копи/паст и пригодился бы...
207 MWWRuza
 
гуру
25.05.20
23:50
Можно через это попробовать:

БуферОбмена
Класс БуферОбмена / Clipboard

Класс позволяет работать с системным буфером обмена.

Версия: Метод работает на релизе 2.5 и позже.
Методы
Получить / Get
Синтаксис: Строка Получить()

Описание: Получает текст из системного буфера обмена.

Установить / Set
Синтаксис: void Установить(Строка Текст)

Параметры:

Текст - тип: Строка. Новый текст для буфера обмена.
Описание: Сохраняет текст в системного буфере обмена.
208 Ёпрст
 
26.05.20
00:11
Не.. всё проще
Процедура СтрПоиска_KeyUp(Клавиша,Шифт)
    Если (Клавиша.value = 67) И (Шифт=2) Тогда
        Если КонтролТекста.SelLength>0 Тогда
            КонтролТекста.Copy();
        КонецЕсли;
    ИначеЕсли (Клавиша.value = 86) И (Шифт=2) Тогда
        КонтролТекста.Paste();
    КонецЕсли;
КонецПроцедуры
209 Salimbek
 
26.05.20
00:30
(180) "Посмотрел, там тоже событие Event Change()"

Я в (109) искал вроде бы события этого контрола, и нашел
TextChanged()

тут: https://metanit.com/sharp/windowsforms/4.3.php
и тут: https://stackoverflow.com/questions/12354753/textbox-textchanged-and-ctrl-a
210 Ёпрст
 
26.05.20
09:30
(209) Я смотрю по-старинке, через vba
211 Ёпрст
 
26.05.20
09:32
Там все события\методы\свойства соответствуют. TextChanged- такого нема у этого активикса
212 Salimbek
 
27.05.20
16:38
(211) Посмотрел - действительно, все работает.
Надо в код из (153) добавить такую процедуру:

//Контрол, который используется для АктивИкса - СтрПоиска. Поэтому событие СтрПоиска + _Change
//АтрФормы.УстановитьАтрибут(..., "СтрПоиска")
Процедура СтрПоиска_Change()
    //Тут, внимание, используется ПЕРЕМЕННАЯ , которая используется для АктивИкса в ПослеОткрытии
    //СтПоиска    = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");
    Сообщить("Прилетело изменение: "+СтПоиска.Text);
КонецПроцедуры // СтрПоиска_Change


и можно выкинуть все обработки нажатий, отжатий и прочего.
213 Злопчинский
 
27.05.20
16:39
(212) ждем вменяемого окнчательного кода/пакета
214 MWWRuza
 
гуру
27.05.20
17:31
(213) Вот: https://cloud.mail.ru/public/9WYj/2V7uAqXy7

Работает с любым ТекстБоксом, хоть MS, хоть RichTextBox, определяет автоматом - пытается создать объект MS, не получилось - пытается создать РичТекстБокс. Дальше, соответственно работает.
Работают все три клавиши копи/паста - Ctrl(X,C,V).
В общем можно сказать, окончательный вариант...

Не хватает только копи/паста из контекстного меню - по правой кнопке мыши... Попробовал - не получилось, мозгов не хватило... Может Ёпрст на досуге идейку подкинет, как такое можно реализовать :-)
215 MWWRuza
 
гуру
27.05.20
17:36
+(214) Событие клика правой кнопкой мыши ловлю:

Процедура СтрПоиска_MouseDown(Button, Shift, X, Y)
    Если Button = 2 Тогда
//        КонтролТекста.ShortcutMenuBar = 1;
    КонецЕсли;  
КонецПроцедуры

А как само меню открыть - так и не понял...
216 MWWRuza
 
гуру
27.05.20
21:24
(212) В вот фигушки :-(
В тестовой обработке - работает, все отлично. Попробовал перенести в рабочую конфигурацию - ни в какую...
Не отрабатывает событие СтрПоиска_KeyPress(Символ). Ну вообще, как и нет его... При этом - СтрПоиска_Change() - работает...
Проверил тысячу раз, думал, может что-то с именами накосячил... Нет, все правильно. А не работает! Целый час убил, пока искал "черную кошку в темной комнате"... А оказалось, как всегда - ее там просто нет! Все у меня правильно.
А не работает - потому, что форма в модальном режиме открывается. Ну, так надо по концепции конфигурации. Не могу я ее открывать не модально. Ив 7.7 нет такого параметра, как в восьмерке "режим открытия формы - блокировать все окна". Только модально. Так, что - придется код из топки доставать, как бы этого и не хотелось...
217 MWWRuza
 
гуру
27.05.20
21:44
+(216) СтрПоиска_KeyUp - в модальном режиме тоже не отрабатывает...
218 Salimbek
 
27.05.20
22:03
(216) А зачем тебе СтрПоиска_KeyPress ?
219 MWWRuza
 
гуру
27.05.20
22:17
(218) А без нее, только стрелки, делет и бакспейс работают. Символы не вводятся. В случае контрола от МайкроСофт. В (176) и дальше обсуждали. В случае РичБокса - все и так работает.
220 Salimbek
 
27.05.20
22:40
(219) А... понял. Попробуй зайти с другого краю.

Дело в том, что мы создаем АктивИкс на Кнопке - а она не любит ввод символов, потому как она кнопка. А если надо вводить что-то  - то лучше удали эту Кнопку. Затем на этом же месте создай на форме текстовое поле ввода с тем же именем СтрПоиска и на нем создавай АктивИкс.
221 Salimbek
 
27.05.20
22:41
+(220) Т.е. просто тупо удаляешь кнопку, пихаешь на это место другой элемент и запускаешь... Код трогать не надо. Может поможет.
222 Salimbek
 
27.05.20
22:48
Хотя, нет :-(

Там можно только поле Текст использовать. И вот тогда совсем перестают кнопки прилетать...
223 MWWRuza
 
гуру
27.05.20
23:04
В общем, для модальных окон, я думаю, надо сделать некий "гибрид". Событие изменения текста в строке, ловить с помощью СтрПоиска_Change(), и из нее запускать поиск или что еще надо, раз она работает. Всякие делеты, бакспейсы, стрелки - будут и так работать, ничего для этого делать не надо. А символы ловить с помощью ПриНажатииКнопкиКлавиатуры, как изначально было. Оно в модальном режиме без проблем работает. Все равно код упрощается значительно.
224 Ёпрст
 
27.05.20
23:56
(223) формекс у тебя какой хоть версии ?
На счет контекстного меню, можно или тот же активикс типа менюитем использовать, или формековское меню из списка значений
225 Ёпрст
 
28.05.20
01:44
Хотя не.. просто не используй поделие от мелкомягких и усё.
226 MWWRuza
 
гуру
28.05.20
09:27
(225) Да я уже подумал об этом... Надо "в углу покопаться", был вроде какой-то системник с установленной виндой. Надо его в домашнюю сетку прицепить, и поэкспериментировать на нем.
Просто после того, как поймал "глюк" с падением 1С, при использовании контрола РичТекст, как-то стремно не протестировав в рабочии конфигурации такое встраивать... Конечно, принудительное создание нужного объекта, это дает возможность протестировать и на компе с мс офисом, но, для чистоты эксперимента, окончательное тестирование лучше делать на "чистом" компе, где никогда не было ничего от мс, не считая самой винды. У клиента, где я первый раз с этим столкнулся уже установлен РанТайм от Акцеса, там уже эксперимент не будет чистым...
227 MWWRuza
 
гуру
28.05.20
23:08
+(226) В процедуре "ПриЗакрытии()" добавка вот такой строки: "АтрФормы.Destroy();", вроде вылечивает от падений... При чем, и для MS, и для Рич...
228 MWWRuza
 
гуру
11.06.20
16:09
Хм... Сегодня случайно заметил, что при вводе букв(именно символов, стрелки, пробел, бакспейс и делет сюда не попадают), динамики(колонки) компа издают громкое "блямс" на каждую букву, типа сигнал ошибки... По большому счету - да пофик, все равно почти ни у кого звука на рабочих станциях нет... Но, вдруг... Можно как-то подавить этот эффект?
Вот, со звуком: https://cloud.mail.ru/public/u3yr/2mTfafKeL
229 Злопчинский
 
11.06.20
16:14
(228) кузявенько выглядит.
230 Злопчинский
 
11.06.20
16:15
справочник большой?
а то моему "лавочнику" как раз бы пригодился, у него в спр.номенклатуры 20 тыс и более
231 MWWRuza
 
гуру
11.06.20
16:16
+(228) Звук возникает после завершения вот этой процедуры:

Процедура СтрПоиска_KeyPress(Символ)
    Если MSContr = 1 Тогда
        Старт                     = СтрБыстрПоиска.SelStart;
        ТекстКонтрола             = СтрБыстрПоиска.text;
        Начало                     = Лев(ТекстКонтрола,Старт);
        СтрБыстрПоиска.text        = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + СтрБыстрПоиска.SelLength + 1);
        СтрБыстрПоиска.SelStart    = Старт + СтрДлина(Симв(Символ.value));
    КонецЕсли;
КонецПроцедуры

В отладчике смотрел, как последним шагом проходит "КонецПроцедуры", так "блямс" из динамиков...
232 MWWRuza
 
гуру
11.06.20
16:18
(230) Проверял на ~80 000, работает нормально, без тормозов, по крайней мере на моем компе Коре i5, 32 бита, соответственно ОЗУ 3 с копейками...
233 Злопчинский
 
11.06.20
16:22
(232) ну когда окончательно все вычистишь - попрошу очередной "последний" инсталл...
.
и вообще кузяво сделать чтобы фокус вполе ввода не ставить.
прсото набираешь буквы - и считаем что это идет быстрый поиск...
это подойдет для простых форм с одной ТЧ списка
234 MWWRuza
 
гуру
11.06.20
16:49
(233) прсото набираешь буквы - и считаем что это идет быстрый поиск...

Хм... А если нужно просто в списке искать, штатным методом, по первым буквам?
Можно просто фокус в поле поиска ставить при открытии формы, хотя, толку от этого будет не много... Но все равно надо подумать.
235 victuan1
 
15.06.20
05:04
А вот здесь http://catalog.mista.ru/public/141197/ не то же самое по сути реализовано?
236 Злопчинский
 
15.06.20
10:26
(235) угу, только здесь автор еще всякой хрени дополнительно впилил
237 Ёпрст
 
15.06.20
10:42
(236) да нет там "хрени", там просто универсальный метод, подключил класс и готово - работает во всех формах.
238 Ёпрст
 
15.06.20
10:43
Были какие-то недочеты, не вспомню ужо
239 Злопчинский
 
15.06.20
20:44
(237) там - нет, а в этой ветке - есть чего-то дополнительное. много всего, но я не понял что принципиально неудовлетворило автора в твоей публикации
240 MWWRuza
 
гуру
15.06.20
21:43
(239) Да все удовлетворило... Поздно увидел, когда уже свой велосипед изобрел... Теперь, уже лень переделывать, все и так работает. Из видимых минусов - только "блямконье" в колонках, остальное все полностью, на все 100% устраивает.
241 victuan1
 
16.06.20
08:09
(235) А по-моему, там только по Энтеру начинается поиск? Т.е. он не "живой" как тут?
242 Ёпрст
 
16.06.20
09:12
(241) там всё норм
AdBlock убивает бесплатный контент. 1Сергей