Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Раздел для обсуждения программного обеспечения КБ по ККМ Меркурий.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Проверяю на фискальнике с той же самой версией ПО:
Изображение

Соединяюсь с фискальником. Разжимаю бумагу в ролике, загорается индикатор "ОШИБКА ЧЕК ЛЕНТЫ". Затем пытаюсь напечатать Х-отчет и следом проверяю готовность принтера:
Изображение

Код: Выделить всё

	MSK.OlePropertySet("ТипОтчета", 4);
	result = MSK.OleFunction("НапечататьОтчетБезГашения", devID2);
	idErr = MSK.OleFunction("ПолучитьОшибку", &err_descr);
	if(result == VARIANT_TRUE)
		Form1->memoInfo->Lines->Append(WideString("Печатаем отчет без гашения...ok"));
	else
		Form1->memoInfo->Lines->Append(WideString("Печатаем отчет без гашения...error ") + err_descr);
	Form1->memoInfo->Lines->Append(L"\n");

	WideString prnReady;
	result = MSK.OleFunction("ПроверитьГотовностьПринтера", devID2, &prnReady);
	if(result == VARIANT_TRUE)
		Form1->memoInfo->Lines->Append(WideString("Проверяем готовность принтера...ok ") + prnReady);
	else
		Form1->memoInfo->Lines->Append(WideString("Проверяем готовность принтера...error ") + err_descr);
	Form1->memoInfo->Lines->Append(L"\n");
Если зажать бумагу на ролике, индикатор погаснет, но если опять проверить готовность методом ПроверитьГотовностьПринтера, то принтер опять не будет готов, т.к. статус обновляется после выполнения какой-либо команды к фискальнику.
Возможно у Вас он рапортует о готовности именно поэтому, наверное Вы откинули ролик и попытались прочесть статус без выполнения какой-либо команды, вот драйвер и отдал статус предыдущей (видимо удачно выполненной )команды. Думаю здесь небольшой косяк, поправлю

Теги:
Аватара пользователя
valchara
Сообщения: 8
Зарегистрирован: 16 сен 2015, 11:54

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение valchara »

Вот спасибо, теперь стало понятно про готовность принтера.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Обновил драйвер до 2.20.1
Теперь метод проверки готовности принтера работает корректно без учета выполнения предыдущей команды
Аватара пользователя
identificator
Сообщения: 5
Зарегистрирован: 19 янв 2016, 17:04

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение identificator »

Добрый день!
Подскажите пожалуйста, как передать SAFEARRAY и BSTR в COM интерфейс?
Использую библиотеку VOLE в качестве обертки для работы с COM объектом драйвера.
http://vole.sourceforge.net
https://sourceforge.net/projects/vole/
Например, отбросим пока SAFEARRAY и будем передавать только в функцию DeviceTestWithParams в качестве пароля переменную
IN BSTR Password, и переменную OUT BSTR Res в качестве результата теста (код упрощен):

Код: Выделить всё

using vole::object;
using vole::of_type;
object Drv = object::create("MercuryCom.FPDrv1C2");

uint8_t Port = 3;
uint16_t Speed = 9600;
BSTR	Password = L"0000";
uint16_t CashSection = 1;
VARIANT_BOOL PrintTax = VARIANT_FALSE;
uint8_t Protocol = 8;
BSTR Res = L"0";

VARIANT_BOOL R = Drv.invoke_method(of_type<VARIANT_BOOL>(), L"DeviceTestWithParams", Port, Speed, Password, Protocol, Res);
При компиляции возникает ошибка
Error 4 error C2664: 'stlsoft::comstl_project::variant::variant(const VARIANT &,VARTYPE)' : cannot convert argument 1 from 'vole::com_argument_traits<T>::need_to_specialise_the_traits_for_your_argument_type' to 'const VARIANT &' d:\downloads\soft\visual_studio\vole-0.7.4\include\vole\util\variant.hpp 192

В секции Output компилятора следующие сообщения:
error C2664: 'stlsoft::comstl_project::variant::variant(const VARIANT &,VARTYPE)' : cannot convert argument 1 from 'vole::com_argument_traits<T>::need_to_specialise_the_traits_for_your_argument_type' to 'const VARIANT &'
with
[
T=BSTR
]
Reason: cannot convert from 'vole::com_argument_traits<T>::need_to_specialise_the_traits_for_your_argument_type' to 'const VARIANT'
with
[
T=BSTR
]
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
d:\downloads\soft\visual_studio\vole-0.7.4\include\vole\internal\generated\methods.hpp(271) : see reference to function template instantiation 'vole::variant::variant<T2>(const T &)' being compiled


Ошибка пропадает, когда вместо BSTR я использую std::wstring тип.
Все компилируется, но при вызове функции не может сделать тест.
Видимо, пароль не в том формате.
Также в результирующую строку Res ничего не возвращается после вызова функции.
Обертка в try-catch для отладки ошибки выдает "Unknown error".
Для функции DeviceTest, куда мы передаем SAFEARRAY с параметрами - аналогичная ошибка.
Разрабатывал успешно драйвера для весов CAS, используя VOLE, но там не было таких вызовов с передачей BSTR.
Как-то нужно конвертировать или указывать тип перед передачей в функцию, только вот как - не знаю...
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Добрый день. Если хотите, могу показать как передать из билдера, на вижуалке примеров нет к сожалению
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Variant MSK;
MSK = CreateOleObject(L"MercuryCom.FPDrv1C2");

WideString devID = "", err_descr = "";
long idErr;
WideString version = MSK.OleFunction(L"GetVersion");

//Подключение
SAFEARRAY *pArray = 0;
pArray = SafeArrayCreateVector(VT_VARIANT, 0, 6);
Variant *pData = 0;
SafeArrayAccessData(pArray, (void**)&pData);
pData[0] = 4; //порт
pData[1] = 9600; //скорость
pData[2] = WideString(L"0000"); //пароль
pData[3] = 1; //секция
pData[4] = true; //печатать ли налоги
pData[5] = 3; //протокол
SafeArrayUnaccessData(pArray);

VARIANT_BOOL result = MSK.OleFunction(L"Подключить", pArray, &devID);
if(result != VARIANT_TRUE){
idErr = MSK.OleFunction(L"ПолучитьОшибку", &err_descr);
}

//передача BSTR в драйвер
WideString wBarType = L"EAN13";
WideString wBarData = L"123456789012";
result = MSK.OleFunction("НапечататьШтрихКод", devID.c_bstr(), wBarType.c_bstr(), wBarData.c_bstr());

Аватара пользователя
identificator
Сообщения: 5
Зарегистрирован: 19 янв 2016, 17:04

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение identificator »

Подскажите, есть ли возможность переписать драйвер под С++ Visual Studio?
Или хотя бы вместо BSTR переопределить тип на STR ?
Работать с BSTR из VS очень неудобно...
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

BSTR - это стандартный строковый тип для любого сервера Microsoft OLE Automation. Плюс это требование компании 1С к формату передаваемых данных между 1С и драйвером (который написан с учетом этих требований).
Переписывать драйвер не думаю что кто-то возьмется. Это процесс совсем не двух дней, и без ценных указаний от руководства за такую работу браться никто не будет
Аватара пользователя
identificator
Сообщения: 5
Зарегистрирован: 19 янв 2016, 17:04

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение identificator »

Тогда подскажите пожалуйста, как адаптировать код под Visual C++...
Я уже всю голову сломал...
SAFEARRAY не хочет передаваться...
Изображение
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Я недостаточно хорошо знаю Visual C++. Если время у Вас терпит - подождите пару недель, я с этим как раз начну разбираться со следующей недели. Буду писать внешнюю компоненту для 1С и драйвера как раз на Visual C++.
Аватара пользователя
identificator
Сообщения: 5
Зарегистрирован: 19 янв 2016, 17:04

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение identificator »

Добавьте пожалуйста в методы COM драйвера возможность печати QR-кода.
Сейчас есть EAN-13, EAN-8, UPC. А QR-нет.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

В драйвер-то я добавить могу, но фискальник не имеет такого функционала,так что это добавление бессмысленно.
Если речь идёт о командах ЕГАИС, так они реализованы, команда ПодотчетЧека, последним параметром там идёт адрес, вот он напечатется QR-кодом.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Собственно на Visual C++ процесс создания SAFEARRAY не сильно отличается:

Код: Выделить всё

SAFEARRAY *params = 0;
params = SafeArrayCreateVector(VT_VARIANT, 0, 6);
VARIANT *pData = 0;
SafeArrayAccessData(params, (void**)&pData);
pData[0] = _variant_t((long)1, VTYPE_I4);        //порт
pData[1] = _variant_t((long)9600, VTYPE_I4);  //скорость
pData[2] = _variant_t(L"0000");                      //пароль на связь
pData[3] = _variant_t((long)1, VTYPE_I4);       //секция для наличных
pData[4] = _variant_t(true);                           //печатать ли налоги
pData[5] = _variant_t((long)8, VTYPE_I4);      //протокол
Аватара пользователя
Grin
Сообщения: 16
Зарегистрирован: 18 дек 2015, 11:52

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение Grin »

byron писал(а):Работа драйверов в VB6, как оказалось, никаких проблем не вызвала. Если кому-нибудь пригодится - выкладываю кусок кода по командам проверки и подключению:
Проблемы с VBS. Связаны с тем, что разработчики драйвера возвращают результаты работы процедур через параметры-ссылки. IMHO, не комильфо для ООП. Правильнее было бы использовать свойства класса. Пришлось писать прослойку, которая устраняет эти недочеты.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

По вопросам правильности - это к компании 1с, по её требованиям разрабатывался драйвер
Аватара пользователя
Martin
Сообщения: 23
Зарегистрирован: 17 июл 2013, 13:36

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение Martin »

Добрый день

У нас имеются ФР Гепард НТС-МФ 2.0 B8.1 т.е. с прошивкой для РБ.
01.07.16 в РБ будет проведена деноминация в 10000 раз. и будут введены копейки.

Я знаю, что в FR-Tools, имеются соответствующие настройки:
1) Программирование => Программирование параметров => вкладка Параметры 2:
Вывод сумм с десятичной точкой

2) … => вкладка Параметры 3:
Величина округления
Правило округления

В связи с этим, у нас просьба: добавить в драйвер методы для получения состояния и установки этих настроек программно.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

Martin писал(а):Добрый день

У нас имеются ФР Гепард НТС-МФ 2.0 B8.1 т.е. с прошивкой для РБ.
01.07.16 в РБ будет проведена деноминация в 10000 раз. и будут введены копейки.

Я знаю, что в FR-Tools, имеются соответствующие настройки:
1) Программирование => Программирование параметров => вкладка Параметры 2:
Вывод сумм с десятичной точкой

2) … => вкладка Параметры 3:
Величина округления
Правило округления

В связи с этим, у нас просьба: добавить в драйвер методы для получения состояния и установки этих настроек программно.
Добавлю. Есть правда один момент - в разных прошивках (СОЖ и Гепард) разные значения величины округления, плюс правила округления нет в СОЖ
Аватара пользователя
HSV72
Сообщения: 2
Зарегистрирован: 10 июн 2016, 10:04

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение HSV72 »

Добрый день, подскажите у кого работает на 1С77 с драйвером 2.хх, ФР Меркурий-MS-K
Установил драйвер,проверил ч/з утилиту, работает.
Делаю код в 1с77:
//*******************************************
Процедура Сформировать()
Перем id;
Перем err;
Перем num_ch, num_sm;
Попытка
myfr = CreateObject("MercuryCom.FPDrv1C2"); // Создание объекта внешней компоненты
Исключение
Сообщить("Объект MercuryCom.FPDrv1C2 не создан!!!");
Возврат;
КонецПопытки;
// подключаемся к ФР

Если myfr.OpenWithParams(3, 57600, "0000", 1, 1, 3, id) = 0 Тогда //тут выдает =-1, т.е. все ОК
Сообщить("Не удалось подключиться к ФК");
Возврат;
КонецЕсли;

myfr.GetLastError(err); // тут выдает = 131072 - Устройство с таким номером отсутствует

myfr.PrintXReport(id); // тут и далее = 0



// Регистрируем кассира
myfr.RegisterCashier(id, 1, "Kassir");

myfr.OpenCheck(id, 1, 0, 1, num_ch, num_sm);
// добавляем позицию чека
myfr.PrintFiscalString(id, "Алко", 2, 1, 2, 1, 0);
// закрываем чек
myfr.CloseCheck(id, 2, 0, 0);
// печаем QR-код
myfr.SubreportCheck(id, num_sm, num_ch, "23052016", "1615", "68D01979F3E7667924229E31E4A3068EAE898BE5DFE536668197AF33A8D95F4F04F6C39FEB09E3F339142BC10D40233B1897C9A03D6E13CCCFB22B1B752436CB", "http://check.egais.ru?id=c140dddb-d0a0- ... 0000000000");
// получить ошибку с драйвера ФР
myfr.GetLastError(err);
// отключаемся от ФР
myfr.Close(0);
КонецПроцедуры

В итоге ни чего не печатает, ошибка 131072. Где какие параметры неверно может передаю., либо нужны сторонние какие-то компоненты (желательно без них). Спасибо.
Аватара пользователя
slan
Сообщения: 1157
Зарегистрирован: 18 фев 2011, 11:36
Откуда: Курск

Re: Драйвер (ВЕРСИИ 2.X Курск) для ФР/ЧПМ Меркурий MS-K, Меркурий-119, Меркурий-114.1 [Обсуждение]

Сообщение slan »

HSV72, к сожалению 1С версии 7.7 не умеет получать выходные параметры из ком-объекта, поэтому при выполнении метода ПодключитьСПараметрами у Вас, скорее всего, параметр id не заполняется значением из драйвера. Соответственно на все остальные методы с этим id драйвер ругается.
Могу предложить костыль - если у вас ФР с ком-портом (а он судя по всему с ним), то драйвер в id передает номер ком-порта, т.е. "3" в вашем случае. Выполните ПодключитьСПараметрами, в случае успешного подключения (-1) заполните сами id, и попробуйте этот id с другими методами. Должно получиться.
Драйвер разрабатывался по требованиям восьмерки, поэтому с 7.7 такие танцы с бубном
Ответить