ВК NativeAPI на Delphi и FreePascal

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

1CNativeLib - бесплатная библиотека Delphi для создания внешних компонент (ВК) 1С по технологии Native API.
Новая версия.
16.12.2015 Исправлена ошибка: поиск свойств и методов ВК выполнялся с учетом регистра букв.
06.10.2015 Исправлена ошибка: сообщение "некорректная работа компоненты с памятью"

 

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

 

Для того, чтобы создать ВК с помощью 1CNativeLib, достаточно создать проект DLL, написать класс с реализацией функционала вашей ВК и зарегистрировать этот класс при загрузке dll. Минимальный проект DLL с реализацией класса с одним методом выглядит так:

 

//-----------------------------------------------------------------

 

library MiniVK;

 

uses

SysUtils, v8napi;

 

type

TMyClass = class(TV8UserObject)

function Hello(RetValue: PV8Variant; Params: PV8ParamArray;

const ParamCount: integer): boolean;

end;

 

{ TMyClass }

 

function TMyClass.Hello(RetValue: PV8Variant; Params: PV8ParamArray;

const ParamCount: integer): boolean;

begin

V8SetWString(RetValue,'Привет из Delphi!'); //устанавливаем результат функции

result := True; //Устанавливаем флаг, что функция завершилась успешно

end;

 

begin

with ClassRegList.RegisterClass(TMyClass, 'MySuperExtention', 'TMyClass') do

begin

AddFunc('Hello', 'Привет', @TMyClass.Hello, 0); //регистрируем функцию

end;

end.

 

//-----------------------------------------------------------------

 

Всё необходимое содержится в одном модуле v8napi.pas. В прилагаемом архиве сам модуль, пример, более подробное описание и шаблон для нового проекта.

 

Файлы

Наименование Файл Версия Размер Кол. Скачив.
1CNativeLib.zip
.zip 44,87Kb
17.10.12
224
.zip 44,87Kb 224 Скачать
Вариант для FreePascal (Lazarus)
.zip 10,42Kb
16.10.12
85
.zip 10,42Kb 85 Скачать
v8napi.pas от 16.12.2015
.pas 39,71Kb
16.12.15
28
.pas 39,71Kb 28 Скачать

См. также

Лучшие комментарии

5. v77 18.02.2011 15:33
На ИТС есть документация и примеры на Си++
+ 1 [ sipoju; ]
# Ответить
143. v77 07.04.2016 18:43
(142) Greysvandir,

AMusThread.Resume вместо AMusThread.Execute;
Ответили: (144)
+ 1 [ Greysvandir; ]
# Ответить

Комментарии

1. slaviksoft (файл скачал) 17.02.2011 16:11
:D
Ответили: (107)
# Ответить
2. slaviksoft (файл скачал) 18.02.2011 09:55
меня интересует - этот модуль на delphi Вы сами писали или это от 1С?
# Ответить
3. v77 18.02.2011 11:11
Сами конечно. Какой смысл выкладывать модуль от 1с?
# Ответить
4. sipoju 18.02.2011 15:22
Извините что не в тему, но мне тяжеловато работать с Делфями :cry:
Есть ли такое же только на С++? (Borland Builder или Visual C++)
# Ответить
5. v77 18.02.2011 15:33
На ИТС есть документация и примеры на Си++
+ 1 [ sipoju; ]
# Ответить
6. DrAku1a (файл скачал) 21.02.2011 04:20
Возможно ли использование на FPC+Lazarus?
И еще - было бы неплохо и для v77 аналогичный ВК-класс сделать.
# Ответить
7. v77 21.02.2011 08:22
DrAku1a пишет:

Возможно ли использование ?
И еще - было бы неплохо и для v77 аналогичный ВК-класс сделать.

Для FPC+Lazarus надо допиливать. Сходу не заработало, но заработает.
Для v77 можно сделать, но вроде как уже и так хватает.
# Ответить
8. i-man (файл скачал) 15.05.2011 21:31
есть возможность как то передавать не простые данные в ВК, а ссылки на элементы справочников или документов и уже внутри ВК с этими элементами работать?
если можно примерчик небольшой

спасибо заранее
Ответили: (10)
# Ответить
9. v77 17.05.2011 11:44
Нету такой возмоности. В NativeAPI такое не предусмотрено.
Ответили: (13) (17)
# Ответить
10. cool.vlad4 (файл скачал) 17.05.2011 11:50
(8) зачем? для этого 1С есть...
# Ответить
11. romix (файл скачал) 01.08.2011 11:14
Проверил однако работает! Спасибо!
# Ответить
12. romix (файл скачал) 01.08.2011 18:15
Компонента на основе этой с полезным функционалом, которого отчасти не хватало в 1С 8.2 http://infostart.ru/public/88060/ (запуск процесса, переключение раскладки и др.).
# Ответить
13. UncleVader (файл скачал) 01.08.2011 19:33
(9) Я так понимаю что не предусмотрен возврат и ссылок на таблицу значений или на какую другую коллекцию значений?
Ответили: (17) (18) (19)
# Ответить
14. johnrex (файл скачал) 16.09.2011 07:18
Скажите, пожалуйста, возможно ли с использованием NativeApi организовать поток (Delphi), который будет независимо выполнять определенные действия, и генерить в нужных ситуациях внешнее событие в 1С 8. В моем случае нужно опрашивать весы подключенные к com порту с периодичностью хотя бы раз в секунду и если они подключены при изменении веса отсылать данные в 1С. Обработчик ожидания не устраивает, так как 1С работает однопоточно и очень сильно висит при опросе com порта.
Ответили: (16)
# Ответить
15. Sergey_Murzinov (файл скачал) 04.10.2011 22:58
Спасиюо, толковая работа
# Ответить
16. zag2art (файл скачал) 21.10.2011 19:51
(14) точно можно
# Ответить
17. zag2art (файл скачал) 23.10.2011 19:19
(9) тот же вопрос, что и в (13) ответьте пожалуйста.
# Ответить
18. v77 23.10.2011 22:33
19. v77 23.10.2011 22:35
(13) Можно передавать только простые типы данных и вернуть из ВК двоичные данные. Вроде всё пока. Остальное 1С блокирует.
# Ответить
20. mur611 (файл скачал) 25.10.2011 14:05
Здравствуйте,
Пробовал по примеру писать NativeAPI компоненту, но почему то не воспринимает функции, пишет "Поле объекта не обнаружено (Hello)". Или v8napi.pas от http://infostart.ru/public/88060/ не подходит для самого простого примера. А вообще стоит задача написать внешнюю компоненту для общения с COM портом. и используя ваш пример можно написать данную ВК?
Ответили: (22)
# Ответить
21. mur611 (файл скачал) 25.10.2011 14:09
есть конечно примеры на CPP, но времени разбирать с Visual большого нет.
# Ответить
22. v77 26.10.2011 12:01
(20) видимо где то чего то неправильно понаписал. У всех работает нормально, жалоб не было.
# Ответить
23. mur611 (файл скачал) 03.11.2011 12:52
есть вопрос. Заключается он в том, что в ВК на технологии СОМ обработка ошибок во ВК производилась функцией RaiseLastOSError и все работает ОК, а вот теперь вроде сделал на Native API, и при вызове данной функции ВК, 1Ска закрывается (вылетает). какие методы есть решения? не подскажете.
Ответили: (24)
# Ответить
24. v77 03.11.2011 13:32
(23) mur611,
V8.AddError(wcode: word; const source: PWideChar;
const descr: PWideChar;
scode: integer): boolean;

см. документацию от 1С
# Ответить
25. igor_kav (файл скачал) 26.03.2012 10:47
есть вопрос, как вернуть массив? входные параметры функции - число, строка, а вот вернуть функция должна массив или olevariant, каа быть?
Ответили: (26)
# Ответить
26. Spi1y 26.03.2012 11:19
(25) igor_kav, только генерировать строку с внутренним представлением любой коллекции (массив, структура, список значений, и т.д.), а в 1С уже преобразуешь с помощью ЗначениеИзСтрокиВнутр(). К сожалению, я не смог найти ни одного внятного описания структуры внутреннего представления ТаблицыЗначений, а по всем остальным коллекциям формат довольно простой.
Сам на основе данного шаблона делал компоненту для внутреннего использования, с возвратом из функции массива. Если нужно, напиши, кину пример кода.
# Ответить
27. Spi1y 26.03.2012 11:26
Вот как раз и пример со структурой, у массива формат еще проще:

  pwi.cbSize := SizeOf(pwi);
  if WindowHandle <> 0 then begin
    Result := GetWindowInfo(WindowHandle, pwi);
    if Result then begin
      ResultString := '{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,{4,{{"S","Лево"},{"N",';
      ResultString := ResultString + IntToStr(pwi.rcWindow.Left) + '}},{{"S","Верх"},{"N",';
      ResultString := ResultString + IntToStr(pwi.rcWindow.Top) + '}},{{"S","Ширина"},{"N",';
      ResultString := ResultString + IntToStr(pwi.rcWindow.Right - pwi.rcWindow.Left) + '}},{{"S","Высота"},{"N",';
      ResultString := ResultString + IntToStr(pwi.rcWindow.Bottom - pwi.rcWindow.Top) + '}}}}';
    end else
      ResultString := '{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,{0}}';
    end;
    V8SetWString(RetValue, ResultString);
...Показать Скрыть
# Ответить
28. igor_kav (файл скачал) 26.03.2012 11:28
было бы здорово готовый код глянуть. скиньте, пожалуйста, на мыло igor_kav@mail.ru
спасибо!
# Ответить
29. igor_kav (файл скачал) 26.03.2012 11:29
спасибо! пока писал коммент, Вы уже выложили.
# Ответить
30. igor_kav (файл скачал) 26.03.2012 11:36
а как быть с многомерным массивом?
# Ответить
31. Spi1y 26.03.2012 12:10
Кхм, понятия не имею. Честно говоря, ни разу за всю практику не сталкивался с необходимостью использования многомерных массивов. Но, если размышлять логически, то сам формат представления для массива таков:

{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,{КоличествоЭлементов,{ОписаниеКлюча1, ОписаниеЗначения1}, ... , {ОписаниеКлючаN, ОписаниеЗначенияN}}}

где ОписаниеКлючаN и ОписаниеЗначенияN:
{ОписаниеТипа,Значение}


Логично предположить, что если описание тпа подставить Массив, и а в значение - внутреннюю строку вложенного массива, то должно получиться то, что нужно.

Но надо проверять, конечно. Попозже гляну.
# Ответить
32. Spi1y 26.03.2012 12:17
Извиняюсь, как говориться, поспешишь - людей насмешишь. В предыдущем сообщении спутал понятия массивы и структуры. Массив разобрал, еще проще выходит:

{"#",51e7a0d2-530b-11d4-b98a-008048da3034,{КоличествоЭлементов,{ОписаниеЗначения1}, ... , {ОписаниеЗначенияN}}}

И действительно, для вложенных массивов достаточно в описание значения вместо строки {ОписаниеТипа,Значение} передать строку {ОписаниеМассива}, сформированную аналогично.
# Ответить
33. igor_kav (файл скачал) 26.03.2012 16:58
Spi1y, Спасибо! ОЧЕНЬ помогли!
# Ответить
34. Spi1y 26.03.2012 17:25
Всегда пожалуйста :)
# Ответить
35. igor_kav (файл скачал) 30.03.2012 16:55
Пару функций удалось сделать и использовать в 1С, но написал третью функцию в dll... при попытке использования в 1с именно этой третьей функции, 1с вылетает с ошибкой "Программа 1Сv8 не работает Возникшая проблема привела к прекращению работы программы. бла-бла". Самое интересное, что для тестирования создал проект VLC на delphi, поместил в него код функции. В VLC-проекте ФУНКЦИЯ РАБОТАЕТ!

Какие есть варианты решения?
Ответили: (36)
# Ответить
36. v77 30.03.2012 17:17
(35) igor_kav, покажи код
# Ответить
37. igor_kav (файл скачал) 30.03.2012 17:24

library aukro_soap;

uses
  SysUtils,
  Classes,
  DateUtils,
  InvokeRegistry,
  Rio,
  SOAPHTTPClient,
  v8napi,
  uploader;

{$R *.res}

type

TMyClass = class(TV8UserObject)
  private
     RIO           : THTTPRIO;
     country_id    : Integer;
     local_version : Int64;
  public
    function doLogin(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
    function getMyData(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
    function getCatsList(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
    constructor Create; override;
end;

{ TMyClass }

function TMyClass.doLogin(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
var
  user_login          : string;
  user_password       : string;
  webapi_key          : string;
  info                : string;
  ver_key             : Int64;
  session_handle_part : string;
  user_id             : Int64;
  server_time         : Int64;
begin
  // получаем параметры функции
  user_login    := V8AsAString(@Params[1]);
  user_password := V8AsAString(@Params[2]);
  webapi_key    := V8AsAString(@Params[3]);

  try
    (RIO as AllegroWebApiPortType).doQuerySysStatus(local_version, country_id, webapi_key, info, ver_key);
    (RIO as AllegroWebApiPortType).doLogin(user_login, user_password, country_id, webapi_key, ver_key, session_handle_part, user_id, server_time);

    V8SetWString(RetValue, session_handle_part); // устанавливаем результат функции
    result := True;
  except
    result := False;
  end;
end;

// ФУНКЦИЯ НЕ РАБОТАЕТ !!! СКОРЕЕ ВСЕГО УТЕЧКА ПАМЯТИ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ STRING
function TMyClass.getMyData(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
var
  session_handle_part    : string;
  user_data              : UserDataStruct;
  invoice_data           : InvoiceDataStruct;
  company_extra_data     : CompanyExtraDataStruct;
  company_second_address : CompanySecondAddressStruct;
  pharmacy_data          : PharmacyDataStruct;
  alcohol_data           : AlcoholDataStruct;
  related_persons        : RelatedPersonsStruct;
  ResultString           : WideString;
begin
  // получаем параметры функции
  session_handle_part    := V8AsAString(@Params[1]);
  // инициализируем переменные
  user_data              := UserDataStruct.Create;
  invoice_data           := InvoiceDataStruct.Create;
  company_extra_data     := CompanyExtraDataStruct.Create;
  company_second_address := CompanySecondAddressStruct.Create;
  pharmacy_data          := PharmacyDataStruct.Create;
  alcohol_data           := AlcoholDataStruct.Create;
  related_persons        := RelatedPersonsStruct.Create;

  try
    (RIO as AllegroWebApiPortType).doGetMyData(session_handle_part, user_data, invoice_data, company_extra_data,
                                               company_second_address, pharmacy_data, alcohol_data, related_persons);

    ResultString := '{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,{22,';
    ResultString := ResultString + '{{"S","user_id"},{"N",'+IntToStr(user_data.user_id)+'}},';
    ResultString := ResultString + '{{"S","user_login"},{"S","'+user_data.user_login+'"}},';
    ResultString := ResultString + '{{"S","user_rating"},{"N",'+IntToStr(user_data.user_rating)+'}},';
    ResultString := ResultString + '{{"S","user_first_name"},{"S","'+user_data.user_first_name+'"}},';
    ResultString := ResultString + '{{"S","user_last_name"},{"S","'+user_data.user_last_name+'"}},';
    ResultString := ResultString + '{{"S","user_maiden_name"},{"S","'+user_data.user_maiden_name+'"}},';
    ResultString := ResultString + '{{"S","user_company"},{"S","'+user_data.user_company+'"}},';
    ResultString := ResultString + '{{"S","user_country_id"},{"N",'+IntToStr(user_data.user_country_id)+'}},';
    ResultString := ResultString + '{{"S","user_state_id"},{"N",'+IntToStr(user_data.user_state_id)+'}},';
    ResultString := ResultString + '{{"S","user_postcode"},{"S","'+user_data.user_postcode+'"}},';
    ResultString := ResultString + '{{"S","user_city"},{"S","'+user_data.user_city+'"}},';
    ResultString := ResultString + '{{"S","user_address"},{"S","'+user_data.user_address+'"}},';
    ResultString := ResultString + '{{"S","user_email"},{"S","'+user_data.user_email+'"}},';
    ResultString := ResultString + '{{"S","user_phone"},{"S","'+user_data.user_phone+'"}},';
    ResultString := ResultString + '{{"S","user_phone2"},{"S","'+user_data.user_phone2+'"}},';
    ResultString := ResultString + '{{"S","user_ss_status"},{"N",'+IntToStr(user_data.user_ss_status)+'}},';
    ResultString := ResultString + '{{"S","site_country_id"},{"N",'+IntToStr(user_data.site_country_id)+'}},';
    ResultString := ResultString + '{{"S","user_junior_status"},{"N",'+IntToStr(user_data.user_junior_status)+'}},';
    ResultString := ResultString + '{{"S","user_birth_date"},{"N",'+IntToStr(user_data.user_birth_date)+'}},';
    ResultString := ResultString + '{{"S","user_has_shop"},{"N",'+IntToStr(user_data.user_has_shop)+'}},';
    ResultString := ResultString + '{{"S","user_company_icon"},{"N",'+IntToStr(user_data.user_company_icon)+'}},';
    ResultString := ResultString + '{{"S","user_is_allegro_standard"},{"N",'+IntToStr(user_data.user_is_allegro_standard)+'}}}}';

    V8SetWString(RetValue, ResultString); // устанавливаем результат функции
    result := True;
  except
    result := False;
  end;
end;

function TMyClass.getCatsList(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;
var
  webapi_key    : string;
  cats_list     : ArrayOfCats;
  ver_key       : Int64;
  ver_str       : string;
  CurrCats      : CatInfoType;
  ResultString  : WideString;
begin
  // получаем параметры функции
  webapi_key    := V8AsAString(@Params[1]);
  // инициализируем переменные
  CurrCats      := CatInfoType.Create;

  try
    (RIO as AllegroWebApiPortType).doGetCatsData(country_id, local_version, webapi_key, cats_list, ver_key, ver_str);

    // формируем массив из структур для 1С, затем в 1С необходимо использовать функцию "ЗначениеИзСтрокиВнутр()"
    ResultString := '{"#",51e7a0d2-530b-11d4-b98a-008048da3034,{'+IntToStr(Length(cats_list));
    for CurrCats in cats_list do
    begin
      ResultString := ResultString + ',{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,{4,{{"S","cat_id"},{"S","'+IntToStr(CurrCats.cat_id)+'"}},';
      ResultString := ResultString + '{{"S","cat_name"},{"S","'+CurrCats.cat_name+'"}},';
      ResultString := ResultString + '{{"S","cat_parent"},{"S","'+IntToStr(CurrCats.cat_parent)+'"}},';
      ResultString := ResultString + '{{"S","cat_position"},{"S","'+IntToStr(CurrCats.cat_position)+'"}}}}';
    end;
    ResultString := ResultString + '}}';

    V8SetWString(RetValue, ResultString); // устанавливаем результат функции
    result := True;
  except
    result := False;
  end;
end;

constructor TMyClass.Create;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.WSDLLocation := 'http://webapi.allegro.pl/uploader.php?wsdl';
  RIO.Service      := 'AllegroWebApiService';
  RIO.Port         := 'AllegroWebApiPort';

  country_id       := 209; // 209 - Украина; 228 - Neverland (webapi) для тестового сервиса http://testwebapi.pl
  local_version    := 1;
end;


begin

  with ClassRegList.RegisterClass(TMyClass, 'MySuperExtention', 'TMyClass') do
  begin
    // регистрируем функции
    AddFunc('doLogin',         'Авторизироваться',        @TMyClass.doLogin,         3);
    AddFunc('getMyData',       'ПолучитьМоиДанные',       @TMyClass.getMyData,       1);
    AddFunc('getCatsList',     'ПолучитьСписокКатегорий', @TMyClass.getCatsList,     1);
  end;

end.
...Показать Скрыть
# Ответить
38. igor_kav (файл скачал) 30.03.2012 18:10
поставил исключение в процедуре _CallAsFunc и получил ошибку:

Внешняя компонента : Invalid pointer operation.
Ошибка! {Форма.Форма.Форма(473)}: Ошибка при вызове метода контекста (ПолучитьМоиДанные): Ошибка внешней компоненты
Ответили: (39)
# Ответить
39. v77 30.03.2012 18:35
(38) ну вроде всё правильно. смотри в отладчике.
# Ответить
40. igor_kav (файл скачал) 30.03.2012 18:40
а как отладить dll?
# Ответить
41. igor_kav (файл скачал) 30.03.2012 18:53
Прочитал, что СКОРЕЕ ВСЕГО УТЕЧКА ПАМЯТИ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ STRING, но как решить ума не приложу...

Кто сталкивался, ПОМОГИТЕ!
Ответили: (42)
# Ответить
43. igor_kav (файл скачал) 31.03.2012 01:25
выдает ошибку External exception C000001D на строке:
(RIO as AllegroWebApiPortType).doGetMyData(session_handle_part, user_data, invoice_data, company_extra_data,
                                             company_second_address, pharmacy_data, alcohol_data, related_persons);


Но только в DLL, в EXE все нормально работает. В чем же все-таки причина?
Ответили: (45)
# Ответить
44. igor_kav (файл скачал) 31.03.2012 15:01
Можно ли передать функции параметр типа ТаблицаЗначений или XDTO пакет и как его потом в delphi разобрать?
# Ответить
45. v77 31.03.2012 16:39
(43) причина в ошибке. надо смотреть в отладчике. вышли мне исходники, я гляну. у тебя delphi 7?
Ответили: (46)
# Ответить
46. igor_kav (файл скачал) 31.03.2012 16:44
(45) спасибо! :) ошибку нашел! все, как всегда, было банально просто. RIO не освобождал.
Спасибо за проделанную работу, очень нужную вещь ВК NativeAPI на Delphi создали.
Ответили: (47)
# Ответить
47. v77 31.03.2012 16:50
(46) да наздоровье
# Ответить
48. 0xe0 05.07.2012 14:04
Александр, из компоненты (*в вашей реализации) есть возможность обращаться к методам интерфейса 1С?
# Ответить
49. EmpireSer (файл скачал) 10.08.2012 01:34
Объясните мне - зачем нужна структура "ТV8ObjectRec" ?
# Ответить
50. vladon (файл скачал) 25.09.2012 15:46
На сервере x64 не работает, к сожалению. Ковыряю-ковыряю код, не пойму, в чём дело.
# Ответить
51. v77 26.09.2012 08:34
Я на 64 не пробовал. Может так заработает(см. прикрепленный файл)
Ответили: (52)

Прикрепленные файлы:

v8napi.zip
# Ответить
52. vladon (файл скачал) 26.09.2012 15:22
(51) v77, это из оригинальных исходников от Александра Соломатина? Нет, тоже не получается.
Ответили: (54) (55)
# Ответить
53. v77 26.09.2012 15:55
Ну у меня нету сервера 64. пока ничем не могу помочь.
# Ответить
54. v77 26.09.2012 15:56
(52) vladon, а на клиенте 64 работает?
Ответили: (56)
# Ответить
55. v77 26.09.2012 15:59
(52) vladon, а как не работает? в чем компилировалось?
# Ответить
56. vladon (файл скачал) 26.09.2012 16:01
(54) v77, клиента 64 же не существует.

компилировалось Delphi XE2 и Delphi XE3.
Ответили: (57)
# Ответить
57. v77 26.09.2012 21:22
(56) vladon, ну и как не работает то. в чем это не работает проявляется?
Ответили: (58)
# Ответить
58. vladon (файл скачал) 26.09.2012 22:34
(57) v77, вот здесь лежит архив со всеми исходниками: http://narod.ru/disk/61615376001.5ca45c99a6ebdc7d919aa57124f0aa7b/SocketNative.zip.html

в каталоге 1С есть .dt-шник, это база, где в общий макет залиты dll-ки с манифестом в зипе, dll-ки откомпилены delphi xe3, в любом случае все исходники там же

и есть обработка, которая запускает подключение компоненты на сервере

так вот, на 32-бит сервере компонента подключается - всё нормально отрабатывает
на 64-бит сервере при нажатии кнопки "Подключить компоненту" сервер долго-долго думает, а потом клиент вылетает с сообщением, что сервер принудительно закрыл подключение.

в любом случае, если есть возможность, попробуйте сами.
Ответили: (59)
# Ответить
59. v77 29.09.2012 23:56
(58) vladon, попробуй такой вариант. у меня вроде работает. на сервере не проверял(нету у меня). проверял тестовой программой, которая загружает dll и читает список методов и свойств ВК. старая твоя ВК не грузилась, теперь стала грузиться. в архиве вариант модуля v8napi.pas. отпишись заработало или нет.
# Ответить
60. v77 29.09.2012 23:57
файл
Ответили: (61)

Прикрепленные файлы:

SocketNative64.zip
# Ответить
61. vladon (файл скачал) 01.10.2012 08:50
(60) v77, огромное спасибо, работает.
# Ответить
62. andrewks (файл скачал) 20.10.2012 21:36
какова лицензия на исходный код? возможно ли его использование в проектах под лицензией GPL v2/3?
# Ответить
63. v77 22.10.2012 10:19
Да используйте где хотите.
Ответили: (64)
# Ответить
64. andrewks (файл скачал) 23.10.2012 09:14
(63) v77, не сочтите за наглость, но, так сказать, во избежание возможных недоразумений, можно при следующем обновлении в программных модулях указать тип лицензии на исходный код? например, Apache 2.0 (наиболее предпочтительная и либеральная), X11, или Modified BSD (неограниченное использование). или двойную лицензию GPL v2 и GPL v3 (на выбор пользователя).

хотим тут один небольшой проектик замутить на базе модуля для FreePascal под лицензией GPL v2, в целях экономии времени на рутину хотим использовать Ваш модуль ;-)

спасибо.
# Ответить
65. eoego1 (файл скачал) 20.11.2012 17:55
Мегаценная вещь, спасибо автору большое! Но возник вопрос, мне очень нужно сделать так, чтобы во время работы какой либо одной функции вызванной по nativeapi из 1С, произошла передача данных (к примеру установка свойства формы или генерация внешенего события с передачей данных в 1С). Например:

//процедура вызываемая из 1С
function TMyClass.SleepFunc(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
var
ms: Integer;
begin
ms := V8AsInt(@Params[1]); // к примеру 100.000
//тут хочу вызвать исключение в 1С и передать в него строку "Привет я пошел спать!" или как-то иначе
sleep(ms);
//допустим тут еще раз хочу вызвать исключение
//или установить свойство заголовка на форме или переменной модуля 1С. "Привет я проснулся!"
result := True; //завершается вызванная функция
end;
После некоторых исследований, было установлено, что к примеру если вызвать во время работы функции sleep (или любой другой) функцию, например, вызова внешнего события, то оно генерируется не в то время, где я вызываю ExternalEvent, а только по выходу из основной функции. То есть у меня никак не получается передавать в 1С, например строку промежуточного результата работы функции во время ее работы. Все уходит в 1С только по выходу из нее. Как решить подобную задачу?
# Ответить
66. andrewks (файл скачал) 26.11.2012 17:38
в модуле для FPC не нашёл функцию V8SetPWideChar ( возврат в 1С строки, представленной в FPC типом PWideChar )

дописал. может, кому, пригодится:
function TV8UserObject.V8SetPWideChar(V: PV8Variant;
  Value: PWideChar): boolean;
var
  L, SZ: longword;
begin

  result := (Value = nil);
  if result then
    Exit;

  V8ClearVar(V);
  V.vt := VTYPE_PWSTR;
  L := Length(Value);
  SZ := (L + 1) * SizeOf(WideChar);

  result := V8MM.AllocMemory(@(V.VarEnum.vtRecWideString.pwstrVal), SZ);
  if result then
  begin
    Move(Value^, V.VarEnum.vtRecWideString.pwstrVal^, SZ);
    V.VarEnum.vtRecWideString.wstrLen := L;
  end;
end;

...Показать Скрыть
# Ответить
67. andrewks (файл скачал) 29.11.2012 23:45
в модуле для FPC ошибка в function _GetParamDefValue, вызывающая падение в случае, если параметры по умолчанию не заданы, а 1с видит, что методу передано меньше параметров и пытается запросить параметр по умолчанию

правильный вариант кода:

function _GetParamDefValue(Obj: PV8ObjectRec; const lMethodNum,
  lParamNum: integer; pvarParamDefValue: PV8Variant): boolean; stdcall;
var
ind: integer;
begin
  result := False;
  if Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams <> nil then
  begin
    for ind := 0 to length(Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values)-1 do
    begin
      if (Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values[ind].Num = lParamNum) then
      begin
        pvarParamDefValue^ := Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values[ind].Value;
        result := True;
      end;
    end;
  end;
end;

...Показать Скрыть
Ответили: (68)
# Ответить
68. v77 30.11.2012 09:11
(67) andrewks, Спасибо. Исправлю.
# Ответить
69. andrewks (файл скачал) 19.12.2012 21:23
что-то не ясен момент: в описании технологии Native API сказано, что BLOB (Двоичные данные) могут только возвращаться из компоненты в 1С, про передачу BLOB из 1С в компоненту ничего не сказано. при попытке передать ДвоичныеДанные в параметре метода 1С ругается на неверный параметр (до компоненты даже дело не доходит).
однако в Вашем модуле есть функция по получению BLOB V8AsBlob(). У Вас получилось передать ДвоичныеДанные в компоненту? не поделитесь рецептом?
Ответили: (70)
# Ответить
70. v77 20.12.2012 08:29
(69) andrewks, я не помню, что пробовал. ну если не дает, то значит нельзя. А V8AsBlob() наверное на всякий случай сделал.
# Ответить
71. fixin 20.12.2012 18:07
А в 81 работает?
Ответили: (72)
# Ответить
72. andrewks (файл скачал) 11.01.2013 08:25
(71) fixin, в 8.1 нет NativeAPI
# Ответить
73. UncleVader (файл скачал) 24.01.2013 12:12
Раз уж добавили поддержку Lazarus, может попробуем и под Linux скомпилить?
Вот тут есть готовая виртуальная машина с установленным Lazarus, попробовал в нем скомпилить выложенную демку, но она не подключается в контексте сервера 1С под x64 Ubuntu. Есть мысли? Спасибо!
Ответили: (75) (78)
# Ответить
74. v77 24.01.2013 12:30
Мыслей нет. А что нибудь другое подключается в контексте сервера 1С под x64 Ubuntu?
Ответили: (76)
# Ответить
75. andrewks (файл скачал) 24.01.2013 12:34
(73) UncleVader, там же написано, что под Android
Ответили: (76)
# Ответить
76. UncleVader (файл скачал) 24.01.2013 12:44
(74) v77, У меня нет к сожалению ни одной ВК под linux, поэтому трудно сказать, дал бы кто попробовать...
(75) andrewks, ну и что, главное что стоит настроенный Lazarus и компилит, в т.ч. и приложенный тут пример ВК
Ответили: (77)
# Ответить
77. andrewks (файл скачал) 24.01.2013 12:48
(76) UncleVader, я к тому, что если у Вас есть доступ к серваку с убунтой х64, то, может, стоит скомпилить прямо на нём? у меня на ноуте стоит убунта, но она там х32
Ответили: (78)
# Ответить
78. UncleVader (файл скачал) 24.01.2013 12:57
(77) andrewks, Чтоб на нем скомпилить туда надо поставить Lazarus, а для меня это китайская грамота ((
Во вложении скомпиленная в упомянутой (73) системе, попробуйте может у Вас подключится

Прикрепленные файлы:

libdemo.so
# Ответить
79. UncleVader (файл скачал) 24.01.2013 17:23
Поставил 64 Ubuntu, на него Lazarus, скомпилил пример - на сервере не подключается ((
# Ответить
80. Magister (файл скачал) 10.02.2013 02:39
удалено
# Ответить
81. SerG_121 (файл скачал) 11.02.2013 13:53
Почему когда я создаю поток у меня вылетает ошибка? В чем проблема? Код в прекрепленных файлах

Прикрепленные файлы:

1cComPort.rar
# Ответить
82. v77 11.02.2013 14:11
Ну ты в отладчике посмотри где глючит. А ProcessMessages тебе зачем? Поставь вместо ProcessMessages sleep(0) для начала.
Ответили: (83)
# Ответить
83. SerG_121 (файл скачал) 11.02.2013 15:39
(82)Я так и со слипом пробовал бесполезно! Попробуй у себя проверить мой код.
Выдает ошибку и вылетает 1с именно когда запускается поток ReadThread
Ответили: (84) (85)
# Ответить
84. andrewks (файл скачал) 11.02.2013 16:12
(83) SerG_121, видимо, у Вас исключение вылетает. попробуйте в try/except и выводить лог, может, прояснится
# Ответить
85. v77 11.02.2013 16:46
(83) SerG_121, Ты создаешь объект в 1с. Выполняешь его метод ОткрытьПорт. В методе ОткрытьПорт создается поток, который использует объект. Но объект после выполнения ОткрытьПорт автоматически убивается, но в потоке к нему есть обращение в Execute. Обращение к несуществующему объекту. Наверное по этому и глючит.
Ответили: (86)
# Ответить
86. SerG_121 (файл скачал) 12.02.2013 07:38
(85)Может подскажешь как реализовать?
# Ответить
87. v77 12.02.2013 08:38
А чего надо реализовать?
Ответили: (88)
# Ответить
88. SerG_121 (файл скачал) 12.02.2013 08:47
(87)Спасибо большое все разобрался )
# Ответить
89. TamDE (файл скачал) 26.02.2013 20:11
Собрал ВК в Lazarus.
Нашел небольшой глюк: если передать в функцию ФункцияПривет2 пустые строки, то платформа "валится"
//Рез = Об.ФункцияПривет2("Раз","Два");
Рез = Об.ФункцияПривет2("","");

Обошел путем добавления условия
    
if L > 0 then

перед строкой
       
Move(Value[1], V.VarEnum.vtRecWideString.pwstrVal^, SZ);

в методе V8SetWString
Ответили: (93)
# Ответить
90. Magister (файл скачал) 04.03.2013 01:39
В Linux таки не работает.
Платформа грузит .so, вызывает несколько функций и валится по SIGSEGV.
Вот что успевает вызвать:
[quote]
GetClassNames
GetClassObject
_setMemManager
_GetInfo
[/quote]
После этого падение. Пока причину понять не смог, может быть будут идеи?
Ответили: (91)
# Ответить
91. v77 04.03.2013 08:58
(90) Magister, есть идея посмотреть в отладчике. линуксов у меня нету.
Ответили: (92)
# Ответить
92. Magister (файл скачал) 05.03.2013 01:48
(91) Отладчик ловит исключение, и в качестве адреса показывает нулевые адреса. Бред полный :)
Ещё немного поразбирался - судя по всему причина в том, что под Linux 1С компилируется с использованием GCC, а у него виртуальная таблица методов в памяти имеет другую структуру.
Получается что "грязный" хак, с помощью которого вообще работает эта библиотека не срабатывает, т.к. TV8ProcRec не соответствует IComponentBase.

Пока что удалось добиться таки вызова RegisterExtensionAs добавлением парочки пустых полей с типом Pointer, но теперь другая проблема - V8MM.AllocMemory() возвращает false...
Ответили: (94) (97)
# Ответить
93. andrewks (файл скачал) 05.03.2013 08:30
(89) TamDE, что-то не так в Вашем королевстве.
1. эта функция отвечает за возвращаемые значения, а не за передаваемые
2. L не может быть равно 0
3. у меня падения на пустых строках нет
# Ответить
94. andrewks (файл скачал) 05.03.2013 08:35
(92) Magister, а Вы на какой платформе, и на каком дистре лин тестируете?
Ответили: (95)
# Ответить
95. Magister (файл скачал) 05.03.2013 18:43
(94) Ubuntu 12.10 x32, 1C 8.3.2 x32 файловая.
На Windows с тем же релизом 1С всё хорошо.
Ответили: (96)
# Ответить
96. andrewks (файл скачал) 07.03.2013 22:10
(95) Magister, немного наблюдений:

в Win 1с вызывает функции в таком порядке:
Initialization
GetClassObject()
_Init()
_setMemManager()
_SetLocale()
_GetInfo()
_RegisterExtensionAs()
...
_Done()
DestroyObject()
Finalization

в Lin:
Initialization
GetClassObject()
_setMemManager()
_GetInfo()
далее - падение до захода в _RegisterExtensionAs()

почему-то в линуксе обходится стороной _Init()
# Ответить
97. andrewks (файл скачал) 08.03.2013 00:00
(92) Magister, похоже, проблема с менеджером памяти. только у меня при попытке вызова AllocMemory() - сразу крах. пытаюсь в _setMemManager() вызвать AllocMemory() - в винде успешно, память выделяется, в лин - сразу крах.

что-то с описанием интерфейса, может? соглашение о вызове, думаю, тут ни при чём
# Ответить
98. Magister (файл скачал) 08.03.2013 04:24
Просто структура класса не такая получается. Компилятор другой - вот и всё, баста.
Думаю, правильным путем было бы создание "обертки" на C++, которая бы уже общалась с FreePascal. Иначе гиблое это дело, как мне кажется...
Сейчас вот добился вызова методов:
[quote]GetClassNames
GetClassObject
_Init
_setMemManager
_RegisterExtensionAs[/quote]
Вот откуда тут _RegisterExtensionAs? Ведь, судя по логике, должен быть _SetLocale.
Вывод - в том месте, где у нас находится _RegisterExtensionAs, должен находится _SetLocale.
Это, в принципе, объясняет и падение на RegisterExtensionAs - т.к. SetLocale по параметрам отличается.

upd. Да, так и есть. Подставил туда _SetLocale - получил параметром строку своей локали. Т.е. я всё правильно понял.
Ответили: (99) (100)
# Ответить
99. andrewks (файл скачал) 08.03.2013 08:55
(98) Magister, эмм... если я правильно понимаю, то достаточно найти правильный порядок адресов в TV8ProcRec, зачем обёртка?
Ответили: (105)
# Ответить
100. v77 08.03.2013 19:56
(98) Magister, там дело в способе вызова функций. возьми первоначальный модуль и попробуй stdcall заменить на cdecl. вполне возможно, что заработает.
Ответили: (101) (103) (105)
# Ответить
101. andrewks (файл скачал) 08.03.2013 22:21
(100) v77, это я первым делом проверял - не помогло

меня больше другой вопрос заинтересовал - зачем понадобилось извращаться через пакед рекорды TV8ObjectRec, TV8ProcRec, и почему не работает через интерфейс/класс, как это сделано в родном примере на С++
# Ответить
102. andrewks (файл скачал) 08.03.2013 22:40
в родном примере объявляются три интерфейса:
IInitDoneBase, ILanguageExtenderBase, LocaleBase
далее - класс IComponentBase, объединяющий в себе все три этих интерфейса
и конечный юзерский класс уже просто объявляется как наследник IComponentBase
и именно конечный класс потом используется для создания объекта в GetClassObject и помещается в IComponentBase** pInterface
никаких структур, никакого хардкора.
осталось только понять, как это записать на FPC, чтобы родная схема взлетела. в лоб у меня пока не получилось - интерфейсы объявил, класс, объект создаю, возвращаю его 1С, затем - сразу падение. ни один метод не вызывается вопрос отпал, освежил теорию. только извращения через рекорды, или делать отдельную интрефейсную прокси-библиотеку, что, в общем-то, тоже будет извратом
# Ответить
103. andrewks (файл скачал) 10.03.2013 11:01
(100) Александр, поскольку линукса у Вас нет, и тема "поднятия" модуля на этой платформе Вам, видимо, не очень интересна, Вы не будете против, если я создам публикацию с форком модуля, посвящённым решению этой проблемы?
Ответили: (104)
# Ответить
104. v77 10.03.2013 15:55
(103) andrewks, да ради бога. я только за.
Ответили: (106)
# Ответить
105. Magister (файл скачал) 11.03.2013 14:58
(99) В принципе можно и так. Просто "обертка" - это "идеологически" правильный путь :)

(100) не поможет, как и написал andrewks
Дело именно в структуре класса в памяти. GCC создает другую структуру, не совместимую с MSVC. И написанное мной выше подтверждает это.
# Ответить
106. andrewks (файл скачал) 14.03.2013 10:24
(104) v77, спасибо. вроде, выстрадал, перелопатил больше половины модуля http://infostart.ru/public/177766/
# Ответить
107. babybu 26.03.2013 10:09
А может кто подскажет, можно ли в функцию ВК, написанную по NativeAPI, передавать массив или может структуру? И как это делать? В HasRetVal определил метод, как функцию, в GetNParams задал количество параметров данного метода - 1. Метод называется "Подключить". Если передаю скалярный параметр - все нормально (Компонента.Подключить(1)), а если пытаюсь передать массив или структуру (Компонента.Подключить(Массив)) - выдает ошибку в 1С - неверный аргумент.
# Ответить
108. v77 26.03.2013 10:26
1с не разрешает такое делать. Можно только возвратить массив из ВК.
# Ответить
109. MarSeN (файл скачал) 08.04.2013 16:30
(0) v77
Спасибо за шаблон. Полезная штука!
А как можно передать в ВК объект 1С в качестве параметра (к примеру объект метаданных "Метаданные")
Ответили: (110)
# Ответить
110. Magister (файл скачал) 08.04.2013 22:35
(109) Ну почему все так не любят читать документацию?
Почитайте описание NativeAPI от 1С, там всё написано.
Передавать можно только простые типы. Объекты - нет.
Ответили: (111)
# Ответить
111. MarSeN (файл скачал) 09.04.2013 00:32
(110) Magister
спасибо )
# Ответить
112. sppr (файл скачал) 11.11.2013 17:12
Респект автору но у меня из демо примера не работает на веб... на тонком все работает на веб пишет "Тип не определен"... что я не правильно делаю.. заранее спасибо
# Ответить
113. MarSeN (файл скачал) 07.02.2014 23:00
Не могу запустить депо dll на Lazarus. Проект собирается, но длл не грузится. В чем может быть проблема?
Windows 7 64bit
# Ответить
114. bashinsky (файл скачал) 05.08.2014 15:45
При компиляции проекта, который указан в публикации, на 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бит, также пробовал с компонентой от andrewks, та же ошибка.
Может кто-нибудь помочь?

Прикрепленные файлы:

Безымянный.png
# Ответить
115. monkbest 22.09.2014 18:12
Скачал второй архив Вариант для FreePascal (Lazarus). Эта компонента не регистрируется.
У меня Вин 7 64. Надо было первый архив качать?
# Ответить
116. monkbest 22.09.2014 18:14
для варианта размещения компоненты в общем макете в конфе и её авторегистрацие кодом 1С можете образец написать?
Ответили: (117)
# Ответить
117. v77 23.09.2014 10:11
(116) monkbest,

Загрузка ВК из макета в 1С 8.3

1. Создаем ВК. Например "demo.dll"

2. Создаем файл "manifest.xml" файл с таким содержанием

<?xml version="1.0" encoding="UTF-8" ?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component os="Windows" path="demo.dll" type="native" arch="i386" />
</bundle>

3. Пакуем "demo.dll" и "manifest.xml" в zip-архив

4. Создаем в конфигурации общий макет с именем "ТестВК" и загружаем в него наш zip-архив

5. Пишем где надо примерно такой код:

//это пример загрузки ВК, которая генерирует внешнее событие
&НаКлиенте
Перем ОбъектВК, ИмяМакета;

&НаКлиенте
Процедура Старт(Команда)
//ПодключитьВнешнююКомпоненту("C:\temp\external_event\testVK

\demo.dll","DemoLib",AddInType.Native);
ИмяМакета = "ОбщийМакет.ТестВК";
Если НЕ ПодключитьВнешнююКомпоненту(ИмяМакета,"DemoLib",AddInType.Native) Тогда
НачатьУстановкуВнешнейКомпоненты(Новый ОписаниеОповещения("ЗагрузкаВК",

ЭтотОбъект),ИмяМакета);
Возврат;
КонецЕсли;
СоздатьОбъектВК();
КонецПроцедуры

&НаКлиенте
Процедура СоздатьОбъектВК()
ОбъектВК = Новый("AddIn.DemoLib.Пример");
ОбъектВК.Старт();
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузкаВК(Парам) экспорт
Если ПодключитьВнешнююКомпоненту(ИмяМакета,"DemoLib",AddInType.Native) Тогда
СоздатьОбъектВК();
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Стоп(Команда)
ОбъектВК.Стоп();
ОбъектВК = Неопределено;
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Состояние(Данные);
КонецПроцедуры
# Ответить
118. Lancer1C 26.12.2014 09:18
Александр, спасибо за разработку! Просто мегаполезная вешь!
Написал на её основе свою ВК, все замечательно работает и на клиенте, и на сервере.
Сейчас столкнулся вот с какой проблемой: До этого момента сервер 1С Предприятия стоял 32-разрядный на Windows Server 2008 x64, после установки x64 сервера 1C не удается подключить компоненту.
Ошибка происходит только в методах, выполняемых &НаСервере. При попытке вызвать функцию
ПодключитьВнешнююКомпоненту(..., ..., ТипВнешнейКомпоненты.Native)
1С-ка подвисает на несколько секунд, а затем выдает ошибку сетевого доступа.
При этом может выкинуть из программы некоторых пользователей, вне зависимости от того с какой базой они работают.
Если подключать компоненту, скомпилированную под x86, то функция просто возвращает Ложь и работа продолжается. Пробовал подключать компоненту как из файла, так и из общего макета с манифестом - результат всегда один.
При подключении с клиента, функции ВК вызываются как обычно:
_Init
_setMemManager
_SetLocale
_GetInfo
_RegisterExtensionAs
А на сервере эта же последовательность вызывается аж 11 раз, после чего все падает.
Может есть какие мысли по этому поводу? Как можно решить возникшую проблему?
Ответили: (119)
# Ответить
119. v77 26.12.2014 10:29
(118) Lancer1C, попробуй это http://infostart.ru/public/177766/ там вроде обещают, что везде работает
Ответили: (120)
# Ответить
120. Lancer1C 26.12.2014 10:59
(119) Пробовал, правда делал это впопыхах. RAD Studio дико ругалась на тот v8napi, арифметика с указателями ей не нравилась, быстренько поправил, скомпилировал, но в итоге и на клиенте и на сервере ПодключитьВнешнююКомпоненту возвращает Ложь. Может сам чего намудрил, конечно. Лазарусом воспользоваться не смог, т.к. там нет некоторых модулей для моей компоненты.
Пробовал, кстати, скомпилировать простой sample из вашего архива. В результате тоже рвется соединение при попытке подключить компоненту.
Ответили: (121)
# Ответить
121. v77 26.12.2014 15:14
(120) Lancer1C, у меня нет сервера 1с. Не могу ничем помрчь
# Ответить
122. ALLES (файл скачал) 04.01.2015 21:44
Юзаю demo.dll на Вин7х64. Движок 8.3.5.1383 - Управляемые формы, 1С запущена от имени Одмина. Компонента подключается нормально (возвращает истину), создается объект норм, видно пару его реквизитов. А вот когда идет обращение к первой функции из примера работы с компонентой из 1С: сама 1С вылетает по ошибке. У меня есть свои компоненты написанные по .СОМ - работают норм.. чо не так?

Создал свой длл из шаблона - вроде норм. Работает на стороне сервера в тонком клиенте, что мне и требовалось. Вопрос снят
# Ответить
123. capitan (файл скачал) 27.03.2015 16:45
Огромное спасибо автору. Да не оскудеет инфостарт такими людьми.
# Ответить
124. MrAndersons 08.04.2015 18:01
На 8.3.6 не работает
Ответили: (125) (127)

Прикрепленные файлы:

img0.png
img1.png
# Ответить
125. oleg.rizvanov (файл скачал) 28.04.2015 22:57
(124) MrAndersons,

Похоже, в 8.3.6.х ошибка в memManager-е

На форуме Simplit есть ветка про похожий случай
# Ответить
126. Demanoidos 18.06.2015 12:03
Здравствуйте. Каким образом мне скачать эту библиотеку? Я разработчик, но инфостарт требует от меня денег за получение ссылки на закачку бесплатной компоненты.

Может мне кто-то помочь и дать ссылку на эту компоненту?
# Ответить
127. v77 06.10.2015 14:28
(124) MrAndersons, теперь работает. качайте новый v8napi.pas
# Ответить
128. nytlenc (файл скачал) 23.10.2015 08:18
Хочу свой JabberClient запилить. Как с помощью Вашей компоненты обработать событие при котором поступает входящее сообщение?

ОбработкаВнешнегоСобытия(<Источник>, <Событие>, <Данные>)
Параметры:

<Источник>

Тип: Строка.
Источник события.
<Событие>

Тип: Строка.
Наименование события.
<Данные>

Тип: Строка.
Данные для события.
Описание:

Возникает при посылке внешним приложением сообщения, сформированного в специальном формате. Внешнее событие сначала обрабатывается всеми открытыми формами, имеющими процедуру-обработчик этого события, а затем может быть обработано в процедуре-обработчике модуля управляемого приложения (модуля обычного приложения).
Примечание:

Обработка следующего события возможна только после завершения обработки текущего события.
Ответили: (129)
# Ответить
129. v77 23.10.2015 11:58
(128) nytlenc, V8.ExternalEvent(,,);
Ответили: (130)
# Ответить
130. nytlenc (файл скачал) 12.11.2015 17:35
(129) v77, Спасибо!!! Все получилось :)
# Ответить
131. nytlenc (файл скачал) 23.12.2015 13:45
На сервере x64 не работает...

x32 пробовал только файловый вариант ИБ, (сервер приложений не тестил), в файловой ИБ x32 вызываю процедуру "ПодключитьВнешнююКомпоненту()", возвращает истину, выгружаю базу на сервер приложений x64 - там возвращает ложь:

&НаСервере
Процедура СоздатьНаСервере()
        ПодключитьВнешнююКомпоненту("ОбщийМакет.Jabber", "Jabber", ТипВнешнейКомпоненты.Native); // Файловая ИБ x32 = Истина; Сервер приложений x64 = Ложь
КонецПроцедуры
...Показать Скрыть
Ответили: (132)
# Ответить
132. v77 23.12.2015 18:42
(131) nytlenc, ну я твою ВК не видел. я так ничего сказать не могу. Вышли, я гляну.
Ответили: (133)
# Ответить
133. nytlenc (файл скачал) 24.12.2015 03:55
(132) v77, Прошу прощения, сам баран (не иначе) скомпилировал проект под Win32 и еще хочу, чтобы он под Win64 поехал. Все работает, спасибо. Извините за беспокойство. :) И еще раз спасибо Вам за бесценную вещь в виде v8napi!!!
# Ответить
134. 7OH 25.12.2015 01:01
Не хватает реализации метода SetPlatformCapabilities
Похоже, что без него запустить компоненту можно только в клиенте 1С.
Под IE или FireFox постоянно кричит, что клиент не поддерживается.
Функция должна вернуть доступные возможности, а её нет.
Можете доделать ?
Ответили: (135)
# Ответить
135. v77 25.12.2015 09:26
(134) 7OH, да вроде есть там такая функция. Я правда не понимаю, что это такое, но на всякий случай написал как в примере от 1с..

function SetPlatformCapabilities(const capabilities: integer): integer; cdecl;
begin
result := 1;
end;
# Ответить
137. frkbvfnjh (файл скачал) 03.03.2016 20:38
Вообще слов нет! Просто бомба. Спасибо тебе автор за это произведение искусства! А главное, что ты продолжаешь поддержку своего детища, другие годами не обновляют свои шаблоны внешних компонент. И главное, что разработка на Delphi - в наше время все меньше людей которые пишут на Delphi. Даже на ИТС примеров на Delphi уже не делают :( Очень печально, хотя новый Delphi вновь набирает обороты. Продолжай развивать данную разработку.
# Ответить
138. DAN397 09.03.2016 18:42
Добрый день!
Написал вот свой класс драйвера для ФР по правилам "1С: Совместимо" на Delphi с использованием модуля v8napi.pas. Подключаюсь толстым клиентом к локальной ИБ.
При попытке установить драйвер в 1С 8.3 (Управление торговлей 11.2), из файла указываю путь к zip-архиву с драйвером. Manifest.xml и Info.xml бодро подхватываются и видно информацию о драйвере. Дальше вот наблюдаю такую картину: при подключении драйвера пишет в самой нижней строке красным шрифтом: Не установлен на текущем компьютере. Не определен тип: AddIn.ICSFPNative.ICSFP_V2. При нажатии кнопки "Функции - > Установить драйвер" выдаёт сообщение "Внешняя компонента уже подключена".
Может кто подскажет куда копать? Может у меня старый модуль n8api (2011 год)?
Ответили: (140)

Прикрепленные файлы:

driver.zip
img-02.jpg
img-03.jpg
# Ответить
139. DAN397 09.03.2016 18:44
Вот забыл добросить картинку.

Прикрепленные файлы:

img-03.jpg
# Ответить
140. v77 10.03.2016 09:06
(138) DAN397, в этих "1С: Совместимо" я разбираться не буду, но как минимум одна ошибка у тебя есть: в файле MANIFEST.XML убери component c x86_64, ибо у тебя dll только i386, а если будешь делать dll x86_64, то называй её по другому (например ICSFPNative64.dll).
А так, смотри где сам накосячил. v8napi.pas здесь не причем.
# Ответить
141. DAN397 10.03.2016 11:10
Огромное спасибо за ответ. Буду искать свой косяк.
# Ответить
142. Greysvandir 07.04.2016 14:40
Здравствуйте! А не подскажите как можно реализовать в компоненте параллельный поток?

Я в компоненте описываю класс:
TMusThread = class(TThread)
    procedure Execute; override;
  public
    Notes: String;
    Speaker: boolean;
  end;
...Показать Скрыть


Затем в функции, которую вызываю из 1С, создаю экземпляр этого класса и запускаю:
function VSMusic.PlayMusic(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
begin
 AMusThread := TMusThread.Create(true);
 AMusThread.FreeOnTerminate := true;
 AMusThread.Priority := tpNormal;
 AMusThread.Notes := V8AsAString(@Params[1]);
 AMusThread.Speaker := V8AsBool(@Params[2]);
 AMusThread.Execute;
 Result:=true;
end;
...Показать Скрыть


Но интерфейс 1С всё равно подвисает до тех пор пока не закончится выполнение этого доп потока. Не подскажите что я делаю не так или в 1С вообще нельзя сделать доп поток? У меня платформа 8.3.7.2008. К слову, я сделал приложение на делфи, которое делает то же самое и там поток нормально работает, ничего не виснет.
Ответили: (143)
# Ответить
143. v77 07.04.2016 18:43
(142) Greysvandir,

AMusThread.Resume вместо AMusThread.Execute;
Ответили: (144)
+ 1 [ Greysvandir; ]
# Ответить
144. Greysvandir 08.04.2016 09:24
(143) v77,

Большое спасибо! Никогда бы не догадался попробовать Resume вместо Execute. Я всегда думал что Execute запускает поток, а Resume используется только после Suspend. И в Delphi то ведь работает через Execute, это что-то 1Ской обусловлено?
Ответили: (145)
# Ответить
145. v77 08.04.2016 13:19
(144) Greysvandir, а где написано, что Execute запускает поток? Я такого нигде не встречал.
Ответили: (146)
# Ответить
146. Greysvandir 11.04.2016 12:38
(145) v77,
Я помню когда учился потоки использовать читал статью чью-то и там было написано что запуск потока через Exucute. Сейчас тоже погуглил всё поновой, видимо я просто всегда ошибался. Еще раз большое спасибо!
# Ответить
147. s0nya (файл скачал) 20.04.2016 08:17
v77, подскажите, что влияет на
06.10.2015 Исправлена ошибка: сообщение "некорректная работа компоненты с памятью"

На основе Вашей работы 2 года назад сделал библиотеку для работы с специфичным устройством, теперь на 8.3.7 вываливается вышеописанная ошибка. Писал всё на RAD Studio XE. Довольно сложно ваш файл к ней адаптировать.
Ответили: (148)
# Ответить
148. v77 20.04.2016 13:41
(147) s0nya, попробуй заменить эти функции

function _GetPropName(Obj: PV8ObjectRec; lPropNum, lPropAlias: integer)
: PWideChar; stdcall;
begin
if lPropAlias = 0 then
result := Obj.RelObj1.V8AllocWideString(Obj.RelObj1.ClassReg.PropList[lPropNum].PropName)
else
result := Obj.RelObj1.V8AllocWideString(Obj.RelObj1.ClassReg.PropList[lPropNum].PropNameLoc);
end;

function _GetMethodName(Obj: PV8ObjectRec; const lMethodNum,
lMethodAlias: integer): PWideChar; stdcall;
begin
if lMethodAlias = 0 then
begin
result := Obj.RelObj1.V8AllocWideString(Obj.RelObj1.ClassReg.MethList[lMethodNum].MethName);
end
else
begin
result := Obj.RelObj1.V8AllocWideString(Obj.RelObj1.ClassReg.MethList[lMethodNum].MethNameLoc);
end;
end;
Ответили: (149)
# Ответить
149. s0nya (файл скачал) 20.04.2016 14:31
(148) v77,
Ошибка
[DCC Error] v8napi.pas(553): E2003 Undeclared identifier: 'V8AllocWideString'

нужен еще метод.
Ответили: (150)
# Ответить
150. v77 20.04.2016 18:42
(149) s0nya, ну найди его в новом файле и скопируй в свой
Ответили: (151)
# Ответить
151. s0nya (файл скачал) 21.04.2016 11:46
(150) v77, Спасибо, скачал новый файл, он полностью без изменений скормился RAD Studio XE. Ошибок в работе нет, большое спасибо за работу!
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл