ВК NativeAPI на Lazarus/FreePascal — теперь и для 1С 8.3 на Linux!

Расширенная версия 1CNativeLib — бесплатной библиотеки для создания внешних компонент (ВК) для 1С по технологии Native API, позволяющая компилировать ВК для целевой платформы Linux.

Данная разработка основывается на публикации ВК NativeAPI на Delphi и FreePascal автора v77 (за которую ему огромный плюс).

Главное отличие от оригинала — интерфейсный модуль переработан, и теперь позволяет компилировать компоненты для Linux. Более того, он сделан кросс-платформенным, и теперь с помощью данной версии можно собирать компоненты для всех поддерживаемых 1С на текущий момент платформ:

  1. Windows_x86 (1С 8.2-8.3 клиент+сервер);
  2. Windows_x86_64 (1С 8.2-8.3 сервер);
  3. Linux_x86 (1С 8.2 сервер, 1С 8.3 клиент+сервер);
  4. Linux_x86_64 (1С 8.2 сервер, 1С 8.3 клиент+сервер).

Также исправлены некоторые неточности и ошибки, и добавлено несколько функций по чтению/записи значений из V8Variant.

В прилагаемом архиве содержится демонстрационный пример компоненты с исходниками для Lazarus, а также тестовая обработка для 1С.

25 Comments

  1. quick

    Под виндой компилится х32 х64 отлично.

    Под линуксом только под х32, по х64 валит ошибку, линкер ругается на

    ClassNamesString: WideString = »;
    ClassNamesStringPWC: PWideChar = nil;
    

    Пока что еще не нашел способа исправить.

    Помогает

    Type
    WideString = String;
    

    Но с PWideChar не прокатило.

    А вот здесь немного поправил, т.к. под виндой все работает норм, а если под линухом вызвать

    V8SetWString(RetValue,»); то получаем Access Violation

    function TV8UserObject.V8SetWString(V: PV8Variant;
    Value: WideString): boolean;
    var
    L, SZ: longword;
    begin
    
    if Value=» then
    Value := #0;
    
    result := (PWideChar(Value) = nil);
    if result then
    Exit;
    

    Показать

    Reply
  2. Resha

    quick,

    Не сразу прочитал твой комент и убил на это же целый день 🙁

    Компилилилось оно нормально под виндой, но при попытке считать строковое свойство, которое равно «» — 1С вылетала

    Реализовал немного по другому:

    function TV8UserObject.V8SetWString(V: PV8Variant;
    Value: WideString): boolean;
    var
    L, SZ: longword;
    begin
    
    result := (PWideChar(Value) = nil);
    if result then
    Exit;
    
    V8ClearVar(V);
    V.vt := VTYPE_PWSTR;
    L := Length(Value);
    SZ := L + L + 2;
    
    result := V8MM.AllocMemory(@(V.VarEnum.vtRecWideString.pwstrVal), SZ);
    if result then
    begin
    if L <> 0 then
    Move(Value[1], V.VarEnum.vtRecWideString.pwstrVal#k8SjZc9Dxk, SZ);
    V.VarEnum.vtRecWideString.wstrLen := L;
    end;
    end;

    Показать

    Т.е. добавлено (при выделении памяти там уже #0 в первом байте):

    if L <> 0 then
    Reply
  3. ras2004a

    удалено

    Reply
  4. ras2004a

    Подскажите кто подключал торговое оборудование для linux клиента 1С 8.3, как это сделать?

    Есть сканер штрихкода, считыватель карт с магнитной лентой и фискальник штрих-м-фр-к.

    Под windows есть драйвер ScanOPOS, для Linux не могу найти аналог.

    Для штрих-м-фр-к нашел исходники драйвера, как скомпилировать и завязать с 1С пока непонятно.

    Reply
  5. bashinsky

    При компиляции минимального проекта, который указан в этой публикации, на lazarus, вылетает ошибка на коде регистрации функции

    AddFunc(‘Hello’, ‘Привет’, @TMyClass.Hello, 0);
    miniVK.lpr(24,49) Error: Incompatible type for arg no. 3: Got «<address of function(PV8Variant,PV8ParamArray,const LongInt):Boolean of object;Register>», expected «PV8CallAsFunc»

    Пробовал на win 7 32бит и 64бит.

    Может кто-нибудь помочь? подсказать в чем ошибка?

    Reply
  6. andrewks

    (5) а интерфейсный модуль Вы используете оттуда, или из моей публикации?

    Reply
  7. bashinsky

    (6) использовал и вашу и из той публикации

    Reply
  8. bashinsky

    (6) можете подсказать что-нибудь по данной ошибке?

    Reply
  9. kirlog

    Под виндой действительно все отлично!

    Но под линуксом x64 (конкретно UBUNTU 12.04 LTS x64) есть проблемы:

    1. Компилировать надо с ключем -Cg (или -fPIC)

    И компилируется тогда нормально.

    2. Но не работает:(

    Компонента в 1С грузится, методы вызываются, но параметры не передаются.

    Все числовые видны в компоненте как VTYPE_EMPTY. Все что ни передашь обратно в 1С — Неопределено.

    Передача строковых параметров приводит к краху 1С.

    Очевидно, есть беда с разрядностью.

    Reply
  10. kirlog

    Проект отличный! Очень нужный, т.к. позволит разработать под линукс компоненты для работы с торговым оборудованием, которых сейчас очень не достает. Их много написано в дельфях и можно было бы портировать без труда.

    Вот, если бы под линуксом x64 заработал бы, цены бы не было.

    Reply
  11. andrewks

    (10) kirlog, конкретно проверял под следующими платформами:

    win x32

    win x64

    linux x32

    под ними всё работает.

    под linux x64 не проверял.

    а какой версией лазарус компилируете?

    Reply
  12. mvernig

    Помогите пожалуйста! Не проходит «ПодключитьВнешнююКомпоненту». В чем может быть причина? Пробовал под разными клиентами, пересобрать, под правами админа… 8.3.5.1383, вин 8-64. Кстати, а почему используете файл SO, а не DLL?

    Reply
  13. andrewks

    (12) mvernig,

    а почему используете файл SO, а не DLL?

    so — это для linux, dll — для windows

    (12) mvernig,

    Не проходит «ПодключитьВнешнююКомпоненту»

    не проходит именно с моей длл-кой, или сами собирали?

    Reply
  14. AlexO

    (0) в общем, эйфория прошла от 8.3, тема ВК тихо умерла?

    Reply
  15. andrewks

    (14) почему умерла?

    Reply
  16. AlexO

    (15) так нет ВК никаких. Посмотрите, что сделали ВК из 7.7: целый отдельный продукт 1С++.

    А что сделали ВК в 8-ке? ))

    Хотя, если вы придерживаетесь идеи, что «в восьмерке все есть и все отлично проработано, поэтому ничего дорабатывать не нужно» — тогда вы правы. Но.

    Но тогда замкнутый круг — о какой нише доработок в 1С8 может идти речь, для которой в принципе понадобится писать ВК ? ))

    Reply
  17. quick

    После мучений с этими ВК пришел к тому, что лучше всего использовать связку SOAP — Внешняя программа. Одну компоненту вообще вынес во внешний бинарник и сделал компоненту которая только делает запуск этой проги без отображения терминала, и анализирует вывод в консоль, но для пользователя все это проходит скрытно. Так я с одной стороны прикрываю лазейки с утечками памяти в процессе 1с, которые приводят к краху процесса сервера, а с другой намного легче тестировать обычное консольное приложение нежели компоненту. Под виндой в большинстве случаев перешел на использование COM обьектов на Python. Это быстро, легко тестируется, не глючит.

    Reply
  18. AlexO

    (17) quick,

    Под виндой в большинстве случаев перешел на использование COM обьектов на Python

    Да уж, очень логично ))

    Reply
  19. AlexO

    (17) quick,

    сделал компоненту которая только делает запуск этой проги без отображения терминала

    А что делает сама компонента?

    Так я с одной стороны прикрываю лазейки с утечками памяти в процессе 1с

    Утечки по какому поводу были?

    обычное консольное приложение

    Что за приложение?

    Reply
  20. quick

    (19) AlexO,

    Утечки были в компоненте под linux x64, да и намешано там было достаточно много сторонних компонент. Все это компилировалось в FreePascal (Code Typhon) и в итоге не всегда, но время от времени что нибудь вылетало и тянуло с собой процесс сервера 1С.

    Компонента о которой я говорю имеет один метод Выполнить(Команда) и возвращала результат выполнения строкой. Если внутри дочернего процесса что то ломалось, то теперь уже не вылетала 1С, я просто получал некое сообщение о ошибке в качестве результата.

    Да и в довесок. Если на питоне сделать СОМ и передать в качестве параметра ссылку на экземпляр класса 1С++ (в 7-ке) или ссылку на обработку/отчет/форму (в 8-ке) то внутри питона можно вызывать методы этого класса, У меня таким образом реализован JSON адаптер который асинхронно оповещает о завершении задачи в celery. Здорово тем что можно вызвать действие, при этом интерфейс 1С остается рабочим, а в COM объекте питона запускается поток с ожиданием, по завершению которого отработает нужный метод. Под линуксом конечно такое не пройдет, все подумываю как бы задействовать HTML контрол для интеграции.. можно же по идее использовать локальный сервер вместо компоненты и jquery…

    Reply
  21. Demanoidos

    Ребята, бросьте в меня этим файлом, у меня нет возможности его скачать, инфостарт просит денег. Заранее благодарю.

    Reply
  22. user1122235

    При работе в серверном контексте, компонента самопроизвольно выгружается из платформы или работает до закрытия пользовательского сеанса, под которым была поднята? Обычно, платформа самопроизвольно выгружает компоненту, как тут?

    Reply
  23. trim89

    Не работает. Выдаёт ошибки. К примеру

    [Error] v8napi_64.pas(505): Operator not applicable to this operand type

    [Error] v8napi_64.pas(505): Pointer type required

    на строке

    Move(ZeroChar, (pMemory#k8SjZc9Dxk + CountByte — SizeOf(WideChar))#k8SjZc9Dxk, SizeOf(WideChar));

    Как решить проблему?

    Reply
  24. kirlog

    Не появилось ли решения тех проблем с архитектурой LINUX_64, что были изначально у данного проекта?

    Там, напомню, все компилировалось, запускалось, но параметры никакие не передавались ни из 1С в компоненту, ни обратно.

    Reply
  25. quick

    Похоже проще начать использовать C++ чем возиться дальше с паскалем.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *