Текущее время: 20 фев 2018, 00:06

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 09 ноя 2017, 01:08 
Не в сети

Зарегистрирован: 18 фев 2011, 12:36
Сообщения: 1033
Откуда: Курск
Я повторюсь не в первый и даже не во второй раз: я не знаю почему 1С версии 7.7 не поддерживает исходящие параметры простых типов методов COM-объекта. Восьмая версия, для которой и написан драйвер, их поддерживает. Если вам действительно это интересно - обратитесь в их техподдержку.
Прослойка заключается не в переводе из одного типа в другой, а в полном дублировании исходящих параметров свойствами, т.е. если есть желание работать с 1с через наш COM-объект - необходимо над нашим COM-объектом написать свой COM-объект, который исходящие параметры каждого метода нашего COM-объекта (ну или только те которые вам нужны) будет дублировать своими свойствами. А уже из 1С работать с вашим COM-объектом прослойкой, который в свою очередь будет обращаться к нашему.
Возможно есть ещё какие-то методы, однако я их не знаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 15 фев 2018, 04:13 
Не в сети

Зарегистрирован: 07 дек 2011, 09:04
Сообщения: 6
Здравствуйте.
Проблема аналогична ТС. Нужно искать решение.

Попытка №1.
В 1С v7.7 подключил методом - ФискальныйРегистратор = СоздатьОбъект("MercuryCom.OfdFPDriver");
Немного удалось выжать, методом подбора. Засел на - ФискальныйРегистратор.Open() - Неверное число параметров - но в описании он один. Не понимаю.
Изображение

Попытка №2.
Раз говориться, что в 1С v8 всё работает, пробую:
ProgID = "MercuryCom.OfdFPDriver";
ПодключитьВнешнююКомпоненту(ProgID);
ФискальныйРегистратор = Новый (ProgID); - Тип не определен (MercuryCom.OfdFPDriver) - как-то странно.

Попытка №3.
Раз зашёл разговор за "обёртку", тогда вперёд - но и тут новый квест - mscorlib: Не удалось загрузить файл или сборку "file:///C:\Program Files x86)\Incotex\MercuryOfdFPDriver\MercuryOfdFPDrv.exe" либо одну из их зависимостей. Ожидалось, что модуль содержит манифест сборки.

Если ФР подключить посредством Ethernet к интернету, данные в ОФД будут уходить независимо от подключения ФР к ПК или требуются дополнительные команды от драйвера?
Где можно взять более развёрнутое описание методов и параметров драйвера, а то в MercuryComOFDFPDriver Manual.pdf оно практически отсутствует, больше похоже на трейлер?
По поводу, что 1С не поддерживает исходящие параметры простых типов - всё поддерживает, dll-ки ШТРИХа и АТОЛа работают прекрасно и в 7.7 и в 8, просто MercuryCom.OfdFPDriver предоставляет экспортные функции и не является КОМ библиотекой. Она писалась как Native API (предполагаю) для работы и в никсах.
Выложите исходники MercuryComOFDFPDriver в открытый доступ, попробуем состряпать open source project для всех желающих.
Чтобы "обёртку" задействовать нужен манифест сборки, если с исходниками никак, то скомпиляйте с манифестом.

А вообще, если даже не взлетит, то на текущий момент проще купить другой ФР, цена различается уже не так сильно, ну хочется пока ещё людям сохранить немного денег. Вопрос в основном касается не типовых CFG, а полностью самописных и где стандартных методов предлагаемых интеграционной компонентой 1С мало. Хотя раньше всем кто вёлся на меркурий всегда говорил: кроилово ведёт к попадалову, многие мои слова вспомнили.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 15 фев 2018, 11:07 
Не в сети

Зарегистрирован: 18 фев 2011, 12:36
Сообщения: 1033
Откуда: Курск
Здравствуйте. Давайте по порядку.

NuLLsoft писал(а):
ФискальныйРегистратор.Open() - Неверное число параметров - но в описании он один. Не понимаю.

Приводите текст ошибки точно. Либо её код.
Может быть ошибка выглядит так "Неверное количество обязательных параметров для подключения."? Если да, то смотрите описание к методу Open в документации. Если в двух словах - подключение происходит с текущими значениями параметров, которые перед подключением необходимо установить методом SetParameter. Обязательные параметры для подключения перечислены в описании к методу Open. Получить все возможные параметры драйвера можно методом GetParameters.

NuLLsoft писал(а):
Попытка №2.
Раз говориться, что в 1С v8 всё работает, пробую:
ProgID = "MercuryCom.OfdFPDriver";
ПодключитьВнешнююКомпоненту(ProgID);
ФискальныйРегистратор = Новый (ProgID); - Тип не определен (MercuryCom.OfdFPDriver) - как-то странно.

Так вы же скрин выше выложили, в котором обмениваетесь данными с драйвером из-под семёрки. Что мешает сделать также в восьмёрке? Драйвер не является внешним компонентом 1С.

NuLLsoft писал(а):
Попытка №3.
Раз зашёл разговор за "обёртку", тогда вперёд - но и тут новый квест - mscorlib: Не удалось загрузить файл или сборку "file:///C:\Program Files x86)\Incotex\MercuryOfdFPDriver\MercuryOfdFPDrv.exe" либо одну из их зависимостей. Ожидалось, что модуль содержит манифест сборки.

Не нужно ничего дополнительно загружать. Драйвер запустится сам при создании объекта.

NuLLsoft писал(а):
Если ФР подключить посредством Ethernet к интернету, данные в ОФД будут уходить независимо от подключения ФР к ПК или требуются дополнительные команды от драйвера?

Цитата из документации, страница 3 (п. "Общая методика работы с драйвером"): "После успешного выполнения метода Подключить (Open) драйвер по заданным в подлюченном ККТ таймерам ФН и ОФД начнет осуществлять попытки соединения с сервером ОФД по заданным в ККТ IP-адресу и порту ОФД сервера для передачи фискальных документов из ККТ. После вызова метода Отключить (Close) обмен с сервером ОФД будет прекращен."

NuLLsoft писал(а):
Где можно взять более развёрнутое описание методов и параметров драйвера, а то в MercuryComOFDFPDriver Manual.pdf оно практически отсутствует, больше похоже на трейлер?

В MercuryComOFDFPDriver Manual.pdf присутствует всё необходимое для работы с драйвером из внешней программы, поддерживающей работу с COM объектом.

NuLLsoft писал(а):
По поводу, что 1С не поддерживает исходящие параметры простых типов - всё поддерживает

Раз семёрка всё поддерживает, то в чём суть вопроса?

NuLLsoft писал(а):
dll-ки ШТРИХа и АТОЛа работают прекрасно и в 7.7 и в 8

Так никто и не говорил что с семёркой невозможно работать совсем. Семёрка не хочет получать OUT-параметры из COM-объекта. В ней другое API, под которое нужно специально переписывать драйвер. При его разработке стояла задача поддержать работу в 1С 8, что и было сделано.

NuLLsoft писал(а):
просто MercuryCom.OfdFPDriver предоставляет экспортные функции и не является КОМ библиотекой. Она писалась как Native API (предполагаю) для работы и в никсах.

Нет. MercuryCom.OfdFPDriver это out-proccess COM Server. Как Native API писалась интеграционная библиотека AddIn.MercuryOfdFP1C для связи COM сервера MercuryCom.OfdFPDriver с 1С 8 по стандарту 1С-Совместимо.

NuLLsoft писал(а):
Выложите исходники MercuryComOFDFPDriver в открытый доступ, попробуем состряпать open source project для всех желающих.

Драйвер - это не проект с открытым исходным кодом. Да и не решаю я такие моменты. Попробуйте обратиться в тех.поддержку с этим вопросом.

NuLLsoft писал(а):
Чтобы "обёртку" задействовать нужен манифест сборки, если с исходниками никак, то скомпиляйте с манифестом.

Не совсем вас понял, что нужно "компилять с манифестом"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 15 фев 2018, 16:13 
Не в сети

Зарегистрирован: 07 дек 2011, 09:04
Сообщения: 6
Хорошо. Давайте разберёмся с ФискальныйРегистратор.Open().

Код:
ФискальныйРегистратор = СоздатьОбъект("MercuryCom.OfdFPDriver"); // Создание объекта
Форма.НомерВерсии.Заголовок("Номер версии: " + ФискальныйРегистратор.GetVersion()); // Запрос номера версии драйвера
Форма.ПоддерживаемыеМодели.Заголовок("Поддерживаемые модели: " + ФискальныйРегистратор.GetSupportedModels()); // Запрос поддерживаемых моделей драйвером
Форма.Описание.Заголовок("Описание: " + ФискальныйРегистратор.GetDescription(,,,,,,)); // Запрос информации о драйвере
Форма.УстановитьПараметр1.Заголовок("Установить параметр Port = 5: " + ФискальныйРегистратор.SetParameter("Port", 5)); // Установка порта КОМ 5
Форма.УстановитьПараметр2.Заголовок("Установить параметр: Protokol = 2: " + ФискальныйРегистратор.SetParameter("Protocol", 2)); // Установка протокола Меркурий-МФ(ОФД)
Форма.УстановитьПараметр3.Заголовок("Установить параметр: Speed = 115200: " + ФискальныйРегистратор.SetParameter("Speed", 115200)); // Установка скорости обмена 115200
Форма.Подключение.Заголовок("Подключение: " + ФискальныйРегистратор.Open()); // Попытка подключения к ФР

На этапе подключения к ФР - ФискальныйРегистратор.Open(), получаю ошибку:
Форма.Подключение.Заголовок("Подключение: " + ФискальныйРегистратор.Open());
{C:\USERS\ADMINISTRATOR\DESKTOP\MER.ERT(44)}: Неверное число параметров

Одну ошибку нашёл, сам накосячил.
Исправил: Форма.Подключение.Заголовок("Подключение: " + ФискальныйРегистратор.Open(ИД)); // Попытка подключения к ФР
Заоодно поправил и: Форма.Описание.Заголовок("Описание: " + ФискальныйРегистратор.GetDescription(О1, О2, О3, О4, О5, О6, О7)); // Запрос информации о драйвере
Изначально не писал параметр в Open(), по аналогии с GetDescription(,,,,,,), получается не было параметра вообще, это критично.

Параметры для подключения посмотрел в панели управления ККТ.
Изображение

Далее исправленный код:
ИД = "";
ФискальныйРегистратор = СоздатьОбъект("MercuryCom.OfdFPDriver"); // Создание объекта
Форма.НомерВерсии.Заголовок("Номер версии: " + ФискальныйРегистратор.GetVersion()); // Запрос номера версии драйвера
Форма.ПоддерживаемыеМодели.Заголовок("Поддерживаемые модели: " + ФискальныйРегистратор.GetSupportedModels()); // Запрос поддерживаемых моделей драйвером
Форма.Описание.Заголовок("Описание: " + ФискальныйРегистратор.GetDescription(О1, О2, О3, О4, О5, О6, О7)); // Запрос информации о драйвере
Форма.УстановитьПараметр1.Заголовок("Установить параметр Port = 5: " + ФискальныйРегистратор.SetParameter("Port", 5)); // Установка порта КОМ 5
Форма.УстановитьПараметр2.Заголовок("Установить параметр: Protokol = 2: " + ФискальныйРегистратор.SetParameter("Protocol", 2)); // Установка протокола Меркурий-МФ(ОФД)
Форма.УстановитьПараметр3.Заголовок("Установить параметр: Speed = 115200: " + ФискальныйРегистратор.SetParameter("Speed", 115200)); // Установка скорости обмена 115200
Форма.Подключение.Заголовок("Подключение: " + ФискальныйРегистратор.Open(ИД)); // Попытка подключения к ФР

Пробное подключение:
Изображение

Уже лучше. Из описания: возвращаемое значение в случае успешного выполнения будет VARIANT_TRUE (-1), значит установка параметров проходит, а вот Open(ИД) возвращается с ошибкой. Далее опрашиваю на ошибки GetLastError(Данные) и получаю -2. Что такое -2?
Пробовал по USB: SetParameter("Port", -1) и SetParameter("Protocol", 2) - ситуация аналогичная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 15 фев 2018, 17:14 
Не в сети

Зарегистрирован: 18 фев 2011, 12:36
Сообщения: 1033
Откуда: Курск
NuLLsoft писал(а):
Далее опрашиваю на ошибки GetLastError(Данные) и получаю -2. Что такое -2?
Пробовал по USB: SetParameter("Port", -1) и SetParameter("Protocol", 2) - ситуация аналогичная.

Опять же по документации для метода GetLastError: Возвращает код и описание последней произошедшей ошибки. Если ошибок не было вернет 0 и пустую строку.
Т.е. -2 это код ошибки, а в параметр "Данные" должен вернуться текст ошибки при этом.
Скажу сразу код -2 соответствует сообщению "Неверный тип параметра подключения".
Любой параметр, передаваемый параметр в метод SetParameter, должен иметь тип VARIANT. У вас же там, по всей видимости простые типы.
Пример из Builder C++:
Код:
   VARIANT vPort;
   vPort.vt = VT_I4;
   vPort.intVal = -1;
   VARIANT vProtocol;
   vProtocol.vt = VT_I4;   
   vProtocol.intVal = 1;   
   VARIANT vSpeed;
   vSpeed.vt = VT_I4;
   vSpeed.intVal = 115200;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 16 фев 2018, 02:08 
Не в сети

Зарегистрирован: 07 дек 2011, 09:04
Сообщения: 6
slan писал(а):
Драйвер - это не проект с открытым исходным кодом. Да и не решаю я такие моменты. Попробуйте обратиться в тех.поддержку с этим вопросом.

Прежде чем буду задавать вопросы про методы и параметры, позвольте уточнить: Вы являетесь официальным представителем или просто добрым человеком, который всем помогает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 16 фев 2018, 08:57 
Не в сети

Зарегистрирован: 18 фев 2011, 12:36
Сообщения: 1033
Откуда: Курск
Я разработчик драйвера. Могу подсказать как с ним работать (на том что знаю, т.е. С++ Builder или WinApi). Ну и конечно же исправлю косяки, если они будут найдены.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 16 фев 2018, 15:51 
Не в сети

Зарегистрирован: 07 дек 2011, 09:04
Сообщения: 6
Про документацию.
1. Где взять полный список ошибок?
2. Где взять пример на С++ Builder? Кусочек кода приведённый Вами это очень хорошо, но надо полный цикл (как у других, ШТРИХ и АТОЛ), пусть будет пример оформления фискального чека: подключение к фр, формирование чека, отключение от фр - и не просто кусок кода, а с описанием зачем и почему так делается.
3. Давайте разберём метод УстановитьПараметр (SetParameter).
Сначала установлю порт для подключения (собственно этим и ограничусь):
Имя = Строка(Port); // Тип данных строка, это первый параметр, входящий.
Значение = Число(5); // Тип данных число, это второй параметр, входящий.
ФР.УстановитьПараметр(Имя, Значение);
Параметров указал два, один строка, другой число. Раз второй параметр VARIANT (может принимать любое значение), значит отправлю ему число, ведь номер порта - число (что логично).
Получаю ошибку -2 - "Неверный тип параметра подключения". Логичный вопрос - почему? Документацию прочитал, метод правильный, параметров два, тип правильный, что ещё не хватает? После Вашего куска кода вырисовывается картина о понимании работы драйвера - он дебил (драйвер). Следовательно ему нужно не только числовое значение номера порта, а ещё и тип значения указать. Хорошо, могу указать, но как? В каком формате ему передавать эти данные: список значений, таблица значений, массив, строка? Этого в документации не написано. Как бы получается VARIANT это метод, а "тип" и "значение" его параметры "строка" и "число". В описании надо это расписывать, а не оставлять только "Значение параметра" и приводить пример.
С полученными новыми данными предположу примерный код:
Имя = Строка(Port); // Тип данных строка, это первый параметр, входящий.
ЗначениеВариант = Строка(VT_I4) + Строка(:) + Строка(5); // Создам строку с разделителем ":", для передачи драйверу. Уже не правильно - нужен тип Число. Строка - как пример отправить драйверу данные, чтобы он не тупил.
ФР.УстановитьПараметр(Имя, ЗначениеВариант);
Естественно драйвер не поймёт, он не готов к преобразованию, он не знает что и как преобразовывать. Логичный вопрос: зачем делать тип VARIANT? Можно было сделать тип VT_I4 и не было бы проблем. В куске Вашего кода видно, что везде тип VT_I4. Почему выбран тип VARIANT, а не VT_I4? Драйверу дали число, а уже как его понимать и к чему его относить - трудности драйвера, а не верхнего ПО.
Документация по драйверам ШТРИХ и АТОЛ. Это документация по которой у меня всё всегда получалось и вопросов к разработчикам не было, т.к. всё расписано и всё работает как задумано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: v7: Не возвращаются параметры из DLL
СообщениеДобавлено: 16 фев 2018, 17:05 
Не в сети

Зарегистрирован: 18 фев 2011, 12:36
Сообщения: 1033
Откуда: Курск
NuLLsoft писал(а):
Про документацию.
1. Где взять полный список ошибок?
2. Где взять пример на С++ Builder? Кусочек кода приведённый Вами это очень хорошо, но надо полный цикл (как у других, ШТРИХ и АТОЛ), пусть будет пример оформления фискального чека: подключение к фр, формирование чека, отключение от фр - и не просто кусок кода, а с описанием зачем и почему так делается.

1. В документации его нет, не думал что он понадобится, так как метод GetLastError возвращает не только код, но и текст ошибки. Но если считаете, что он нужен - добавлю со следующим релизом драйвера.
2. Нет такого примера. Наверное примеры к методам это хорошо. И возможно даже я их когда-нибудь напишу. Но во-первых всем не угодишь с языком программирования (только вчера у меня например просили пример для Visual FoxPro), а во-вторых на это уйдёт определенное время, которого всегда катастрофически не хватает. К тому же задача стояла написать драйвер для работы с 1С 8, в котором есть определенный требованиями 1С набор методов, а не расписать пошаговое руководство пользования драйвером для другого программиста. В любом случае, если кому-то нужны примеры кода - я не отказываю, естетсвенно примеры будут на том что я знаю.
NuLLsoft писал(а):
3. Давайте разберём метод УстановитьПараметр (SetParameter).
Сначала установлю порт для подключения (собственно этим и ограничусь):
Имя = Строка(Port); // Тип данных строка, это первый параметр, входящий.
Значение = Число(5); // Тип данных число, это второй параметр, входящий.
ФР.УстановитьПараметр(Имя, Значение);
Параметров указал два, один строка, другой число. Раз второй параметр VARIANT (может принимать любое значение), значит отправлю ему число, ведь номер порта - число (что логично).
Получаю ошибку -2 - "Неверный тип параметра подключения". Логичный вопрос - почему? Документацию прочитал, метод правильный, параметров два, тип правильный, что ещё не хватает? После Вашего куска кода вырисовывается картина о понимании работы драйвера - он дебил (драйвер). Следовательно ему нужно не только числовое значение номера порта, а ещё и тип значения указать. Хорошо, могу указать, но как? В каком формате ему передавать эти данные: список значений, таблица значений, массив, строка? Этого в документации не написано. Как бы получается VARIANT это метод, а "тип" и "значение" его параметры "строка" и "число". В описании надо это расписывать, а не оставлять только "Значение параметра" и приводить пример.
С полученными новыми данными предположу примерный код:
Имя = Строка(Port); // Тип данных строка, это первый параметр, входящий.
ЗначениеВариант = Строка(VT_I4) + Строка(:) + Строка(5); // Создам строку с разделителем ":", для передачи драйверу. Уже не правильно - нужен тип Число. Строка - как пример отправить драйверу данные, чтобы он не тупил.
ФР.УстановитьПараметр(Имя, ЗначениеВариант);
Естественно драйвер не поймёт, он не готов к преобразованию, он не знает что и как преобразовывать. Логичный вопрос: зачем делать тип VARIANT? Можно было сделать тип VT_I4 и не было бы проблем. В куске Вашего кода видно, что везде тип VT_I4. Почему выбран тип VARIANT, а не VT_I4? Драйверу дали число, а уже как его понимать и к чему его относить - трудности драйвера, а не верхнего ПО.
Документация по драйверам ШТРИХ и АТОЛ. Это документация по которой у меня всё всегда получалось и вопросов к разработчикам не было, т.к. всё расписано и всё работает как задумано.

Вы делаете неправильные выводы. Тип VARIANT это тип VARIANT, а не какой-то другой тип и уж тем более не метод. Как его задавать в С++ Builder я вам выше в куске кода указал. Как его задавать в 1С я не в курсе, так как не знаю языка программирования, используемого в ней. Типы данных драйвера полностью соответствуют типам данных Microsoft OLE Automation, поэтому вопросы почему выбран такой тип, а не какой-то другой, как минимум неуместны. 1С их, кстати, точно поддерживает, так как они используются в их требованиях, можете убедиться (http://its.1c.ru/db/metod8dev#content:4829:hdoc)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB