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

В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются...
Что это - глюк? Попытка асинхронности в Формекс?
Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться...
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) там всё норм
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший