Вход | Регистрация
 

Не работает ВК 1С в программе, написанной на Delphi или VBA

Не работает ВК 1С в программе, написанной на Delphi или VBA
Я
   MWWRuza
 
07.05.19 - 20:28
Добрый день!
Не нашел, в какую тему написать, пишу сюда, хоть и не совсем в тему...
Есть некая внешняя компонента 1С, это драйвер ККТ Спарк-115-Ф. Написана на С++, по технологии 1С:Совместимо.
Абсолютно адекватно работает под 7.7, ну и естественно под 8.х. Понадобилось завести этот ККТ из под программы на VBA... Облом! Падает при попытке подключить ККТ... Странно, вроде обычный ActivX объект, с чего-бы? Делал не я, но все "у меня на виду". Решил попробовать сам. Так, как VBA для меня мало-знаком, решил попробовать на Delphi.
В общем-то, ничего хитрого... Вот фрагмент кода:

procedure TForm1.FormCreate(Sender: TObject);
begin
//  m_Spark:= CoSpark115F.Init;
  m_Spark:= CoSpark115F.Create;
end;

procedure TForm1.Connect(Sender: TObject);
var
  IDDevice, bstrVersion: WideString;
  Res, Rezultat, Port, Speed: Integer;

begin
  Res:= m_Spark.OdinS_GetVersion(bstrVersion);
  InfVer.Caption:= bstrVersion;

  m_Spark.OdinS_SetParameter('EquipmentType', 'ККТ', Rezultat);

  Port:= StrToInt(nPort.Text);
  Speed:= StrToInt(tSpeed.Text);
  m_Spark.OdinS_SetParameter('ComPort', Port, Rezultat);
  m_Spark.OdinS_SetParameter('Скорость', Speed, Rezultat);
  m_Spark.OdinS_SetParameter('Пароль', '111111', Rezultat);

// m_Spark.OdinS_SetParameter('LogEnabled', 1, Rezultat);
//    m_Spark.OdinS_SetParameter('DailyLogEnabled', 1, Rezultat);
//    m_Spark.OdinS_SetParameter('DailyLogLifeTime', 7, Rezultat);
//    m_Spark.OdinS_SetParameter('PathLog', 'c:\Spark\', Rezultat);

  Res:= m_Spark.OdinS_Open(IDDevice, Rezultat);
end;

Получаю почему-то такое:
https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/i-271.jpg
Получается, объект драйвера создается, доступен из программы(иначе версия драйвера бы не выводилась), но падает в ошибку при попытке подключиться к ККТ... Еще раз повторюсь - примерно то-же самое, но в 1С работает нормально.
В чем может быть причина? ActiveX ВК 1С не совсем "правильный" с точки зрения винды, а какой-то свой, "особенный" - ??? Можно как-то это обойти, или совсем глухо?

PS В принципе, под Спарк есть другой, "Универсальный" драйвер, ничего общего с технологией 1С:Совместимо не имеющий. Он работает из под чего угодно - и из любой 1С, и из Delphi, и из под VBA... Но, в нем нет поддержки тега 1162(маркировка)... И не известно, будет-ли когда-то, в обозримом будущем, так-как основные пользователи(заказчики) этого драйвера, для которых он создавался, маркируемым товаром не торгуют...
 
 
   Garykom
 
1 - 07.05.19 - 20:31
(0) Посоветуйте затолкать этот спарк в одно место тому кто его выбирал и покупал.

Взамен купите атол или хотя бы штрих-м.
   MWWRuza
 
2 - 07.05.19 - 20:37
(1)Позиция ясна... Но, советовать некому, так сложилось. У меня их много, и никуда от них не деться. Под 1С с ними проблем нет. Все работает. Вопрос в том - можно ли заставить работать ВК по технологии 1С:Совместимо, из под другой программы, или 1С:Совместимо - это диагноз и приговор...
   H A D G E H O G s
 
3 - 07.05.19 - 20:37
IDDevice, bstrVersion: WideString;

поменяйте на

IDDevice, bstrVersion: String;
   MWWRuza
 
4 - 07.05.19 - 20:44
(3)Пробовал. Изначально. Пишет про неверный тип значения параметра.
Да и в описании функции, которое автоматом при подключении компонента создается, само прописывается:

function OdinS_Open(out pbstrDeviceID: WideString; out pboolSuccess: Integer): HResult; stdcall;

Если только поменять и там и там? Сейчас попробую...
   NorthWind
 
5 - 07.05.19 - 20:44
(3) после 2007-й версии все ещё есть разница?
   MWWRuza
 
6 - 07.05.19 - 20:48
+(4)Не... Не работает: [Error] Spark115F_DRV_2003Lib_TLB.pas(422): Types of actual and formal var parameters must be identical
   H A D G E H O G s
 
7 - 07.05.19 - 20:48
(5) Ну так WideString убивается Дельфей после выхода переменной за область видимости, я предположил, что и ВК-шка тоже это делает.
   H A D G E H O G s
 
8 - 07.05.19 - 20:49
(6) А скинь в какой нибудь гугл диск проект дельфей
   MWWRuza
 
9 - 07.05.19 - 20:51
bstrVersion - вот это то работает с WideString, версия драйвера получается...

(8)Сейчас скину на майл.ру облако , вместе с драйвером...
   MWWRuza
 
10 - 07.05.19 - 20:54
 
 Рекламное место пустует
   Garykom
 
11 - 07.05.19 - 21:15
TLB на основе DLL сами генерили?

А внятного описания ВК нет?
   Garykom
 
12 - 07.05.19 - 21:16
Откуда вы ее добыли то?
   Garykom
 
13 - 07.05.19 - 21:17
(0) >Но, в нем нет поддержки тега 1162(маркировка)

А там случаем нет поддержки произвольных тегов?
   Garykom
 
14 - 07.05.19 - 21:18
(13)+ В смысле неких процедур/функций где номер тега указывается в коде.
   H A D G E H O G s
 
15 - 07.05.19 - 21:19
(10) А как в 1С с ней работаете?
По ощущениям tlb кривая.
   H A D G E H O G s
 
16 - 07.05.19 - 21:27
Даже не tlb, а реализация интерфейса в самой dll
   H A D G E H O G s
 
17 - 07.05.19 - 21:27
Поэтому надо через IDispatch, как в 1С.
   NorthWind
 
18 - 07.05.19 - 21:27
(10) а если не секрет, зачем так сложно сделали обращение и почему было впрямую не воспользоваться компонентной оберткой TSpark115F?
   MWWRuza
 
19 - 07.05.19 - 21:37
Отлучился на пять минут :-))) По порядку.
(11) Да. Внятного описания нет, посылают на это: https://its.1c.ru/db/metod8dev#content:4829:hdoc:chapter270
(12) Непосредственно в ККС.
(13) Есть. Но только вне строк чека. Перед и после "таблицы чека", типа в "шапке" и "подвале". Что касается печати самих строк чека, то только так: Spark.Item2(Количество, Цена, Номенклатура, СтавкаНДС, ПредметРасчета, СпособРасчета).
(15)Вот я демку под 7.7 делал: https://cloud.mail.ru/public/2pXu/28nHa38Yu я тоже думаю, что tlb криво сгенерился, потому, что сам интерфейс длл кривой...
(17), (18) - банально не умею, опыта не хватает... Может есть какой-нибудь наглядный пример, как правильно сделать?
   dmpl
 
20 - 07.05.19 - 21:39
(4) Первое, что я бы проверил - это https://ru.wikipedia.org/wiki/Соглашение_о_вызове
   H A D G E H O G s
 
21 - 07.05.19 - 21:41
(19) "Абсолютно адекватно работает под 7.7, ну и естественно под 8.х."

Ну вот можно пример того, что в Дельфи вы написали, только на 1С
   Garykom
 
22 - 07.05.19 - 21:44
(19) "GoodCodeData" по формату 1С попробовать.
Найдите вменяемый пример как 1С эту dll-ВК вызывает.
   Garykom
 
23 - 07.05.19 - 21:47
(22)+ Хотя понял уже пробовали
   Garykom
 
24 - 07.05.19 - 21:48
(23)+ Во 3 атрибута внутри GoodCodeData
StampType string
Тип маркировки. Список значений:
"02" – изделия из меха
"03" – лекарственные препараты
Stamp string Контрольный идентификационный знак (КиЗ)
GTIN string Глобальный идентификатор торговой единицы (GTIN)

https://github.com/shtrih-m/javapos_shtrih/blob/master/Source/android/tinyJavaPosTester/src/com/shtrih/jpos1c/xml/check/GoodCodeData.java
   Garykom
 
25 - 07.05.19 - 21:49
(24)+ StampType = "05" далее сами думайте может и взлетит
   MWWRuza
 
26 - 07.05.19 - 21:50
Вот так подключаю:
    
Spark.УстановитьПараметр("EquipmentType","ККТ");
Spark.УстановитьПараметр("Port",ВернутьНомПорта());
Spark.УстановитьПараметр("Speed",ВернутьСкорость());
Spark.УстановитьПараметр("Password",СокрЛП(Пароль));
Spark.УстановитьПараметр("LogEnabled",Логирование);
Spark.УстановитьПараметр("DailyLogEnabled",Логирование);
Spark.УстановитьПараметр("DailyLogLifeTime",7);
Spark.УстановитьПараметр("PathLog","c:\Spark\");
Попытка
    Рез = Spark.Подключить(ИДУстройства);
Исключение
    Сообщить("Ошибка вызова метода Спарк.Подключить()");    
КонецПопытки;
   H A D G E H O G s
 
27 - 07.05.19 - 21:51
IDispatch этой либой не поддерживается.
   H A D G E H O G s
 
28 - 07.05.19 - 21:51
Выкините ее
   MWWRuza
 
29 - 07.05.19 - 21:52
А вот так саму ВК загружаю:

        Попытка
            ЗагрузитьВнешнююКомпоненту("Spark115F_DRV_2.4.dll");
        Исключение
            Предупреждение("Не удалось загрузить внешнюю компоненту ""Spark115F_DRV_2.4.dll"", проверьте наличие ее в каталоге ИБ или программы!");
            СтатусВозврата(0);
            Возврат;
        КонецПопытки;
        Попытка    
            Spark = СоздатьОбъект("AddIn.Spark115F_DRV_2004");
        Исключение
            Предупреждение("Ошибка создания объекта ""AddIn.Spark115F_DRV_2004""!");
            СтатусВозврата(0);
            Возврат;
        КонецПопытки;
   Garykom
 
30 - 07.05.19 - 21:54
(25)+ Из примера https://xn--80ajghhoc2aj1c8b.xn--p1ai/upload/iblock/784/Algoritm_zapisi_tega_1162_tabachnoy_produktsii.pdf

Еще пример:
Имеем код (01)00000046210654(21)ADgopSq(91)12(92)1234v67i
Скобки, выделяющие AI, в расчет не берем. Кодируем только GTIN и Serial.
1. Выделяем GTIN 14 символов: 00000046210654 и преобразуем в бинарный вид: 00 00
02 C1 1E 5E
2. Выделяем Serial 7 символов: ADgopSq и преобразуем в строковое значение: 41 44
67 6f 70 53 71

StampType = "05"
Stamp = "ADgopSq"
GTIN = "00000046210654"

Должно заработать по идее, типа оно само перекодирует и вставит как надо в TLV
   MWWRuza
 
31 - 07.05.19 - 21:55
(28)Понятно... Это как раз то, сто я в (0) писал "Можно как-то это обойти, или совсем глухо?"... Я пробовал сначала "по простому" загрузить, не получилось... Думал совсем руки кривые... А оно оказывается "не поддерживается "...
   Garykom
 
32 - 07.05.19 - 21:57
(30)+ Короче я бы вставлял в XML по разному и смотрел что на выходе в логах или в ОФД уходит
   Garykom
 
33 - 07.05.19 - 21:58
Но как эту хре под 1С заюзать из дельфей большой вопрос, да
 
 
   Garykom
 
34 - 07.05.19 - 22:00
(33)+ Под 1С "Spark115F_DRV_2.4.dll" как Native или как COM подключается?
Есть "Spark115FComp.dll" от 2017 года которая как COM
   MWWRuza
 
35 - 07.05.19 - 22:03
(30)Это Вы вообще про что? Про тег 1162 - ? Где? В 1С-? А смысл? Мне из под 1С не надо 1162 печатать, это я тему поднимал, старую... Сейчас не актуально... Смысл, если она кроме как в 1С больше нигде не работает...
А та, которая работает, УниверсальныйДрайвер, в него просто некуда этот тег запихнуть...

(33)Вот и я про то... А уж, если получилось бы, тогда бы и с 1162 можно было бы разбираться.

(34)"Spark115F_DRV_2.4.dll" от "Spark115FComp.dll" отличается только поддержкой ФФД 1.05, и все. Соответственно COM.
   Garykom
 
36 - 07.05.19 - 22:04
(35) Ищите как в эту ВК "Spark115F_DRV_2.4.dll" засовывать XML и туда можно тег 1162 передать в составном виде.
   Garykom
 
37 - 07.05.19 - 22:05
(36)+ В самом херовом случае напишите "сервер на 1С" блин, который будет прокладкой между софтиной на дельфи и dll.
   Garykom
 
38 - 07.05.19 - 22:12
(35) >"Spark115F_DRV_2.4.dll" от "Spark115FComp.dll" отличается только поддержкой ФФД 1.05, и все. Соответственно COM.

Не верю, дайте полный zip из макета, что там в MANIFEST
   MWWRuza
 
39 - 07.05.19 - 22:16
В той демке под 7.7, ссылку на которую я выкладывал в (19), поддержаны обе эти компоненты. Переключателем на форме, с соответствующими изменениями в алгоритме обработки.
(35)Да есть там в XML этот тег, составной. Я пробовал, в этой-же обработке, есть остатки от моих "потуг":
        Если Маркировка = 1 Тогда
            XML_Mark    = ДобавитьУзел(XML_DOM, XML_HELPER, XML_Fisk, "GoodCodeData");
            ДобавитьАттрибут(XML_DOM, XML_Mark, "StampType", ТипМаркировки.ПолучитьЗначение(ТипМаркировки.ТекущаяСтрока()));
            ДобавитьАттрибут(XML_DOM, XML_Mark, "Stamp", СокрЛП(КиЗ));
            ДобавитьАттрибут(XML_DOM, XML_Mark, "GTIN", СокрЛП(ГТин));
            ДобавитьАттрибут(XML_DOM, XML_Mark, "SerialNumber", СокрЛП(СерНом));
        КонецЕсли;
Не корректно работает, но работает(такую тему я как раз поднимал раньше). Что-то передает. Заставить правильно работать - дело десятое, сейчас это не актуально для меня(тем более, разработчик драйвера сам подтвердил, что это пока не доделано), мне не нужна маркировка из под 1С. Но, с этим драйвером хоть есть надежда, что его доделают. А с универсальным, который работает из под чего угодно, пока такой надежды нет - не стоит в планах у них тег 1162.
   MWWRuza
 
40 - 07.05.19 - 22:18
(38)Не верю,
<?xml version="1.0" encoding="UTF-8"?>

-<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">;

<component arch="i386" type="com" path="Spark115F_DRV_2.4.dll" os="Windows"/>

</bundle>

https://cloud.mail.ru/public/5iRp/StqVavpS9 Пароль на архив: "123" был залит в облако раньше, с паролем, перезаливать не стал.
   NorthWind
 
41 - 07.05.19 - 22:19
(19) ну, в простейшем случае кинуть компонент TSpark115F на форму с палитры ActiveX. Либо же вызвать TSpark115F.Create и далее по методам. Это же гораздо проще... VCL массу всего делает за вас.
   Garykom
 
42 - 07.05.19 - 22:22
(41) Оно походу не COM/ActiveX в общепринятом, чисто то что требуется для 1С как com ВК реализовано и служебные.
Через regsvr32 оно не регается, ошибку пишет
   vde69
 
43 - 07.05.19 - 22:24
тут много чего написали, я-бы сразу обратил внимание на тип string, этот тип не очень хорошо понимается всякими dll ихмо дело именно в этом, по факту есть 3 варианта решение

1. переход на PChar
2. переход на библиотеки со спец поддержкой (поищи в сети описание как передавать string, есть описания)
3. ковырять настройки компилятора, и компилировать по правилам с++
   Garykom
 
44 - 07.05.19 - 22:27
(43) Оно не COM/ActiveX которое умеет Delphi из коробки, по сути надо на дельфях реализовывать как платформа 1С работает с ВК:

ЗагрузитьВнешнююКомпоненту("Spark115F_DRV_2.4.dll");
   Garykom
 
45 - 07.05.19 - 22:28
(44) Что там унутри происходит в платформе 1С кто в курсе?
   vde69
 
46 - 07.05.19 - 22:36
(44) правильно, именно СОМ умеет обрабатывать всякие сложные типы, а простые dll обычно работают по строгой типизации параметров. Короче нужно смотреть интерфейс этой dll и там будет понятно чего делать с параметрами.
   MWWRuza
 
47 - 07.05.19 - 22:39
(42)Через regsvr32 оно не регается, ошибку пишет
Какую ошибку? У меня нормально регится, и в реесте кучу всего создает...
И работает потом и из Дельфи в том числе, по крайней мере к драйверу я из него обращаюсь, и версию получаю в ответ, значит он создает объект, через TLB...

(44)Во!!! И я про то... Похоже, из реестра она как-то не до конца грузится... Как это сделать, аналог "ЗагрузитьВнешнююКомпоненту" для Дельфи - для меня пока большой вопрос...

(46)Ну, интерфейс Дельфи при импорте ActiveX Control в TLB вытягивает... В принципе, там все более или менее понятно....
   Garykom
 
48 - 07.05.19 - 22:40
function OdinS_SetParameter(const bstrName: WideString; bstrValue: OleVariant;
                                out pboolSuccess: Integer): HResult; stdcall;

"OleVariant"!

А ты ему суешь 'ККТ' или Integer, попробуй все же OleVarian объявить и присвоить и передать переменные требуемого типа.
   Garykom
 
49 - 07.05.19 - 22:40
(47) У меня не регается, хотя подожди еще раз проверю
 
 Рекламное место пустует
   Garykom
 
50 - 07.05.19 - 22:41
   vde69
 
51 - 07.05.19 - 22:42
(48) cdecl или stdcall ???
   vde69
 
52 - 07.05.19 - 22:43
(51) или еще есть fastcall
   vde69
 
53 - 07.05.19 - 22:44
(51) просто стринги в  cdecl точно не работает
   Garykom
 
54 - 07.05.19 - 22:45
(49) (50) Сорри забыл от имени админа, зарегалось
   Garykom
 
55 - 07.05.19 - 22:45
(54)+ Сча попробую в VS из C#
   MWWRuza
 
56 - 07.05.19 - 22:46
   MWWRuza
 
57 - 07.05.19 - 22:47
А... Не успел.. Зарегилось...
   MWWRuza
 
58 - 07.05.19 - 22:51
(51)в TLB, при импорте само прописалось - stdcall. Может вручную изменить?
   H A D G E H O G s
 
59 - 07.05.19 - 22:53
Спокойствие.
Щас дядя Дима все сделает
   vde69
 
60 - 07.05.19 - 22:57
(58) ну так сказать невозможно, надо живьем смотреть интерфейсы.

Я просто с этими типами в свое время набодался.
   Garykom
 
61 - 07.05.19 - 23:02
   H A D G E H O G s
 
62 - 07.05.19 - 23:08
(61) Сделал
   vde69
 
63 - 07.05.19 - 23:09
(62) теперь колись чего было :)
   H A D G E H O G s
 
64 - 07.05.19 - 23:09
procedure TForm1.FormCreate(Sender: TObject);
var
mainID:TGUID;
begin
  mainID:=StringToGUID('{9AD3FB70-C998-4073-A2E6-EFDEFB14AA7A}');
  CoCreateInstance(mainID,nil,CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,IID_ILanguageExtender,m_Spark);
end;

procedure TForm1.Connect(Sender: TObject);
var
  methID:integer;
  methName:widestring;
  retval:OleVariant;
  params:PSafeArray;
  PName: TBSTR;
  rgsabound: array [0..0] of TSafeArrayBound;
  i,NLen:integer;
  WName:Widestring;
  pWName:PWideChar;
begin
  i:=0;
  rgsabound[0].lLbound := 0;
  rgsabound[0].cElements := 2;
  params := SafeArrayCreate(VT_BSTR, 1, @rgsabound);
  i:=0;
  WName:='EquipmentType';
  pWName := PWideChar(WName);
  SafeArrayPutElement(params, i, pWName^);
  i:=1;
  WName:='ККТ';
  pWName := PWideChar(WName);
  SafeArrayPutElement(params, i, pWName^);
  SafeArrayLock(params);
  methName:='УстановитьПараметр';
  m_Spark.FindMethod(methName,methID);
  m_Spark.CallAsFunc(methID,retval,params);

  ShowMessage(BoolToStr(retval));
  //Res:= m_Spark.OdinS_GetVersion(bstrVersion);
end;
   H A D G E H O G s
 
65 - 07.05.19 - 23:09
Я поработал за 1С
   Garykom
 
66 - 07.05.19 - 23:12
(65) Типа сказал "я не дельфи я 1С работай бегом твою" да?
   H A D G E H O G s
 
67 - 07.05.19 - 23:13
Ну или так нагляднее

  i:=0;
  rgsabound[0].lLbound := 0;
  rgsabound[0].cElements := 0;
  params := SafeArrayCreate(VT_BSTR, 1, @rgsabound);
  SafeArrayLock(params);
  methName:='ПолучитьНомерВерсии';
  m_Spark.FindMethod(methName,methID);
  m_Spark.CallAsFunc(methID,retval,params);
   H A D G E H O G s
 
68 - 07.05.19 - 23:15
Когда также вызываю
"Подключить"
через ILanguageExtender

точно также падает с accessviolation

проблема не в бобине
   MWWRuza
 
69 - 07.05.19 - 23:22
(68)точно также падает с accessviolation
По сути, не принципиально, как загружать и вызывать... И так и так работает одинаково. И не только из Delphi но и из VBA тоже... Проблема в чем-то другом.
А никто не пробовал АТОЛовскую или Штриховскую dll, которая 1С:Совместимо(через XML), загружать в другой среде, отличной от 1С - ? Интересно, там такая проблема есть?
   Garykom
 
70 - 07.05.19 - 23:25
(69) Нету там таких проблем, все пашет.
У меня на lazarus и на c# обертки написаны для атола и штриха.
   Garykom
 
71 - 07.05.19 - 23:25
(70)+ Хотя вру, я нативные использую а не 1С:Совместимо(через XML)
   Garykom
 
72 - 07.05.19 - 23:27
Объясни зачем надо на Delphi ?
   MWWRuza
 
73 - 07.05.19 - 23:32
Пока - только для понимания, как заставить работать.
Реально надо - на VBA, из под Аксеса, есть один проектик(не мой, но я в нем заинтересован). Но, если с Дельфи я еще хоть как-то работал, то к VBA я даже не знаю, с какой стороны подступиться. Если получится в Дельфи заставить ее работать, то и в VBA думаю проще будет.
   MWWRuza
 
74 - 07.05.19 - 23:33
Вот тема на ОлегОне: https://olegon.ru/showthread.php?t=31758
   vde69
 
75 - 07.05.19 - 23:38
(73) я не уверен, что на VBA вообще это возможно сделать....

кстати вопрос, у дельфи есть 2 несовместимые модели использования динамической памяти, соответственно если ты передаешь указатель на кучу там вроде нельзя использовать NEW, хотя уже не помню... попробуй все параметры определить статическим способом (для устранения таких моментов)
   Garykom
 
76 - 07.05.19 - 23:41
(73) Имхо трясите разработчиков
   Garykom
 
77 - 07.05.19 - 23:42
(76)+ В смысле производителя этого чуда техники.
   H A D G E H O G s
 
78 - 07.05.19 - 23:44
(75) Нету у Дельфи никаких моделей памяти.
Есть менеджер памяти Дельфи, наследуемых от менеджера памяти Венды и есть отдельный менеджер BSTR для COM механизмов.
   H A D G E H O G s
 
79 - 07.05.19 - 23:46
Вот здесь можно почитать
https://www.gunsmoker.ru/2009/01/blog-post.html
   vde69
 
80 - 07.05.19 - 23:48
IDDevice - что в нем?

ну и я-бы попробовал что-то типа этого

var
  IDDevice: array[10] char;

и передавать указатель на  первый элемент массива


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует