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

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

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

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

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

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

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

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

В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются...
Что это - глюк? Попытка асинхронности в Формекс?
Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться...
   MWWRuza
 
101 - 20.05.20 - 08:56
(88) Сделать, что-бы очищался выделенный фрагмент строки - проблематично...

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

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

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

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

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

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

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

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

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

ФФлеш_TextChanged

Надо просто создать процедуру у себя в модуле с нужным количеством переменных
   Volodja
 
110 - 20.05.20 - 11:33
Вот так твою обработку изменил. Вроде лучше стало. Но иногда прилетает что-то левое
Перем ВремяНажатия;
....
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт)
    Интервал=(_GetPerformanceCounter()-ВремяНажатия);
    Если Интервал<120 Тогда//Слишком быстро пришел. Мусор

        Возврат;
    КонецЕсли;
    //Сообщить(Интервал);

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

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

    Флешка        = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");

Так работает...
   MWWRuza
 
123 - 20.05.20 - 12:24
(120) Спасибо, интересные эксперименты... Буду разбираться.
   MWWRuza
 
124 - 20.05.20 - 12:26
Остается попробовать на компе без Офиса. Но, по идее - должно заработать. Тут же явное указание, какой объект создавать... И, если библиотека будет зарегистрирована в системе, то, чего-бы ему не заработать :-)
   MWWRuza
 
125 - 20.05.20 - 15:47
Финальный вариант: https://cloud.mail.ru/public/gZmd/256P4zcod
Ну, тут уж даже и не знаю, чего еще можно улучшить... АктивеИкс пытается грузить МайкроСофтовский, если не получается - пытается загрузить альтернативный, из(114).
Обрабатываются делет, бакспейс, пробел. По табу, переходит на таблицу результатов, если что-то нашлось, если нет - игнорируется.
В общем - супер! Спасибо всем, кто участвовал! :-)
   serpentt
 
126 - 20.05.20 - 16:36
БэкСпэйс не отрабатывает с частью выделенного текста, т.е. Выделил часть текста, нажал БэксПэйс.... выделенный текст не удаляется, а удаляется первый символ перед курсором.
   Злопчинский
 
127 - 20.05.20 - 16:54
(125) я так и не понял зачем какие-то офисные контролы/аналоги..? просветит вкратце?
   Djelf
 
128 - 20.05.20 - 18:02
(127) 1С`овский контрол не меняет своего содержимого, пока не нажмешь enter.
Поэтому костыли на костылях и работает криво.
ActivX - меняет.
Аналог ActivX`а MS бесплатный, но если уже есть ActivX от MS, то аналог можно не ставить.
   Djelf
 
129 - 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% ускорить, но это будет не быстро.
   MWWRuza
 
130 - 20.05.20 - 19:50
(126) Ага.. Спасибо, мне чего-то не пришло в голову, что так будет кто-то делать. Сейчас посмотрю, думаю, можно поправить...

(127) А ты попробуй, прикольно работает. Просто набираешь в строке текст, оно само ищется, без нажатия на ентер или какую-то дополнительную кнопку.
А без "офисного контрола", все работает и так... Но, невозможно определить позицию курсора и длину выделенного фрагмента строки. Поэтому, кривенько работает. А так - вполне прилично.
 
 Рекламное место пустует
   MWWRuza
 
131 - 20.05.20 - 20:29
(126) Вот, будет время - потестируйте, может еще что-то вылезет: https://cloud.mail.ru/public/zRPA/256eeZBYt
   MWWRuza
 
132 - 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)}: Не найден указанный модуль.

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

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

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

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

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

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

Если при загрузке внешней компоненты вы не указываете полный путь, такой как E:\Events\Events.dll или сетевой путь наподобие \\ВашСервер\ПапкаГдеЛежатВК\Events.dll, то 1С ищет внешние компоненты
-относительно папки 1Cv7\BIN (КаталогПрограммы())
-относительно каталога информационной базы (КаталогИБ())"

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

Я чето-такое тоже видел. Поэтому и гружу ее при каждом запросе заново...
   MWWRuza
 
160 - 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) "очему - не понятно. Возможно, надо что-то прибивать перед закрытием формы, может еще что, х.з... " - не решил.. костылестроитель.. ;-)
   MWWRuza
 
163 - 25.05.20 - 09:15
(162)  не решил.. костылестроитель.. ;-)
Ну дык... Куда-же в семерке без них... https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-313.jpg
   Salimbek
 
164 - 25.05.20 - 09:52
(160) Попробовал твою обработку из (153) - без проблем и открывается и при закрытии 1С-ка не крашится.
   MWWRuza
 
165 - 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    = "";
    РезПоиска.УдалитьСтроки();
КонецПроцедуры 

   MWWRuza
 
168 - 25.05.20 - 11:24
(167) нефик делать переменные ( Перем = ) с именем идентификаторов формы.

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

Остальное - ща гляну...
   MWWRuza
 
169 - 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
И ПриНажатии клавиши и весб тот бред в нем, не нужен
   MWWRuza
 
173 - 25.05.20 - 12:33
(172) А... Теперь понял. У меня-то дома мелкомягкий офис стоит.
Ссейчас попробую принудительно грузить альтернативу, и посмотрю...
   MWWRuza
 
174 - 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(//мелкомягкие

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

   MWWRuza
 
177 - 25.05.20 - 13:26
(176) Не, СтрПоиска_onChange() не отрабатывает с MS. Надо читать, разбираться. Не все так просто.
В строке поиска делет и бакспейс работают, стрелки курсор перемещают, а новые символы не вводятся :-(
   MWWRuza
 
178 - 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);
КонецПроцедуры
   MWWRuza
 
183 - 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
это убережет от "двойных нажатий"
   MWWRuza
 
188 - 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/
   MWWRuza
 
192 - 25.05.20 - 19:18
Спасибо, понял... Как я только без als от этой ВК жил... Я хоть пока и не собираюсь писать свои классы(вроде нет таких задач, хватает стандартных), но даже со штатными функциями удобнее разбираться когда есть куда заглянуть.
   MWWRuza
 
193 - 25.05.20 - 21:17
(183) Супер! Так работает.
Поспешил обрадоваться тому, что кода почти нет, а все работает... Работает, да не совсем правильно. Ставишь курсор в любое место имеющейся строки, начинаешь вводить текст, а он в конец строки добавляется, и плевать ему на позицию курсора... Получается, нужно определять позицию курсора, делить на текст "до" и "после", и вставлять новые символы "между" этими частями. А это опять приведет к усложнению текста процедуры, практически до того, от чего начинал. Ну, не совсем - делет, бакспейс и стрелки вправо/влево без лишних действий в модуле программы обрабатываются правильно. А вот со вводом символов, в процедуре "СтрПоиска_KeyPress(Символ)" все равно мудрить надо.
Но, это только МелкоМягкого контрола касается - RichTextBox работает нормально без каких-либо дополнительных обработок нажатий клавиш...
   MWWRuza
 
194 - 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) да ну нах такие сложности. проще очистить поле и заново набрать. втсавлять в середину - раз из ста...
   MWWRuza
 
196 - 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));
КонецПроцедуры
   MWWRuza
 
198 - 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 в коде у меня завалялся.. можешь и выкинуть
  1  2  3   

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