|   |   | 
| 
 | Нужно перегнать функцию в dll. Как сделать внешнюю компоненту? | ☑ | ||
|---|---|---|---|---|
| 0
    
        trim89 14.08.19✎ 05:48 | 
        Доброго времени суток.
 Есть функция на ~100 строк, нечёткий поиск. Так как 1с слишком медленно работает со строками, то есть идея перегнать её в вк native. Стал читать материал на инфостате, где описывается как всё легко и просто. Да вот как бы не так. Ничего не работает. Залез на ИТС, скачал шаблоны и примеры внешней компоненты. Открываю примеры visual studio 15, начинаю сборку, вываливается куча ошибок по коду, сборка не получается. Открываю visual studio 10, visual studio 12 - куча ошибок, но уже других. visual studio 13 - открыл, собрал, подключил в 1с, вызываю функцию иииии "Ошибка при вызове метода контекста (Петля)". Понятно, что дело в кодировке, но где конкретно понятия не имею. cpp файл в ANSI сохраняль, в 1251 сохраняль, руские буквы из кода удаляль, все пересобираль и ошибка не уходит, я не понимаю где и что ему не нравиться, уже нервов не хватает Добрые люди, поможите советом. Что не так? куда тыкать для исправления? если есть исходники dll, которая РАБОТАЕТ БЕЗ БУБНА, буду премного благодарен. | |||
| 1
    
        Garykom гуру 14.08.19✎ 05:56 | 
        Какие ЯП кроме 1С знаешь?     | |||
| 2
    
        trim89 14.08.19✎ 06:00 | 
        Знаю - ничего, могу прочитать и понять что код делает - стандарт delphi, basic, c++. Из сред разработки только delphi     | |||
| 3
    
        Garykom гуру 14.08.19✎ 06:03 | 
        http://catalog.mista.ru/public/81644/
 и там еще другой вариант есть под дельфи, короче два шаблона разных знаю | |||
| 4
    
        trim89 14.08.19✎ 06:03 | 
        функция, которую надо перегнать - простейшая. По сути там циклы, конкатенация и битовые операции. Моих знаний конкретно для переноса на другой язык должно хватить. Проблема именно в создании dll.     | |||
| 5
    
        ДенисЧ 14.08.19✎ 06:04 | 
        А если идти не на нимофстрат, а на ИТС, и взять там шаблон для ВК?     | |||
| 6
    
        trim89 14.08.19✎ 06:05 | 
        (5) 4 предложение и далее - описание что из этого вышло     | |||
| 7
    
        Garykom гуру 14.08.19✎ 06:07 | 
        https://github.com/Zawullon/fpnativeapi короче поищи
 Но лучше на C# делай. А еще лучше поднимай внешний http сервис и юзай его из 1С. | |||
| 8
    
        Garykom гуру 14.08.19✎ 06:08 | 
        (4) Там с ВК куча проблем, начиная от кодировок до работы с памятью на C++ и прочих извратов с передачей объектов или хотя бы длинных строк.     | |||
| 9
    
        trim89 14.08.19✎ 06:08 | 
        (3) (7) Спасибо, почитаю     | |||
| 10
    
        VS-1976 14.08.19✎ 06:36 | 
        Если тебе нужен полнотекстовый поиск, то можно использовать https://yandex.ru/turbo?text=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2FSphinx_(%25D0%25BF%25D0%25BE%25D0%25B8%25D1%2581%25D0%25BA%25D0%25BE%25D0%25B2%25D0%25B0%25D1%258F_%25D0%25BC%25D0%25B0%25D1%2588%25D0%25B8%25D0%25BD%25D0%25B0)
 Ставится так же на windows | |||
| 11
    
        VS-1976 14.08.19✎ 06:38 | ||||
| 12
    
        trim89 14.08.19✎ 06:48 | 
        (10) Мне не это надо. Есть текст, нужно найти в нём строку с заранее заданным количеством ошибок. Больше всего подходит agrep, но он на linux =(     | |||
| 13
    
        trim89 14.08.19✎ 06:50 | 
        strmatch я не помню уже почему не подошёл     | |||
| 14
    
        Garykom гуру 14.08.19✎ 07:18 | 
        (12) Банальное https://ru.wikipedia.org/wiki/Расстояние_Левенштейна ?     | |||
| 15
    
        ДенисЧ 14.08.19✎ 07:19 | 
        (0) @Но лучше на C# делай. @
 Не слушай (7) .. | |||
| 16
    
        ДенисЧ 14.08.19✎ 07:20 | 
        (6) И да, могу продать резиновую киянку... 
 Ибо у меня, который на с++ последний раз писал в 1999м году - собрать шаблон с ИТС получилось со второго раза (первый раз не ту студию взял) | |||
| 17
    
        Garykom гуру 14.08.19✎ 07:23 | 
        (15) ВК на C# это самое простое в реализации, но NativeAPI не будет, только обычная COM ВК     | |||
| 18
    
        Garykom гуру 14.08.19✎ 07:24 | 
        (4) >функция, которую надо перегнать - простейшая.
 Дай функцию в студию плиз | |||
| 19
    
        trim89 14.08.19✎ 07:27 | 
        (18) &НаСервере
 функция АлгоритмНечеткогоПоиска(Текст,СтрокаПоиска) экспорт //алгоритм Bitap, модификация от Wu-Manber m = СтрДлина(Текст); n = СтрДлина(СтрокаПоиска); ФорматнаяСтрока = "ЧЦ="+формат(n,"ЧГ=0")+"; ЧН=; ЧВН=; ЧГ=0"; U = новый Соответствие; для i = 1 по n цикл ключ = сред(СтрокаПоиска,i,1); БитовыйВектор = U.Получить(ключ); если БитовыйВектор = Неопределено тогда БитовыйВектор = формат(0,ФорматнаяСтрока); КонецЕсли; БитовыйВектор = лев(БитовыйВектор,i-1) + "1"+прав(БитовыйВектор,n-i); U.Вставить(ключ,БитовыйВектор); КонецЦикла; МассивНоваяПопытка = новый Массив(m); МаксОшибка = макс(2,цел(СтрДлина(СтрокаПоиска)/10)); Для Ошибка = 0 по МаксОшибка цикл M1 = формат(0,ФорматнаяСтрока); МассивПредыдущаяПопытка = новый массив; Для каждого стр из МассивНоваяПопытка цикл МассивПредыдущаяПопытка.Добавить(стр); КонецЦикла; для j = 1 по m цикл БитовыйВектор = U.Получить(сред(Текст,j,1)); Если БитовыйВектор = Неопределено тогда БитовыйВектор = формат(0,ФорматнаяСтрока); КонецЕсли; УмножениеСВектором = ПобитовоеУмножение(СдвигВПраво(M1,n),БитовыйВектор,ФорматнаяСтрока); Если Ошибка = 0 тогда ПредыдущаяПопыткаj_1 = формат(0,ФорматнаяСтрока); иначеЕсли j = 1 тогда ПредыдущаяПопыткаj_1 = формат(0,ФорматнаяСтрока); иначе ПредыдущаяПопыткаj_1 = МассивПредыдущаяПопытка[j-2]; КонецЕсли; Если Ошибка = 0 тогда ПредыдущаяПопыткаj = формат(0,ФорматнаяСтрока); иначе ПредыдущаяПопыткаj = МассивПредыдущаяПопытка[j-1]; КонецЕсли; вставкаM1 = ПобитовоеСложение(УмножениеСВектором,ПредыдущаяПопыткаj_1,ФорматнаяСтрока); УдалениеM1 = ПобитовоеСложение(УмножениеСВектором,СдвигВПраво(ПредыдущаяПопыткаj,n),ФорматнаяСтрока); ЗаменаM1 = ПобитовоеСложение(УмножениеСВектором,СдвигВПраво(ПредыдущаяПопыткаj_1,n),ФорматнаяСтрока); //результат = вставкаM1 или УдалениеM1 или ЗаменаM1 M1 = ПобитовоеСложение(вставкаM1,УдалениеM1,ФорматнаяСтрока); M1 = ПобитовоеСложение(M1,ЗаменаM1,ФорматнаяСтрока); МассивНоваяПопытка[j-1] = M1; Если прав(M1,1)="1" тогда //нужно найти начальный символ //идет там где первые ошибка бит =1, останльные 0 СтрокаДляСравнения = формат(0,"ЧЦ="+формат(Ошибка+1,"ЧГ=0")+"; ЧН=; ЧВН=; ЧГ=0") ; СтрокаДляСравнения = СтрЗаменить(СтрокаДляСравнения,"0","1"); СтрокаДляСравнения = СтрокаДляСравнения + формат(0,"ЧЦ="+формат(n-Ошибка-1,"ЧГ=0")+"; ЧН=; ЧВН=; ЧГ=0"); Для Инт = -(j-1) по 0 цикл Если МассивНоваяПопытка[-Инт] = СтрокаДляСравнения тогда Прервать; КонецЕсли; КонецЦикла; возврат(новый Структура("Слово,позиция,ошибок",Сред(Текст,-Инт+1,j+Инт),-Инт+1,Ошибка)); //возврат -Инт+1; КонецЕсли; КонецЦикла; КонецЦикла; возврат(новый Структура("Слово,позиция,ошибок","",0,0)); КонецФункции | |||
| 20
    
        trim89 14.08.19✎ 07:27 | 
        (18) &НаСервере
 функция ПобитовоеУмножение(Число1,Число2,ФорматнаяСтрока) возврат СтрЗаменить(СтрЗаменить(Формат(Число(Число1) + Число(Число2), ФорматнаяСтрока), "1", "0"), "2", "1") КонецФункции &НаСервере функция ПобитовоеСложение(Число1,Число2,ФорматнаяСтрока) возврат СтрЗаменить(Формат(Число(Число1) + Число(Число2), ФорматнаяСтрока), "2", "1"); КонецФункции &НаСервере функция СдвигВПраво(Число1,n) возврат "1" + лев(Число1,n-1); КонецФункции | |||
| 21
    
        trim89 14.08.19✎ 07:28 | 
        (14) это bitap алгоритм, с модификацией для нечеткого поиска     | |||
| 22
    
        trim89 14.08.19✎ 07:38 | 
        (16) Если получилось собрать сейчас, то киянка не нужна, помоги советом: что, куда и какой studio брать?     | |||
| 23
    
        Фрэнки 14.08.19✎ 08:32 | 
        имхо, если точно также сделать строковыми операциями на си или дельфи, то существенного ускорения не получится. Да еще и будут потери на передачу стека параметров туда-суда обратно     | |||
| 24
    
        Фрэнки 14.08.19✎ 08:33 | 
        кстати, в приведенном примере кода также видно причина к снижению производительности на передачу стека параметров туда-сюда     | |||
| 25
    
        Фрэнки 14.08.19✎ 08:36 | 
        т.е. низкая скорость обработки данных в таком подходе провоцируется составлением слишком мелких функций, которые вызываются слишком часто с передачей параметров и возвратом параметров.     | |||
| 26
    
        ДенисЧ 14.08.19✎ 08:54 | 
        (17) КОМ на шарпе писать - это извращение     | |||
| 27
    
        Garykom гуру 14.08.19✎ 09:03 | 
        (22) Любой VS от 2008 до 2019
 У меня в VS2017 С++ ВК вполне скомпилились после множества матов. Но имхо на С++ писать это изврат редкостный, пока ничего проще Книга знаний: Написание внешних компонент для 1С на VB.NET и C# не придумано. Ну или Книга знаний: Написание внешних компонент для 1С (Delphi) | |||
| 28
    
        trim89 14.08.19✎ 09:07 | 
        (25) нет, основная проблема в побитовом умножении и сложении. конркетно преобразования из строки в число и обратно даёт низкую скорость     | |||
| 29
    
        trim89 14.08.19✎ 09:09 | 
        (25) через побитовые операции тоже работает не намного быстрее, да и при определённых размерах строк выдаёт ошибки.     | |||
| 30
    
        trim89 14.08.19✎ 09:32 | 
        (27) "после множества матов.", вот то-то и оно. Времени много уходит на такую ересь, тем более что я не знаю что там и как. Приходится забрасывать запросами гугл. Надоело уже.     | |||
| 31
    
        Garykom гуру 14.08.19✎ 09:36 | 
        (30) Шаблон на дельфи/лазарус вполне рабочий и nativeapi и com, но только x86.
 Для x86_64 надо допиливать, недавно тема была пока вроде не взлетело еще. | |||
| 32
    
        Garykom гуру 14.08.19✎ 09:41 | 
        Сам я начал пилить ВК на C++ к которой можно внешние DLL на чем угодно подрубать, у меня на Golang.
 Оно даже в тестовом варианте вполне работает NativeAPI и x86/x86_64 причем Windows/Linux. Но куча разных тонкостей что можно а что еще низзя. Короче сделай свой алгоритму на чем угодно и запускай его из командной строки с параметрами из 1С )) Это реально простейший вариант, причем параметры в виде xml или json файла на вход и результат на выход тоже xml или json. А затем просто поднимается апача и cgi-bin )) | |||
| 33
    
        Кирпич 14.08.19✎ 09:50 | 
        (31) Не трынди. Ничо там допиливать не надо. Всё исправлено лет пять назад. Допиливают те, кому лень скачать модуль заново.     | |||
| 34
    
        kyvv 14.08.19✎ 10:19 | 
        (0)Даже у меня все получилось, попробуйте https://www.youtube.com/watch?v=wMYuwhmz4jk     | |||
| 35
    
        MM 14.08.19✎ 10:32 | 
        (33) У меня вывелось куча предупреждений при компиляции x86_64, хотя и заработало. Так что не всё там гладко.     | |||
| 36
    
        Garykom гуру 14.08.19✎ 10:42 | 
        (33) Ну значит не тот модуль качают )) Под дельфи/лазарус их два в паблике есть совершенно разных     | |||
| 37
    
        trim89 14.08.19✎ 10:42 | 
        (34) Компонента скомпилилась, она подключается, функция не вызывается     | |||
| 38
    
        trim89 14.08.19✎ 10:43 | 
        (34) В ролике сказано про локализацию. Попробую эту тему ещё покопать.     | |||
| 39
    
        H A D G E H O G s 14.08.19✎ 12:35 | 
        Я один нихрена не понял?
 Глобальный контекст (Global context) ПобитовыйСдвигВлево (BitwiseShiftLeft) Синтаксис: ПобитовыйСдвигВлево(<Число>, <Смещение>) Параметры: <Число> (обязательный) Выполняет побитовый сдвиг двоичного представления числа на заданное количество битов влево. | |||
| 40
    
        H A D G E H O G s 14.08.19✎ 12:35 | 
        Ну и e.t.c     | |||
| 41
    
        H A D G E H O G s 14.08.19✎ 12:38 | 
        Ну и 
 ПолучитьБуферДвоичныхДанныхИзСтроки | |||
| 42
    
        Злопчинский 14.08.19✎ 13:53 | 
        (13) стрматч не дает поиск с заранее заданным количеством ошибок.
 стрматч можно выставить границу поиска, типа похоже более чем на 90% | |||
| 43
    
        Garykom гуру 14.08.19✎ 13:55 | 
        (42) У стрматч отвратный алгоритм нечеткого сравнения, для фонетики больше подходит а не опечаток.     | |||
| 44
    
        Фрэнки 14.08.19✎ 19:30 | 
        (41) ну я тоже попытался отговорить его от освоения новых технологий - не был услышан     | |||
| 45
    
        NorthWind 14.08.19✎ 19:38 | 
        (7) веб-сервис чтобы строку обработать?
 Это прикол такой? | |||
| 46
    
        Garykom гуру 14.08.19✎ 19:41 | 
        (45) Почему прикол то?
 Со временем все к этому придет, очень универсально некоторыми минусами. Можно и одну строку, а можно и много строк сразу передать и разом обработать и получить результат. Причем откуда угодно и из чего угодно, никакой возни с установкой и подключением ВК. А если наконец то добавить в 1с встроенный веб-сервер и передавать в запросе обратный адрес то совсем отлично будет и асинхронно. | |||
| 47
    
        Garykom гуру 14.08.19✎ 19:42 | 
        (46)+ Но раньше чем IPv6 будет нормально распространено ждать не стоит.     | |||
| 48
    
        tesseract 14.08.19✎ 22:32 | 
        (0) 1C имеет очень быстрый нечеткий поиск и операции со строками - ты просто не понимаешь, что делаешь.  native вообще работает с utf8/16 без проблем. Даже в примере.     | |||
| 49
    
        trim89 15.08.19✎ 02:58 | 
        (48) Пример функции пжлст. Что нибудь похожее для произвольного текста я не нашёл.     | |||
| 50
    
        trim89 15.08.19✎ 03:05 | 
        (44) (41) (39) Побитовый операции в 1с для этой задачи имеют свои ограничения в размере строк. Конкретнее, число должно быть не более  2^32-1. То есть могу искать строку не более 32 символов, что хрень. По скорости не сильно выигрываю. С помощью такой эмуляции битовых операций могу обрабатывать гораздо большие строки.     | |||
| 51
    
        ado 15.08.19✎ 06:13 | 
        А если тупо сделать консольное приложение и вызывать его через КомандаСистемы()?
 Ввод/вывод через временные файлы. Ну, это, конечно, если функция "толстая". | |||
| 52
    
        trim89 15.08.19✎ 07:26 | 
        (51) лучше время потратить на dll. Сейчас через delphi делаю, проблем не возникает.     | |||
| 53
    
        trim89 15.08.19✎ 11:42 | 
        Написал. По тестам, dll быстрее от 2.5 раз. На коротких словах и текстах до 8 раз. Вот мысля появилась сделать через битовые операции, а ограничение размера паттерна обходить алгоритмом а-ля Бойера-Мура. Думаю, это ещё больше убыстрит.     | |||
| 54
    
        H A D G E H O G s 15.08.19✎ 11:43 | 
        (50) Ты прикалываешься чтоли?     | |||
| 55
    
        H A D G E H O G s 15.08.19✎ 11:47 | 
        Как ты в Дельфи побитово складываешь строки? В Дельфи ты можешь максимум 8 байтные UINT64 побитово складывать - это 4 символа за цикл. В 1С ты складываешь 4 байтные UINT - 2 символа за цикл. В чем проблема?     | |||
| 56
    
        NorthWind 15.08.19✎ 12:06 | 
        (46) на одной строке смысла нет, потому что оверхед по операциям будет огромным - вы в тысячу раз больше строковых операций сделаете при запаковке данных в хмл/джейсон, потом при передаче, потом при распаковке, потом то же самое при работе с результатом. На большом объеме текста смысла немножко больше, но не факт что здесь не станет узким местом сетевое взаимодействие.
 По-моему, использование веб-сервисов в подобной ситуации имеет смысл только тогда, когда со строками делается какой-нибудь достаточно уникальный сервис. Скажем, перевод с одного языка на другой близкий к естественному, или какое-то еще преобразование по правилам языка, которое затруднительно сделать без гигантской базы данных и искусственного интеллекта. | |||
| 57
    
        Volodja 15.08.19✎ 12:48 | 
        Это смотрел?
 http://catalog.mista.ru/public/440033/ | |||
| 58
    
        Garykom гуру 15.08.19✎ 13:07 | 
        (56) Нельзя спорить что ВК конечно же быстрее, и когда надо много запросов строк в цикле без нее никак.
 Или когда требования к скорости получения ответа жесткие. Если же таких требований нет или надо разом много строк, да еще и клиент убогий (мобильный или браузер) то тут веб-серверная компонента сильно лучше. | |||
| 59
    
        trim89 15.08.19✎ 14:03 | 
        (57) это метод n грамм, он, мягко говоря, не точный.     | |||
| 60
    
        trim89 15.08.19✎ 14:07 | 
        (55) а причем тут побитово складывать строки? Фишка данного алгоритма создание битовых векторов, которые потом складываются и умножаются. Ограничение в 1с 32 бита, то есть подстрока поиска макс 32 символа.     | |||
| 61
    
        MetaDon 15.08.19✎ 14:25 | 
        строки преобразовать в биты; а далее
 Побитовые операции в 1С | |||
| 62
    
        H A D G E H O G s 15.08.19✎ 14:31 | 
        (60) Можно пример на Дельфи по сложению битового вектора?     | |||
| 63
    
        trim89 15.08.19✎ 15:01 | 
        (62) неа, я пока не сделал и даже не разбирался.     | |||
| 64
    
        trim89 20.08.19✎ 04:50 | 
        Реализовал метод с битами в 1с и в dll. Разница во времени - несколько порядков. Конкретнее. 
 текст = "Текст = ""Мы дали общее описание того, как будут использоваться массивы сдвигов и прыжков. Массив сдвигов содержит величины, на которые может быть""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК); | Текст = Текст + "" сдвинут образец при несовпадении очередного символа. В массиве прыжков содержатся величины, на которые можно сдвинуть образец, чтобы совместить ранее""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК); | Текст = Текст + "" совпавшие символы с вновь совпадающими символами строки. При несовпадении очередного символа образца с очередным символом текста может осуществиться""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК); | Текст = Текст + "" несколько возможностей. Сдвиг в массиве сдвигов может превышать сдвиг в массиве прыжков, а может быть и наоборот. (Совпадение этих величин - простейшая возможная ситуация.)""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" О чем говорят эти возможности? Если элемент массива сдвигов больше, то это означает, что несовпадающий символ оказывается """"ближе"""" к началу,""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" чем повторно появляющиеся завершающие символы строки. Если элемент массива прыжков больше, то повторное появление завершающих символов строки начинается ближе""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" к началу образца, чем несовпадающий символ. В обоих случаях нам следует пользоваться большим из двух сдвигов, поскольку меньший сдвиг неизбежно опять приводит к""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" несовпадению из-за того, что мы знаем о втором значении. Так, например, если значение сдвига равно 2, а значение прыжка 4, то сдвиг на два символа не позволит найти""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" соответствие образцу: несовпадающий символ все равно окажется невыровненным. Однако, если сдвинуть на четыре символа, то под ранее несовпадающим символом окажется""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" подходящий символ образца, и при этом сохраняется возможность того, что завершающие символы образца будут совпадать с новыми соответствующими символами текста.""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК ); | Текст = Текст + "" Поскольку речь идет только о большем из двух значений, алгоритм имеет следующий вид: Счут на оплату""; | рез = НечеткийПоиск2( Текст,СтрокаПоиск, Кэш,ОбъектВК "; Число знаков тут больше 2 тысяч, с пробелами ~2500. Ищу 50 раз циклом 2 строки, короткую и длинную. Соответсвенно "Счfт на оjлату" и "Текст = Текст + "" Поскольку речь идет только о бfльшем из двух значений, алгоритм имеnт следующий вид: Счут на оплату""". В каждой из этих строк по 2 ошибки. В функции на 1с цикл 50 раз для короткой строки отрабатывает 17,675345, длинная - 6,009056 В dll, короткая - 0,020312, длинная - 0,019405. В общем, своей работой я доволен =) Всем спасибо. | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |