0. v77 147 17.02.11 16:11 Сейчас в теме

ВК NativeAPI на Delphi и FreePascal

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

Перейти к публикации

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

upd. Да, так и есть. Подставил туда _SetLocale - получил параметром строку своей локали. Т.е. я всё правильно понял.
99. andrewks 1273 08.03.13 08:55 Сейчас в теме
(98) Magister, эмм... если я правильно понимаю, то достаточно найти правильный порядок адресов в TV8ProcRec, зачем обёртка?
105. Magister 133 11.03.13 14:58 Сейчас в теме
(99) В принципе можно и так. Просто "обертка" - это "идеологически" правильный путь :)

(100) не поможет, как и написал andrewks
Дело именно в структуре класса в памяти. GCC создает другую структуру, не совместимую с MSVC. И написанное мной выше подтверждает это.
100. v77 147 08.03.13 19:56 Сейчас в теме
(98) Magister, там дело в способе вызова функций. возьми первоначальный модуль и попробуй stdcall заменить на cdecl. вполне возможно, что заработает.
101. andrewks 1273 08.03.13 22:21 Сейчас в теме
(100) это я первым делом проверял - не помогло

меня больше другой вопрос заинтересовал - зачем понадобилось извращаться через пакед рекорды TV8ObjectRec, TV8ProcRec, и почему не работает через интерфейс/класс, как это сделано в родном примере на С++
103. andrewks 1273 10.03.13 11:01 Сейчас в теме
(100) Александр, поскольку линукса у Вас нет, и тема "поднятия" модуля на этой платформе Вам, видимо, не очень интересна, Вы не будете против, если я создам публикацию с форком модуля, посвящённым решению этой проблемы?
104. v77 147 10.03.13 15:55 Сейчас в теме
(103) andrewks, да ради бога. я только за.
106. andrewks 1273 14.03.13 10:24 Сейчас в теме
(104) спасибо. вроде, выстрадал, перелопатил больше половины модуля http://infostart.ru/public/177766/
user1407151; +1 Ответить
102. andrewks 1273 08.03.13 22:40 Сейчас в теме
в родном примере объявляются три интерфейса:
IInitDoneBase, ILanguageExtenderBase, LocaleBase
далее - класс IComponentBase, объединяющий в себе все три этих интерфейса
и конечный юзерский класс уже просто объявляется как наследник IComponentBase
и именно конечный класс потом используется для создания объекта в GetClassObject и помещается в IComponentBase** pInterface
никаких структур, никакого хардкора.
осталось только понять, как это записать на FPC, чтобы родная схема взлетела. в лоб у меня пока не получилось - интерфейсы объявил, класс, объект создаю, возвращаю его 1С, затем - сразу падение. ни один метод не вызывается вопрос отпал, освежил теорию. только извращения через рекорды, или делать отдельную интрефейсную прокси-библиотеку, что, в общем-то, тоже будет извратом
108. v77 147 26.03.13 10:26 Сейчас в теме
1с не разрешает такое делать. Можно только возвратить массив из ВК.
109. MarSeN 974 08.04.13 16:30 Сейчас в теме
(0) v77
Спасибо за шаблон. Полезная штука!
А как можно передать в ВК объект 1С в качестве параметра (к примеру объект метаданных "Метаданные")
110. Magister 133 08.04.13 22:35 Сейчас в теме
(109) Ну почему все так не любят читать документацию?
Почитайте описание NativeAPI от 1С, там всё написано.
Передавать можно только простые типы. Объекты - нет.
111. MarSeN 974 09.04.13 00:32 Сейчас в теме
112. sppr 11.11.13 17:12 Сейчас в теме
Респект автору но у меня из демо примера не работает на веб... на тонком все работает на веб пишет "Тип не определен"... что я не правильно делаю.. заранее спасибо
113. MarSeN 974 07.02.14 23:00 Сейчас в теме
Не могу запустить депо dll на Lazarus. Проект собирается, но длл не грузится. В чем может быть проблема?
Windows 7 64bit
114. bashinsky 127 05.08.14 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, та же ошибка.
Может кто-нибудь помочь?
Прикрепленные файлы:
115. monkbest 105 22.09.14 18:12 Сейчас в теме
Скачал второй архив Вариант для FreePascal (Lazarus). Эта компонента не регистрируется.
У меня Вин 7 64. Надо было первый архив качать?
116. monkbest 105 22.09.14 18:14 Сейчас в теме
для варианта размещения компоненты в общем макете в конфе и её авторегистрацие кодом 1С можете образец написать?
117. v77 147 23.09.14 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.14 09:18 Сейчас в теме
Александр, спасибо за разработку! Просто мегаполезная вешь!
Написал на её основе свою ВК, все замечательно работает и на клиенте, и на сервере.
Сейчас столкнулся вот с какой проблемой: До этого момента сервер 1С Предприятия стоял 32-разрядный на Windows Server 2008 x64, после установки x64 сервера 1C не удается подключить компоненту.
Ошибка происходит только в методах, выполняемых &НаСервере. При попытке вызвать функцию
ПодключитьВнешнююКомпоненту(..., ..., ТипВнешнейКомпоненты.Native)
1С-ка подвисает на несколько секунд, а затем выдает ошибку сетевого доступа.
При этом может выкинуть из программы некоторых пользователей, вне зависимости от того с какой базой они работают.
Если подключать компоненту, скомпилированную под x86, то функция просто возвращает Ложь и работа продолжается. Пробовал подключать компоненту как из файла, так и из общего макета с манифестом - результат всегда один.
При подключении с клиента, функции ВК вызываются как обычно:
_Init
_setMemManager
_SetLocale
_GetInfo
_RegisterExtensionAs
А на сервере эта же последовательность вызывается аж 11 раз, после чего все падает.
Может есть какие мысли по этому поводу? Как можно решить возникшую проблему?
119. v77 147 26.12.14 10:29 Сейчас в теме
(118) Lancer1C, попробуй это http://infostart.ru/public/177766/ там вроде обещают, что везде работает
120. Lancer1C 26.12.14 10:59 Сейчас в теме
(119) Пробовал, правда делал это впопыхах. RAD Studio дико ругалась на тот v8napi, арифметика с указателями ей не нравилась, быстренько поправил, скомпилировал, но в итоге и на клиенте и на сервере ПодключитьВнешнююКомпоненту возвращает Ложь. Может сам чего намудрил, конечно. Лазарусом воспользоваться не смог, т.к. там нет некоторых модулей для моей компоненты.
Пробовал, кстати, скомпилировать простой sample из вашего архива. В результате тоже рвется соединение при попытке подключить компоненту.
121. v77 147 26.12.14 15:14 Сейчас в теме
(120) Lancer1C, у меня нет сервера 1с. Не могу ничем помрчь
122. ALLES 67 04.01.15 21:44 Сейчас в теме
Юзаю demo.dll на Вин7х64. Движок 8.3.5.1383 - Управляемые формы, 1С запущена от имени Одмина. Компонента подключается нормально (возвращает истину), создается объект норм, видно пару его реквизитов. А вот когда идет обращение к первой функции из примера работы с компонентой из 1С: сама 1С вылетает по ошибке. У меня есть свои компоненты написанные по .СОМ - работают норм.. чо не так?

Создал свой длл из шаблона - вроде норм. Работает на стороне сервера в тонком клиенте, что мне и требовалось. Вопрос снят
123. capitan 1631 27.03.15 16:45 Сейчас в теме
Огромное спасибо автору. Да не оскудеет инфостарт такими людьми.
124. MrAndersons 08.04.15 18:01 Сейчас в теме
На 8.3.6 не работает
Прикрепленные файлы:
125. oleg.rizvanov 240 28.04.15 22:57 Сейчас в теме
(124) MrAndersons,

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

На форуме Simplit есть ветка про похожий случай
127. v77 147 06.10.15 14:28 Сейчас в теме
(124) MrAndersons, теперь работает. качайте новый v8napi.pas
126. Demanoidos 60 18.06.15 12:03 Сейчас в теме
Здравствуйте. Каким образом мне скачать эту библиотеку? Я разработчик, но инфостарт требует от меня денег за получение ссылки на закачку бесплатной компоненты.

Может мне кто-то помочь и дать ссылку на эту компоненту?
vvacum; user634897_chukbushmen; +2 Ответить
128. nytlenc 23.10.15 08:18 Сейчас в теме
Хочу свой JabberClient запилить. Как с помощью Вашей компоненты обработать событие при котором поступает входящее сообщение?

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

<Источник>

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

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

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

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

Обработка следующего события возможна только после завершения обработки текущего события.
129. v77 147 23.10.15 11:58 Сейчас в теме
130. nytlenc 12.11.15 17:35 Сейчас в теме
(129) Спасибо!!! Все получилось :)
131. nytlenc 23.12.15 13:45 Сейчас в теме
На сервере x64 не работает...

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

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

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


Прикрепленные файлы:
driver.zip
140. v77 147 10.03.16 09:06 Сейчас в теме
(138) DAN397, в этих "1С: Совместимо" я разбираться не буду, но как минимум одна ошибка у тебя есть: в файле MANIFEST.XML убери component c x86_64, ибо у тебя dll только i386, а если будешь делать dll x86_64, то называй её по другому (например ICSFPNative64.dll).
А так, смотри где сам накосячил. v8napi.pas здесь не причем.
139. DAN397 09.03.16 18:44 Сейчас в теме
Вот забыл добросить картинку.
Прикрепленные файлы:
141. DAN397 10.03.16 11:10 Сейчас в теме
Огромное спасибо за ответ. Буду искать свой косяк.
142. Greysvandir 07.04.16 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. v77 147 07.04.16 18:43 Сейчас в теме
(142) Greysvandir,

AMusThread.Resume вместо AMusThread.Execute;
Greysvandir; +1 Ответить
144. Greysvandir 08.04.16 09:24 Сейчас в теме
(143)

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

На основе Вашей работы 2 года назад сделал библиотеку для работы с специфичным устройством, теперь на 8.3.7 вываливается вышеописанная ошибка. Писал всё на RAD Studio XE. Довольно сложно ваш файл к ней адаптировать.
148. v77 147 20.04.16 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. s0nya 20.04.16 14:31 Сейчас в теме
(148)
Ошибка
[DCC Error] v8napi.pas(553): E2003 Undeclared identifier: 'V8AllocWideString'

нужен еще метод.
150. v77 147 20.04.16 18:42 Сейчас в теме
(149) s0nya, ну найди его в новом файле и скопируй в свой
151. s0nya 21.04.16 11:46 Сейчас в теме
(150) Спасибо, скачал новый файл, он полностью без изменений скормился RAD Studio XE. Ошибок в работе нет, большое спасибо за работу!
203. user1407151 14.05.20 22:10 Сейчас в теме
(148)
Еще надо заменить _RegisterExtensionAs по такому же принципу и все будет работать и со старой версией v8napi.pas
152. PosService 31.07.16 17:48 Сейчас в теме
Не могу понять , есть процедура ExtEvent которая генерирует внешнее событие, если я ее вызываю из 1С, то все хорошо событие генерируется и обрабатывается 1С , если я вызываю ExtEvent из самой компоненты, то компонента вылетает с ошибкой и закрывает платформу.

procedure IFSFDRV.ExtEvent();
begin
v8.ExternalEvent(pWideChar('aaa'), pWideChar('bbb'), pWideChar('ccc'));
end;
153. v77 147 01.08.16 09:32 Сейчас в теме
(152) PosService, ну наверное понаписал ошибок каких нибудь. кода нет, показать ошибку не могу.
154. PosService 01.08.16 10:41 Сейчас в теме
(153)

извиняюсь , вопрос точнее в следующем: Не пойму как вызвать Данную процедуру класса:

type IFSFDRV = class(TV8UserObject)
public
Procedure ExtEvent;
end;

procedure IFSFDRV.ExtEvent();
begin
v8.ExternalEvent(pWideChar('aaa'), pWideChar('bbb'), pWideChar('ccc'));
end;

Я пытыюсь вызвать из другой процедуры

Procedure MyProc;
var
IFSF:IFSFDRV;
Begin
IFSF.ExtEvent();
End;

Получаю ошибку =(( Что-то я забыл походу , а что не пойму.
155. v77 147 01.08.16 14:33 Сейчас в теме
(154) PosService,
"pWideChar('aaa')" это вообще компилится? по логике не должно.

Procedure MyProc;
var
IFSF:IFSFDRV;
Begin
IFSF.ExtEvent();
End;

вообще мура какая то. вызываете метод неинициализорованного объекта
156. PosService 01.08.16 14:55 Сейчас в теме
(155) да, компилится, я пробовал и без указания pWideChar, а как тогда вызвать метод класса из обычной процедуры ? Заранее спасибо.
157. v77 147 01.08.16 18:39 Сейчас в теме
(156) в книжке почитай. Здесь азы программирования не обсуждаются.
158. PosService 02.08.16 00:33 Сейчас в теме
(157) нормально ответить я так понимаю выше вашего достоинства ? Вылетает именно на v8.ExternalEvent('a','b','c'); , все что до этой строки в методе объекта все выполняется.
159. v77 147 02.08.16 08:09 Сейчас в теме
(158) Объясните, что должна делать ваша ВК, высылайте код и я покажу где ошибка.
160. PosService 02.08.16 11:19 Сейчас в теме
(159) unit Main; Ну вот Допустим пример , Из 1с метод ExtEvent вызывается нормально, отрабатывает генерирует внешнее событие , его подхватывает 1с и обрабатывает и все хорошо. Но как только я пытаюсь вызвать метод ExtEvent из самой внешней компоненты таким способом: MyIFSF.ExtEvent(); отрабатывает showmessage('СОБЫТИЕ !!!!'); а дальше краш.

interface

uses
System.SysUtils,
Dialogs,
system.IniFiles,
System.Classes,
COMDRV32,
CRC16,
COMPort,
StringFunc,
LonParser,
v8napi;

type IFSFDRV = class(TV8UserObject)
Public
Procedure OpenPort;
Procedure ClosePort;
Procedure ExtEvent;
end;


var
MyIFSF:IFSFDRV;

implementation

//Вызов внешнего события
Procedure IFSFDRV.ExtEvent();
begin
showmessage('СОБЫТИЕ !!!!');
v8.ExternalEvent('a','b','c');
end;



//Процедура открытия КОМ порта
Procedure IFSFDRV.OpenPort();
begin
COMPort.OpenPort();
end;

//Проведура Закрытия КОМ порты
Procedure IFSFDRV.ClosePort();
begin
ComPort.ClosePort();
end;

end.
161. v77 147 02.08.16 16:05 Сейчас в теме
(160) Ну и где здесь код, который вызывает IFSFDRV.ExtEvent()?
Объясните, что должна делать ваша ВК, высылайте код и я покажу где ошибка.
162. v77 147 02.08.16 16:06 Сейчас в теме
Да и что вы пишите в 1С мне тоже неизвестно. Может там ошибка.
163. v77 147 02.08.16 16:30 Сейчас в теме
Вот пример генерации внешнего события

library demo;

uses
SysUtils, Classes, v8napi;

type
TMyClass = class;

TMyThread = class(TThread)
P: TMyClass;
procedure Execute; override;
end;

TMyClass = class(TV8UserObject)
private
T: TMyThread;
procedure FreeT;
public
Counter: integer;
function Start(Params: PV8ParamArray;
const ParamCount: integer): boolean;
function Stop(Params: PV8ParamArray;
const ParamCount: integer): boolean;
destructor Destroy; override;
constructor Create; override;
end;


{ TMyClass }

constructor TMyClass.Create;
begin
T := nil;
Counter := 0;
TestV := '';
end;

destructor TMyClass.Destroy;
begin
FreeT;
inherited Destroy;
end;

procedure TMyClass.FreeT;
begin
if T <> nil then
begin
T.Terminate;
T.WaitFor;
FreeAndNil(T);
end;
end;

function TMyClass.Start(Params: PV8ParamArray;
const ParamCount: integer): boolean;
begin
Counter := 0;
if T = nil then
begin
T := TMyThread.Create(True);
T.P := self;
T.Resume;
end;
result := True;
end;

function TMyClass.Stop(Params: PV8ParamArray;
const ParamCount: integer): boolean;
begin
FreeT;
result := True;
end;


{ TMyThread }

procedure TMyThread.Execute;
var
S : WideString;
begin
while not Terminated do
begin
inc(P.Counter);
S := IntToStr(P.Counter) + ' привет из Delphi';
P.V8.ExternalEvent('моя вк', 'привет', @S[1]);
sleep(2000);
end;
end;

begin

//Регистрация класса
with ClassRegList.RegisterClass(TMyClass, 'Пример', 'TMyClass') do
begin
AddProc('Start', 'Старт', @TMyClass.Start);
AddProc('Stop', 'Стоп', @TMyClass.Stop);
end;

end.
165. PosService 04.08.16 12:18 Сейчас в теме
(163) , Спасибо , в потоке, так в потоке ) тоже вариант )
166. v77 147 04.08.16 17:06 Сейчас в теме
(165) Ну других вариантов и не бывает. Либо сам вызываешь, либо асинхронно в отдельном потоке.
164. v77 147 02.08.16 16:30 Сейчас в теме
&НаКлиенте
Перем ОбъектВК, ИмяМакета;

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

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

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

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

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные) 	
	Состояние(Данные);
КонецПроцедуры
Показать
167. dreamadv 144 25.10.16 21:37 Сейчас в теме
Киньте в меня v8napi.pas dream_adv@inbox.ru так не кстати закончился баланс (( Автор готов лично отблагодарить.
168. sinas 10.11.16 17:08 Сейчас в теме
помучился прилично с модулем v8napi ... кажется там есть неприятная ошибка ... при вызове методов компоненты им передается не запись на PV8ObjectRec (то есть ссылка на объекты компоненты) а ссылка на сам интерфейс. Например в метод SetLocale передается I3 записи PV8ObjectRec
а вообще автору n8napi низкий поклон (я вспомнил что знаю delphi и не много изучил C++ при проверке исходников на ИТС)
169. mdSerg 03.12.16 19:25 Сейчас в теме
Нет у меня мани - поделитесь плиз без мани.
170. Greysvandir 27.01.17 10:55 Сейчас в теме
Здравствуйте! А не подскажете как надо преобразовать методы внешней компоненты для работы в веб клиенте? Я сделал простейшую компоненту, которая просто выводит текст в строку сообщений 1С, в тонком клиенте работает хорошо, в веб я её преобразовал с помощью примеров и документации 1С (https://its.1c.ru/db/metod8dev/content/3221/hdoc) , сделал расширение для Chrome, подключается она нормально, но при попытке вызвать метод компоненты, выдается ошибка - Использование синхронных методов на клиенте запрещено. Не могу понять что нужно сделать, чтобы браузер считал метод асинхронным. Метод добавлен в класс через AddProc.
171. Greysvandir 30.01.17 19:56 Сейчас в теме
Оказывается ничего в компоненте делать не надо))

Использование внешних компонент в асинхронном режиме имеет ряд особенностей:

1. Подключение внешней компоненты выполняется с помощью асинхронного метода НачатьПодключениеВнешнейКомпоненты().

2. Для обращения к свойствам внешней компоненты следует использовать асинхронные методы НачатьУстановку<ИмяСвойства>() и НачатьПолучение<ИмяСвойства>().

3. Вместо обращения к методу компоненты следует использовать асинхронные методы НачатьВызов<ИмяМетода>().

Методы Начать…() автоматически добавляются платформой к существующим свойствам и методам внешней компоненты. Саму внешнюю компоненту не требуется отдельно перерабатывать для поддержки работы в асинхронном режиме.

Для метода НачатьВызов…() первым параметров следует указывать описание оповещения, а остальные параметры соответствуют набору параметров оригинального метода внешней компоненты.

При использовании веб-браузеров Google Chrome и Mozilla Firefox поддерживается только асинхронное подключение и использование внешних компонент, в том время как для других веб-браузеров допустимо использование как синхронного, так и асинхронного способа работы. Это определяется свойством конфигурации Режим использования синхронных вызовов расширений платформы и внешних компонент
kirillkr; PetrPan; +2 Ответить
172. 7OH 32 31.01.17 14:49 Сейчас в теме
Подскажите, что надо сделать, чтобы передать в компоненту двоичные данные (картинку) ?

Возврат ИЗ компоненты сделал - работает.

V8SetBlob(propValue, PByte(strPicture), Length(strPicture));

а вот при попытке внутрь передать двоичные данные - 1с даже не пытается походу и выдаёт ошибку "Неверный аргумент" и хоть тресни.

173. Greysvandir 31.01.17 18:39 Сейчас в теме
(172) Думаю проще всего преобразовать ДД в Base64 строку и передать как строку, а в компоненте обратно преобразовать. В 1С - Base64Строка(<Значение>), в Delphi - DecodeBase64(<String>)
180. k268kk 12.01.18 18:12 Сейчас в теме
(173) Да ну, не проще. В pstrVal же однобайтовые AnsiChar, приводи к TBytes и ограничь этот массив по V.VarEnum.vtRecString.strLen.
Попробовал записать в файл, все гуд)) и всего 2 строчки кода!
174. 7OH 32 31.01.17 22:15 Сейчас в теме
Так и начал делать.
На стороне делфи затык:

Ss := TStringStream.Create('');
strTmp := DecodeString(V8AsAString(@Params[1]));
Ss.WriteString(strTmp);

jpg := TJPEGImage.Create;
jpg.LoadFromStream(Ss);

---
И тут меня TJpeg посылает, типа это на JPEG не похоже.
А в какой библиотеке взять DecodeBase64 ?
У меня DecodeString из EncdDecd.
175. ImHunter 192 01.02.17 07:47 Сейчас в теме
(174)
Попробуйте в TBitmap загружать.
Я в своей компоненте делаю обратное действие - возвращаю картинку из TBitmap.
  try
    FBitmap.SaveToStream(MS);
    V8SetBlob(RetValue, MS.Memory, MS.Size);
  finally
    MS.Free;
    FBitmap.Free;
  end;
176. Greysvandir 01.02.17 09:23 Сейчас в теме
(174) Может виноват DecodeString. Щас напишу рабочий пример (у меня работает во всяком случае на Delphi 7)
1C:
ДД = Новый ДвоичныеДанные("C:\1111.jpg");
TestPictures.ОтправитьКартинку(Base64Строка(ДД));


Delphi:
// Base64 decoding ( в инете нашел )
function DecodeBase64(const CinLine: string): string;
const
  RESULT_ERROR = -2;
var
  inLineIndex: Integer;
  c: Char;
  x: SmallInt;
  c4: Word;
  StoredC4: array[0..3] of SmallInt;
  InLineLength: Integer;
begin
  Result := '';
  inLineIndex := 1;
  c4 := 0;
  InLineLength := Length(CinLine);

  while inLineIndex <= InLineLength do
  begin
    while (inLineIndex <= InLineLength) and (c4 < 4) do
    begin
      c := CinLine[inLineIndex];
      case c of
        '+'     : x := 62;
        '/'     : x := 63;
        '0'..'9': x := Ord© - (Ord('0')-52);
        '='     : x := -1;
        'A'..'Z': x := Ord© - Ord('A');
        'a'..'z': x := Ord© - (Ord('a')-26);
      else
        x := RESULT_ERROR;
      end;
      if x <> RESULT_ERROR then
      begin
        StoredC4[c4] := x;
        Inc(c4);
      end;
      Inc(inLineIndex);
    end;

    if c4 = 4 then
    begin
      c4 := 0;
      Result := Result + Char((StoredC4[0] shl 2) or (StoredC4[1] shr 4));
      if StoredC4[2] = -1 then Exit;
      Result := Result + Char((StoredC4[1] shl 4) or (StoredC4[2] shr 2));
      if StoredC4[3] = -1 then Exit;
      Result := Result + Char((StoredC4[2] shl 6) or (StoredC4[3]));
    end;
  end;
end;

function AddInTestPictures.SendPicture(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
var
  stream: TStringStream;
  //mstream: TMemoryStream;
  jpg: TJPEGImage;

begin

  stream := TStringStream.Create(DecodeBase64(V8AsAString(@Params[1])));
  {mstream := TMemoryStream.Create;
  mstream.LoadFromStream(stream);
  mstream.SaveToFile('C:\test.jpg');}

  jpg := TJPEGImage.Create;
  jpg.LoadFromStream(stream);
  jpg.SaveToFile('C:\test2.jpg');

  V8SetBool(RetValue, true);
  Result:=true;

end;
Показать


TMemoryStream сделал просто попробовать, сохраняется картинка и test1 и test2.
177. 7OH 32 01.02.17 10:20 Сейчас в теме
(176) Разобрался, спасибо.
Проблема была не в DecodeString.
Проблема оказалась в инициализации Потока и его позиционированием.
DecodeString кстати тоже потоками кодирует строку успешно.
178. 7OH 32 10.02.17 14:08 Сейчас в теме
Кто может помочь - может в личке.
Поставил XE8.
Где-то нелады со строками.
Получаю строку, декодирую функцией выше.
Сохраняю в файл, но файл ни один просмотрщик не принимает.
Если пытаться декодировать через DecodeString или DecodeBase64(вариант родной делфи), то выдаёт No mapping for the Unicode character exists in the target multi-byte code page."
179. 7OH 32 10.02.17 15:29 Сейчас в теме
(178) Решилось через
strPic := TEncoding.Default.GetString(TNetEncoding.Base64.Decode(TEncoding.Default.GetBytes(V8AsAString(@Params[1]))));
181. 7OH 32 05.03.18 18:12 Сейчас в теме
Добрый день.
Не подскажете - как на форме на кнопке реализовать вызов ExternalEvent ?

в модуле проекта как водится
with ClassRegList.RegisterClass(TMyClass, 'ComponentName', 'TMyClass') do
begin
//AddFunc( 'Name', 'Имя', @АдресФункции, КвоПараметров);
//AddProc( 'Name', 'Имя', @АдресФункции, КвоПараметров);
--
Потом открываю форму, что-то делаю, а после закрытия читаю в 1С результаты.
--
Хочется сделать нормально - посылать результаты прямо в 1С.
182. 7OH 32 05.03.18 18:35 Сейчас в теме
(181)
добавил при старте - записываю в переменную у себя на форме - ссылку на входной класс

 function TMyClass.Start(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; var v8: V8AddInDefBase): boolean;
var i : integer;
begin

  Form1 := TForm1.Create(Application);
  frmCapture.PForm1 := @Form1;
  Form1.myV8   := @v8;

---
переменная объявлена в форме
myV8 : TV8AddInDefBase;
---
ну и сам вызов на форме
myV8.ExternalEvent('aaa', 'bbb', 'ccc' );
---
собственно ошибку не вызывает, но и в 1С ничего не приходит.
183. 7OH 32 05.03.18 22:42 Сейчас в теме
(182) хм - пока дошёл домой - подумал.
Заменил
Form1.myV8 := @v8;
на
Form1.myV8 := Self.V8;
---
теперь посылает, но как в примере выше - только после выхода.
Если оно в потоке работает - ща буду думать, как приспособить поток для вызова оповещения по требованию.
184. 7OH 32 05.03.18 23:25 Сейчас в теме
(183) а поток оказался не нужен - просто 1С ждёт ответа - запустилась ли компонента.
А при открытии формы модально в момент старта компоненты - ответа то нет.
Убрал модальное открытие формы - теперь могу из формы посылать события - красотища.
186. Melkij 14.05.18 22:26 Сейчас в теме
Скинте новый v8napi.pas в приват.
Старый на 8.3 отваливается ошибка памяти.

Буду благодарен.
187. KingLion 31.05.18 16:29 Сейчас в теме
Вопрос к автору. Скачал архив из этой раздачи, а в нём как оказалось шаблон компоненты от 2012 года, хотя в описании написано, что в архиве тот же файл модуля. Нельзя ли изменить описание файлов с учётом даты их обновлений? И как мне теперь быть в этой ситуации? Очень не хотелось бы тратить ещё одну стармани для того чтоб повторно качать то, что должно было быть в архиве...
188. kkmprog 25.08.18 22:50 Сейчас в теме
У меня есть модуль от декабря 15 года. Это самая последняя версия библиотеки?
Пытался использовать этот модуль для разработки интеграционной библиотеки для драйвера оборудования, реализованного в виде стандартного сервера автоматизации (т.е. написать прослойку). Вроде все делаю по документации, но при попытке вызвать методы DLL 1С молча вылетает. Компилирую при помощи Delphi 10.1. Вот пример кода:
function TKKTDrv.GetVersion(RetValue: PV8Variant; Params: PV8ParamArray;
  const ParamCount: Integer; var v8: TV8AddInDefBase): Boolean;
begin
  try
    WriteLog('GetVersion...');
    V8SetWString(RetValue, DriverVersion);
    Result := True;
    WriteLog('Result = ' + DriverVersion);
  except
    on e: Exception do
    begin
      V8SetWString(RetValue, ''); // результат функции
      Result := ErrorHandler(Word(c_unknown), e);
    end;
  end;
end;

function TKKTDrv.Open(RetValue: PV8Variant; Params: PV8ParamArray;
  const ParamCount: Integer; var v8: TV8AddInDefBase): Boolean;
var
  s: WideString;
  ecode: Integer;
begin
  ecode := c_unknown;
  try
    WriteLog('Open...');
    if ParamCount <> 1 then
    begin
      ecode := c_param_wrong_num;
      raise Exception.Create(LocStr(c_param_wrong_cnt_en, c_param_wrong_cnt_ru));
    end;
    s := '0123456789'; // ID устройства
    fDeviceId := s;
    V8SetWString(@Params[1], s);
    V8SetBool(RetValue, True); // результат функции
    Result := True;
    WriteLog('Result = 0');
  except
    on e: Exception do
    begin
      V8SetBool(RetValue, False); // результат функции
      Result := ErrorHandler(Word(ecode), e);
    end;
  end;
end;

function TKKTDrv.ErrorHandler(const ResCode: Word; E: Exception): Boolean;
begin
  fLastErrCode := ResCode;
  fLastErrDesc := e.Message;
  WriteLog(Format('Result = %d (%s)', [fLastErrCode, fLastErrDesc]));
  V8SetBool(RetValue, False); // результат функции
  Result := False;
  V8.AddError(ResCode, PWideChar(LocStr(c_ext_comp_en, c_ext_comp_ru)), PWideChar(fLastErrDesc), E_FAIL);
end;

// ...

begin
  with ClassRegList.RegisterClass(TKKTDrv, 'TKKTDrv', 'TKKTDrv') do
   begin
     AddFunc('GetVersion', 'ПолучитьНомерВерсии', @TKKTDrv.GetVersion, 0);
     AddFunc('Open', 'Подключить', @TKKTDrv.Open, 1);
     // ...
end;
Показать


ЧЯДНТ?
189. Viet 20.12.18 12:49 Сейчас в теме
(188) Столкнулся с похожей ситуацией. Подключал компоненту в Розница 2.2. Если я правильно понимаю, 1С опять не выложил половину из новых требований и в момент опроса прослойки идет вызов не процедуры ПолучитьНомерВерсии а процедуры НачатьВызовПолучитьНомерВерсии, описание которого пока нигде не нашел. Если нашли решение - поделитесь пожалуйста
205. user1407151 15.05.20 20:34 Сейчас в теме
(188)
Судя по всему 1С 32 разрядная... а проблема в том, что в объявлениях методов надо убрать последний параметр
; var v8: TV8AddInDefBase

т.е. было:
function TKKTDrv.GetVersion(RetValue: PV8Variant; Params: PV8ParamArray;
  const ParamCount: Integer; var v8: TV8AddInDefBase): Boolean;

стало:
function TKKTDrv.GetVersion(RetValue: PV8Variant; Params: PV8ParamArray;
  const ParamCount: Integer): Boolean;


или, как было сказано где-то здесь же (197), добавить этот параметр в процедуры в v8napi.pas
190. user657734_YGREEN 03.02.19 19:15 Сейчас в теме
Доброго вечера автору. Скачал Lazarus. Скачал примеры. Скомпилировал. Пробую подключить компоненту. и ничего не подключается. В чём может быть дело.
191. user1212971 27.04.19 21:44 Сейчас в теме
Друзья, можете скинуть в личку последний релиз - v8napi.pas от 16.12.2015? Потратил последние деньги на версию с ошибкой "Некорректная работа компоненты с памятью".
192. UncleVader 128 02.05.19 11:10 Сейчас в теме
(191) есть от 2013 года если поможет
писал свои компоненты на Лазарусе, все работало норм
Прикрепленные файлы:
napi_demo.zip
193. user1212971 02.05.19 12:14 Сейчас в теме
194. user657734_YGREEN 06.05.19 22:50 Сейчас в теме
Компонента на компьютере где писалась (Lazarus) нормально подключается. А при переносе не подключается...
ПодключитьВнешнююКомпоненту возвращает Ложь...
Может кто сталкивался с похожей проблемой?
195. user657734_YGREEN 10.05.19 14:15 Сейчас в теме
(194) + Зарегистрировать dll тоже не получается.Пишет модуль найден, но точка входа DLLRegisterServer не найдена.
196. slaviksoft 73 12.11.19 17:42 Сейчас в теме
Пробую подключить компоненту x64 в клиенте x64 - вілетает с дампом при вызове v8.SetEventBufferDepth(FEventBufferDepth);
8.3.16
можете помочь?
197. slaviksoft 73 21.11.19 10:25 Сейчас в теме
(196)
вілетает с дампом при вызове v8.SetEventBufferDepth(FEv


Нашел ошибку.
В процесе обновлений версий модуля автором почему-то потерялось описание var v8: TV8AddInDefBase.

нужно исправить с
_V8CP = function(Obj: TObject; paParams: PV8ParamArray;const lSizeArray: integer): boolean;

на
_V8CP = function(Obj: TObject; paParams: PV8ParamArray; const lSizeArray: integer; var v8: TV8AddInDefBase): boolean;

то же в описаниях _V8CF и _V8PGS.
202. -Denton- 22.04.20 11:43 Сейчас в теме
(197)
новлений версий модуля автором почему-то потерялось описание var v8:

Сделал исправления указанные вами, не помогло.

Платформа: 1С:Предприятие 8.3 (8.3.15.1700)
Ошибки:
--------------------------------------------------------------------------------
Некорректная работа компоненты с памятью


Делал в единственной доступной версии //16.10.2012 исправлена ошибка. добавлены функции для типа Uint
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Новороссийск
зарплата от 70 000 руб.
Полный день

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Специалист 1 категории (Программист 1С ФЗД)
Фрязино
зарплата от 110 000 руб.
Полный день

Специалист 1 категории (Программист 1С)
Фрязино
зарплата от 110 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству