Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Нужно перегнать функцию в dll. Как сделать внешнюю компоненту?

Нужно перегнать функцию в dll. Как сделать внешнюю компоненту?
Я
   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, которая РАБОТАЕТ БЕЗ БУБНА, буду премного благодарен.
 
 
   Garykom
 
1 - 14.08.19 - 05:56
Какие ЯП кроме 1С знаешь?
   trim89
 
2 - 14.08.19 - 06:00
Знаю - ничего, могу прочитать и понять что код делает - стандарт delphi, basic, c++. Из сред разработки только delphi
   Garykom
 
3 - 14.08.19 - 06:03
http://catalog.mista.ru/public/81644/
и там еще другой вариант есть под дельфи, короче два шаблона разных знаю
   trim89
 
4 - 14.08.19 - 06:03
функция, которую надо перегнать - простейшая. По сути там циклы, конкатенация и битовые операции. Моих знаний конкретно для переноса на другой язык должно хватить. Проблема именно в создании dll.
   ДенисЧ
 
5 - 14.08.19 - 06:04
А если идти не на нимофстрат, а на ИТС, и взять там шаблон для ВК?
   trim89
 
6 - 14.08.19 - 06:05
(5) 4 предложение и далее - описание что из этого вышло
   Garykom
 
7 - 14.08.19 - 06:07
https://github.com/Zawullon/fpnativeapi короче поищи

Но лучше на C# делай.
А еще лучше поднимай внешний http сервис и юзай его из 1С.
   Garykom
 
8 - 14.08.19 - 06:08
(4) Там с ВК куча проблем, начиная от кодировок до работы с памятью на C++ и прочих извратов с передачей объектов или хотя бы длинных строк.
   trim89
 
9 - 14.08.19 - 06:08
(3) (7) Спасибо, почитаю
   VS-1976
 
10 - 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
   VS-1976
 
11 - 14.08.19 - 06:38
   trim89
 
12 - 14.08.19 - 06:48
(10) Мне не это надо. Есть текст, нужно найти в нём строку с заранее заданным количеством ошибок. Больше всего подходит agrep, но он на linux =(
   trim89
 
13 - 14.08.19 - 06:50
strmatch я не помню уже почему не подошёл
   Garykom
 
14 - 14.08.19 - 07:18
   ДенисЧ
 
15 - 14.08.19 - 07:19
(0) @Но лучше на C# делай. @
Не слушай (7) ..
   ДенисЧ
 
16 - 14.08.19 - 07:20
(6) И да, могу продать резиновую киянку...
Ибо у меня, который на с++ последний раз писал в 1999м году - собрать шаблон с ИТС получилось со второго раза (первый раз не ту студию взял)
   Garykom
 
17 - 14.08.19 - 07:23
(15) ВК на C# это самое простое в реализации, но NativeAPI не будет, только обычная COM ВК
   Garykom
 
18 - 14.08.19 - 07:24
(4) >функция, которую надо перегнать - простейшая.

Дай функцию в студию плиз
   trim89
 
19 - 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));
КонецФункции
   trim89
 
20 - 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);
КонецФункции
   trim89
 
21 - 14.08.19 - 07:28
(14) это bitap алгоритм, с модификацией для нечеткого поиска
   trim89
 
22 - 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) КОМ на шарпе писать - это извращение
   Garykom
 
27 - 14.08.19 - 09:03
(22) Любой VS от 2008 до 2019
У меня в VS2017 С++ ВК вполне скомпилились после множества матов.

Но имхо на С++ писать это изврат редкостный, пока ничего проще Книга знаний: Написание внешних компонент для 1С на VB.NET и C# не придумано.
Ну или Книга знаний: Написание внешних компонент для 1С (Delphi)
   trim89
 
28 - 14.08.19 - 09:07
(25) нет, основная проблема в побитовом умножении и сложении. конркетно преобразования из строки в число и обратно даёт низкую скорость
   trim89
 
29 - 14.08.19 - 09:09
(25) через побитовые операции тоже работает не намного быстрее, да и при определённых размерах строк выдаёт ошибки.
   trim89
 
30 - 14.08.19 - 09:32
(27) "после множества матов.", вот то-то и оно. Времени много уходит на такую ересь, тем более что я не знаю что там и как. Приходится забрасывать запросами гугл. Надоело уже.
 
 Рекламное место пустует
   Garykom
 
31 - 14.08.19 - 09:36
(30) Шаблон на дельфи/лазарус вполне рабочий и nativeapi и com, но только x86.
Для x86_64 надо допиливать, недавно тема была пока вроде не взлетело еще.
   Garykom
 
32 - 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) Не трынди. Ничо там допиливать не надо. Всё исправлено лет пять назад. Допиливают те, кому лень скачать модуль заново.
   kyvv
 
34 - 14.08.19 - 10:19
(0)Даже у меня все получилось, попробуйте https://www.youtube.com/watch?v=wMYuwhmz4jk
   MM
 
35 - 14.08.19 - 10:32
(33) У меня вывелось куча предупреждений при компиляции x86_64, хотя и заработало. Так что не всё там гладко.
   Garykom
 
36 - 14.08.19 - 10:42
(33) Ну значит не тот модуль качают )) Под дельфи/лазарус их два в паблике есть совершенно разных
   trim89
 
37 - 14.08.19 - 10:42
(34) Компонента скомпилилась, она подключается, функция не вызывается
   trim89
 
38 - 14.08.19 - 10:43
(34) В ролике сказано про локализацию. Попробую эту тему ещё покопать.
   H A D G E H O G s
 
39 - 14.08.19 - 12:35
Я один нихрена не понял?
Глобальный контекст (Global context)
ПобитовыйСдвигВлево (BitwiseShiftLeft)
Синтаксис:

ПобитовыйСдвигВлево(<Число>, <Смещение>)
Параметры:

<Число> (обязательный)

Выполняет побитовый сдвиг двоичного представления числа на заданное количество битов влево.
   H A D G E H O G s
 
40 - 14.08.19 - 12:35
Ну и e.t.c
   H A D G E H O G s
 
41 - 14.08.19 - 12:38
Ну и
ПолучитьБуферДвоичныхДанныхИзСтроки
   Злопчинский
 
42 - 14.08.19 - 13:53
(13) стрматч не дает поиск с заранее заданным количеством ошибок.
стрматч можно выставить границу поиска, типа похоже более чем на 90%
   Garykom
 
43 - 14.08.19 - 13:55
(42) У стрматч отвратный алгоритм нечеткого сравнения, для фонетики больше подходит а не опечаток.
   Фрэнки
 
44 - 14.08.19 - 19:30
(41) ну я тоже попытался отговорить его от освоения новых технологий - не был услышан
   NorthWind
 
45 - 14.08.19 - 19:38
(7) веб-сервис чтобы строку обработать?
Это прикол такой?
   Garykom
 
46 - 14.08.19 - 19:41
(45) Почему прикол то?
Со временем все к этому придет, очень универсально некоторыми минусами.

Можно и одну строку, а можно и много строк сразу передать и разом обработать и получить результат.
Причем откуда угодно и из чего угодно, никакой возни с установкой и подключением ВК.

А если наконец то добавить в 1с встроенный веб-сервер и передавать в запросе обратный адрес то совсем отлично будет и асинхронно.
   Garykom
 
47 - 14.08.19 - 19:42
(46)+ Но раньше чем IPv6 будет нормально распространено ждать не стоит.
   tesseract
 
48 - 14.08.19 - 22:32
(0) 1C имеет очень быстрый нечеткий поиск и операции со строками - ты просто не понимаешь, что делаешь.  native вообще работает с utf8/16 без проблем. Даже в примере.
   trim89
 
49 - 15.08.19 - 02:58
(48) Пример функции пжлст. Что нибудь похожее для произвольного текста я не нашёл.
   trim89
 
50 - 15.08.19 - 03:05
(44) (41) (39) Побитовый операции в 1с для этой задачи имеют свои ограничения в размере строк. Конкретнее, число должно быть не более  2^32-1. То есть могу искать строку не более 32 символов, что хрень. По скорости не сильно выигрываю. С помощью такой эмуляции битовых операций могу обрабатывать гораздо большие строки.
   ado
 
51 - 15.08.19 - 06:13
А если тупо сделать консольное приложение и вызывать его через КомандаСистемы()?
Ввод/вывод через временные файлы.
Ну, это, конечно, если функция "толстая".
   trim89
 
52 - 15.08.19 - 07:26
(51) лучше время потратить на dll. Сейчас через delphi делаю, проблем не возникает.
   trim89
 
53 - 15.08.19 - 11:42
Написал. По тестам, dll быстрее от 2.5 раз. На коротких словах и текстах до 8 раз. Вот мысля появилась сделать через битовые операции, а ограничение размера паттерна обходить алгоритмом а-ля Бойера-Мура. Думаю, это ещё больше убыстрит.
   H A D G E H O G s
 
54 - 15.08.19 - 11:43
(50) Ты прикалываешься чтоли?
   H A D G E H O G s
 
55 - 15.08.19 - 11:47
Как ты в Дельфи побитово складываешь строки? В Дельфи ты можешь максимум 8 байтные UINT64 побитово складывать - это 4 символа за цикл. В 1С ты складываешь 4 байтные UINT - 2 символа за цикл. В чем проблема?
   NorthWind
 
56 - 15.08.19 - 12:06
(46) на одной строке смысла нет, потому что оверхед по операциям будет огромным - вы в тысячу раз больше строковых операций сделаете при запаковке данных в хмл/джейсон, потом при передаче, потом при распаковке, потом то же самое при работе с результатом. На большом объеме текста смысла немножко больше, но не факт что здесь не станет узким местом сетевое взаимодействие.
По-моему, использование веб-сервисов в подобной ситуации имеет смысл только тогда, когда со строками делается какой-нибудь достаточно уникальный сервис. Скажем, перевод с одного языка на другой близкий к естественному, или какое-то еще преобразование по правилам языка, которое затруднительно сделать без гигантской базы данных и искусственного интеллекта.
   Volodja
 
57 - 15.08.19 - 12:48
   Garykom
 
58 - 15.08.19 - 13:07
(56) Нельзя спорить что ВК конечно же быстрее, и когда надо много запросов строк в цикле без нее никак.
Или когда требования к скорости получения ответа жесткие.

Если же таких требований нет или надо разом много строк, да еще и клиент убогий (мобильный или браузер) то тут веб-серверная компонента сильно лучше.
   trim89
 
59 - 15.08.19 - 14:03
(57) это метод n грамм, он, мягко говоря, не точный.
   trim89
 
60 - 15.08.19 - 14:07
(55) а причем тут побитово складывать строки? Фишка данного алгоритма создание битовых векторов, которые потом складываются и умножаются. Ограничение в 1с 32 бита, то есть подстрока поиска макс 32 символа.
   MetaDon
 
61 - 15.08.19 - 14:25
строки преобразовать в биты; а далее

Побитовые операции в 1С
   H A D G E H O G s
 
62 - 15.08.19 - 14:31
(60) Можно пример на Дельфи по сложению битового вектора?
   trim89
 
63 - 15.08.19 - 15:01
(62) неа, я пока не сделал и даже не разбирался.


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