gifts2017

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

Опубликовал andrewks в раздел Программирование - Внешние компоненты

Расширенная версия 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С.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
napi_demo.zip
.zip 77,74Kb
14.03.13
180
.zip 77,74Kb 180 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Стоянов (quick) 29.04.13 09:32
Под виндой компилится х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;
...Показать Скрыть
2. Resha D (Resha) 19.05.13 16:51
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^, SZ);
    V.VarEnum.vtRecWideString.wstrLen := L;
  end;
end;
...Показать Скрыть


Т.е. добавлено (при выделении памяти там уже #0 в первом байте):
if L <> 0 then
3. ras2004a ras2004a (ras2004a) 23.10.13 19:48
4. ras2004a ras2004a (ras2004a) 23.10.13 19:49
Подскажите кто подключал торговое оборудование для linux клиента 1С 8.3, как это сделать?
Есть сканер штрихкода, считыватель карт с магнитной лентой и фискальник штрих-м-фр-к.
Под windows есть драйвер ScanOPOS, для Linux не могу найти аналог.
Для штрих-м-фр-к нашел исходники драйвера, как скомпилировать и завязать с 1С пока непонятно.
5. Дмитрий Башинский (bashinsky) 07.08.14 15:08
При компиляции минимального проекта, который указан в этой публикации, на 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бит.
Может кто-нибудь помочь? подсказать в чем ошибка?
Прикрепленные файлы:
6. andrewks 07.08.14 15:56
(5) а интерфейсный модуль Вы используете оттуда, или из моей публикации?
7. Дмитрий Башинский (bashinsky) 08.08.14 12:28
(6) andrewks, использовал и вашу и из той публикации
8. Дмитрий Башинский (bashinsky) 25.08.14 09:23
(6) andrewks, можете подсказать что-нибудь по данной ошибке?
9. Кирилл Логинов (kirlog) 26.08.14 16:10
Под виндой действительно все отлично!
Но под линуксом x64 (конкретно UBUNTU 12.04 LTS x64) есть проблемы:
1. Компилировать надо с ключем -Cg (или -fPIC)
И компилируется тогда нормально.

2. Но не работает:(
Компонента в 1С грузится, методы вызываются, но параметры не передаются.
Все числовые видны в компоненте как VTYPE_EMPTY. Все что ни передашь обратно в 1С - Неопределено.
Передача строковых параметров приводит к краху 1С.

Очевидно, есть беда с разрядностью.
10. Кирилл Логинов (kirlog) 26.08.14 16:14
Проект отличный! Очень нужный, т.к. позволит разработать под линукс компоненты для работы с торговым оборудованием, которых сейчас очень не достает. Их много написано в дельфях и можно было бы портировать без труда.

Вот, если бы под линуксом x64 заработал бы, цены бы не было.
11. andrewks 26.08.14 17:00
(10) kirlog, конкретно проверял под следующими платформами:
win x32
win x64
linux x32

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

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

а какой версией лазарус компилируете?
12. Михаил (mvernig) 16.01.15 16:35
Помогите пожалуйста! Не проходит "ПодключитьВнешнююКомпоненту". В чем может быть причина? Пробовал под разными клиентами, пересобрать, под правами админа... 8.3.5.1383, вин 8-64. Кстати, а почему используете файл SO, а не DLL?
13. andrewks 20.01.15 11:27
(12) mvernig,
а почему используете файл SO, а не DLL?
so - это для linux, dll - для windows

(12) mvernig,
Не проходит "ПодключитьВнешнююКомпоненту"

не проходит именно с моей длл-кой, или сами собирали?
14. Алекс Ю (AlexO) 23.03.15 16:54
(0) в общем, эйфория прошла от 8.3, тема ВК тихо умерла?
15. andrewks 24.03.15 16:39
16. Алекс Ю (AlexO) 24.03.15 16:51
(15) andrewks, так нет ВК никаких. Посмотрите, что сделали ВК из 7.7: целый отдельный продукт 1С++.
А что сделали ВК в 8-ке? ))
Хотя, если вы придерживаетесь идеи, что "в восьмерке все есть и все отлично проработано, поэтому ничего дорабатывать не нужно" - тогда вы правы. Но.
Но тогда замкнутый круг - о какой нише доработок в 1С8 может идти речь, для которой в принципе понадобится писать ВК ? ))
17. Евгений Стоянов (quick) 27.03.15 12:39
После мучений с этими ВК пришел к тому, что лучше всего использовать связку SOAP - Внешняя программа. Одну компоненту вообще вынес во внешний бинарник и сделал компоненту которая только делает запуск этой проги без отображения терминала, и анализирует вывод в консоль, но для пользователя все это проходит скрытно. Так я с одной стороны прикрываю лазейки с утечками памяти в процессе 1с, которые приводят к краху процесса сервера, а с другой намного легче тестировать обычное консольное приложение нежели компоненту. Под виндой в большинстве случаев перешел на использование COM обьектов на Python. Это быстро, легко тестируется, не глючит.
18. Алекс Ю (AlexO) 27.03.15 13:02
(17) quick,
Под виндой в большинстве случаев перешел на использование COM обьектов на Python
Да уж, очень логично ))
19. Алекс Ю (AlexO) 27.03.15 13:04
(17) quick,
сделал компоненту которая только делает запуск этой проги без отображения терминала
А что делает сама компонента?
Так я с одной стороны прикрываю лазейки с утечками памяти в процессе 1с
Утечки по какому поводу были?
обычное консольное приложение
Что за приложение?
20. Евгений Стоянов (quick) 01.04.15 17:02
(19) AlexO,
Утечки были в компоненте под linux x64, да и намешано там было достаточно много сторонних компонент. Все это компилировалось в FreePascal (Code Typhon) и в итоге не всегда, но время от времени что нибудь вылетало и тянуло с собой процесс сервера 1С.
Компонента о которой я говорю имеет один метод Выполнить(Команда) и возвращала результат выполнения строкой. Если внутри дочернего процесса что то ломалось, то теперь уже не вылетала 1С, я просто получал некое сообщение о ошибке в качестве результата.

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