Имя: Пароль:
IT
 
Не работает ВК 1С в программе, написанной на Delphi или VBA
0 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(маркировка)... И не известно, будет-ли когда-то, в обозримом будущем, так-как основные пользователи(заказчики) этого драйвера, для которых он создавался, маркируемым товаром не торгуют...
1 Garykom
 
гуру
07.05.19
20:31
(0) Посоветуйте затолкать этот спарк в одно место тому кто его выбирал и покупал.

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

поменяйте на

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

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

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

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

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

А там случаем нет поддержки произвольных тегов?
14 Garykom
 
гуру
07.05.19
21:18
(13)+ В смысле неких процедур/функций где номер тега указывается в коде.
15 H A D G E H O G s
 
07.05.19
21:19
(10) А как в 1С с ней работаете?
По ощущениям tlb кривая.
16 H A D G E H O G s
 
07.05.19
21:27
Даже не tlb, а реализация интерфейса в самой dll
17 H A D G E H O G s
 
07.05.19
21:27
Поэтому надо через IDispatch, как в 1С.
18 NorthWind
 
07.05.19
21:27
(10) а если не секрет, зачем так сложно сделали обращение и почему было впрямую не воспользоваться компонентной оберткой TSpark115F?
19 MWWRuza
 
гуру
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) - банально не умею, опыта не хватает... Может есть какой-нибудь наглядный пример, как правильно сделать?
20 dmpl
 
07.05.19
21:39
(4) Первое, что я бы проверил - это https://ru.wikipedia.org/wiki/Соглашение_о_вызове
21 H A D G E H O G s
 
07.05.19
21:41
(19) "Абсолютно адекватно работает под 7.7, ну и естественно под 8.х."

Ну вот можно пример того, что в Дельфи вы написали, только на 1С
22 Garykom
 
гуру
07.05.19
21:44
(19) "GoodCodeData" по формату 1С попробовать.
Найдите вменяемый пример как 1С эту dll-ВК вызывает.
23 Garykom
 
гуру
07.05.19
21:47
(22)+ Хотя понял уже пробовали
24 Garykom
 
гуру
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
25 Garykom
 
гуру
07.05.19
21:49
(24)+ StampType = "05" далее сами думайте может и взлетит
26 MWWRuza
 
гуру
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.Подключить(ИДУстройства);
Исключение
    Сообщить("Ошибка вызова метода Спарк.Подключить()");    
КонецПопытки;
27 H A D G E H O G s
 
07.05.19
21:51
IDispatch этой либой не поддерживается.
28 H A D G E H O G s
 
07.05.19
21:51
Выкините ее
29 MWWRuza
 
гуру
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);
            Возврат;
        КонецПопытки;
30 Garykom
 
гуру
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
31 MWWRuza
 
гуру
07.05.19
21:55
(28)Понятно... Это как раз то, сто я в (0) писал "Можно как-то это обойти, или совсем глухо?"... Я пробовал сначала "по простому" загрузить, не получилось... Думал совсем руки кривые... А оно оказывается "не поддерживается "...
32 Garykom
 
гуру
07.05.19
21:57
(30)+ Короче я бы вставлял в XML по разному и смотрел что на выходе в логах или в ОФД уходит
33 Garykom
 
гуру
07.05.19
21:58
Но как эту хре под 1С заюзать из дельфей большой вопрос, да
34 Garykom
 
гуру
07.05.19
22:00
(33)+ Под 1С "Spark115F_DRV_2.4.dll" как Native или как COM подключается?
Есть "Spark115FComp.dll" от 2017 года которая как COM
35 MWWRuza
 
гуру
07.05.19
22:03
(30)Это Вы вообще про что? Про тег 1162 - ? Где? В 1С-? А смысл? Мне из под 1С не надо 1162 печатать, это я тему поднимал, старую... Сейчас не актуально... Смысл, если она кроме как в 1С больше нигде не работает...
А та, которая работает, УниверсальныйДрайвер, в него просто некуда этот тег запихнуть...

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

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

Не верю, дайте полный zip из макета, что там в MANIFEST
39 MWWRuza
 
гуру
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.
40 MWWRuza
 
гуру
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" был залит в облако раньше, с паролем, перезаливать не стал.
41 NorthWind
 
07.05.19
22:19
(19) ну, в простейшем случае кинуть компонент TSpark115F на форму с палитры ActiveX. Либо же вызвать TSpark115F.Create и далее по методам. Это же гораздо проще... VCL массу всего делает за вас.
42 Garykom
 
гуру
07.05.19
22:22
(41) Оно походу не COM/ActiveX в общепринятом, чисто то что требуется для 1С как com ВК реализовано и служебные.
Через regsvr32 оно не регается, ошибку пишет
43 vde69
 
07.05.19
22:24
тут много чего написали, я-бы сразу обратил внимание на тип string, этот тип не очень хорошо понимается всякими dll ихмо дело именно в этом, по факту есть 3 варианта решение

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

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

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

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

"OleVariant"!

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

Я просто с этими типами в свое время набодался.
61 Garykom
 
гуру
07.05.19
23:02
62 H A D G E H O G s
 
07.05.19
23:08
(61) Сделал
63 vde69
 
07.05.19
23:09
(62) теперь колись чего было :)
64 H A D G E H O G s
 
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;
65 H A D G E H O G s
 
07.05.19
23:09
Я поработал за 1С
66 Garykom
 
гуру
07.05.19
23:12
(65) Типа сказал "я не дельфи я 1С работай бегом твою" да?
67 H A D G E H O G s
 
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);
68 H A D G E H O G s
 
07.05.19
23:15
Когда также вызываю
"Подключить"
через ILanguageExtender

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

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

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

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

var
  IDDevice: array[10] char;

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