ВК 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 не будет опубликован. Обязательные поля помечены *