Страница 19 из 35
Класс для API АТОЛ «Драйвер ККТ версии 10»
Добавлено: 18 Январь 2019, 10:36
Игорь Столяров
Привет всем !
Класс работы с драйвером ККТ АТОЛ 10 на основе JSON заданий.
(форк класса ADMIN'а 2019 г.)
Класс рабочий, в комплекте примеры использования. Любые замечания и дополнения - приветствуются.

В FTP разделе форума создана папка:
/_Books/Atol.KKT со всей сопутствующей документацией.
ВНИМАНИЕ !
Для работы с КМ (кодами маркировки) через JSON задания требуется прошивка ККТ 5.12 и выше (двухлетней давности).
На старых прошивках будет ошибка: Объекту 0x05C1E828 присвоен код ошибки 148 [Ошибка программирования реквизита 1023]
ATOL драйвер 10.x
Добавлено: 10 Июль 2020, 20:19
finsoftrz
Многие библиотеки на си или делфи однопоточные. При использовании их в mdi окнах вылезают разные сюрпризы. Скорее всего, это тот случай.
ATOL драйвер 10.x
Добавлено: 11 Июль 2020, 5:28
Игорь Столяров
Мрак !

Ну хорошо, что хоть сюрпризы относятся к работе функции с открытием окна, а не всех.
ATOL драйвер 10.x
Добавлено: 11 Июль 2020, 7:04
finsoftrz
Да, речь про открытие их окон. Был случай с библиотекой, которая выгружает данные в тсд, если правильно помню. Она открывала свое окно с прогрессором. Отрабатывала, но затем при выходе из приложения вываливалось окно о попытке обращения в недоступную область памяти. Пришлось сделать окно, из которого был вызов, модальным, тогда все нормализовалось. Это не очень удобно, но, в целом, устроило.
ATOL драйвер 10.x
Добавлено: 11 Июль 2020, 9:18
Игорь Столяров
finsoftrz писал(а): 11 Июль 2020, 7:04
Пришлось сделать окно, из которого был вызов, модальным, тогда все нормализовалось.
Жуть ! Я это пробовал: открывал NotMDI модальное окно и даже передавал при вызове его {Prop:Handle} - не помогает.
Вообще - проблема достаточно скользкая, т.к. проявляется при первом вызове окна и потом надо перезагружать комп.

ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 14:36
SergioRaguzini
Привет Всем!
Потребовалось считать информацию о ФН (в частности, серийный номер ФН), посмотрел документацию, обратил внимание что вызов метода
fnQueryData() похож на
QueryData()
в
load_procedures.clw добавил:
Код: Выделить всё
cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
в
procedure_eq.clw
Код: Выделить всё
_libfptr_fn_query_data_ LONG,STATIC,NAME('libfptr_fn_query_data')
...
cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
в Global Map:
Код: Выделить всё
libfptr_fn_query_data(LONG fptr),LONG,RAW,C,PROC,DLL(_libfptr_fn_query_data_)
Создал локальную процедуру по аналогии с
QueryData() :
Код: Выделить всё
!- - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - -!
Atol10.fnQueryData PROCEDURE()!,LONG,PROC
!- - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - -!
CODE
IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
RETURN libfptr_fn_query_data(SELF.fptr)
!. . . . . к о н е ц п р о ц е д у р ы . . . . . .!
хочу получить серийный номер, вызываю:
Код: Выделить всё
LOC:fn_Serial STRING(25)
...
fnQueryData PROCEDURE(),LONG,PROC
CODE
ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
ATOL.fnQueryData()
LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)
MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
ошибок исполнения нет, но, к сожалению, серийный номер тоже не отображается (пусто)
При аналогичной операции с QueryData заводской номер отображается корректно, а вот при информации по ФН нет....
Пытаюсь который день, но никак не пойму в чем проблема?
Караул, Help!
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 15:43
Yufil
Иногда помогает парочка UnlockThread() - LockThread()
UnlockThread вызывается перед обращением к OLE-объекту, а LockThread - после обращения.
Если у объекта есть GUI - строго обязательно.
Да, внутри cкобок UnlockThread - LockThread многие кларионовские вычисления недопустимы, передал-получил значения - закрывайся!
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 18:09
Игорь Столяров
Yufil писал(а): 30 Сентябрь 2020, 15:43
Если у объекта есть GUI - строго обязательно.
О, точно ! Спасибо ! Вот это ещё забыл попробовать с вызовом метода окна настройки
драйвера АТОЛ ДКК10 libfptr_show_properties(). Сейчас сделаем и проверим.

ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 18:37
SergioRaguzini
Yufil писал(а): 30 Сентябрь 2020, 15:43
Иногда помогает парочка UnlockThread() - LockThread()
UnlockThread вызывается перед обращением к OLE-объекту, а LockThread - после обращения.
Если у объекта есть GUI - строго обязательно.
Да, внутри cкобок UnlockThread - LockThread многие кларионовские вычисления недопустимы, передал-получил значения - закрывайся!
Да, но применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE...
Игорь Столяров писал(а): 30 Сентябрь 2020, 18:09
О, точно ! Спасибо ! Вот это ещё забыл попробовать с вызовом метода окна настройки
драйвера АТОЛ ДКК10 libfptr_show_properties(). Сейчас сделаем и проверим.
Код: Выделить всё
IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
RETURN libfptr_show_properties(SELF.fptr, LIBFPTR_GUI_PARENT_NATIVE, WindowHandle)
Проверил, вроде работает - окно "свойств" открывается, "Проверка связи" действует корректно...
А вот информацию о ФН получить пока не могу
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 19:40
Игорь Столяров
SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37
применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE
Ну про OLE написал Юрий, в справке этого нет. Блокировка применяется к внешним вызовам с интерфейсом.
SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37
окно "свойств" открывается
Да оно всегда открывается. Но при первом вызове из MDI окна как "с того света" (секунд 30), а если
повторно открыть MDI окно и повторить вызов - всё становится колом, я уже рассказывал об этом.
Проблема-то решена костылём, но хотелось бы понять происходящее ...
SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37
А вот информацию о ФН получить пока не могу
Вы прикрутили некий метод по принципу похожести. Смысл действия ?
В справке АТОЛ ДККТ10 есть огромный раздел "Запрос информации из ФН" на человеческом языке.
В нём, в т.ч., подробно описано получение серийного номера ФН. Какие проблемы ?

ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 20:46
SergioRaguzini
Игорь Столяров писал(а): 30 Сентябрь 2020, 19:40
...В справке АТОЛ ДККТ10 есть огромный раздел "Запрос информации из ФН" на человеческом языке.
В нём, в т.ч., подробно описано получение серийного номера ФН...
Игорь, извиняюсь за тугодумие, описание
fnQueryData() я сделал интуитивно по аналогии с нормально работающей
QueryData()
Конечно, я читал упомянутый вами раздел справки, но в ней:
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring fnSerial = std::wstring(&str[0]);
для получения серийного номера используются дополнительные
size, а что будет эквивалентом в Clarion-программе и как правильно сделать аналогичный вызов для Clarion, я, к сожалению не пойму (+ м.б. мое описание
fnQueryData() неверно?)

потому и прошу помощи на примере куска кода
Спасибо
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 21:55
Игорь Столяров
SergioRaguzini писал(а): 30 Сентябрь 2020, 20:46
прошу помощи на примере куска кода
Куска когда нет, как и фискализированного накопителя.
Но есть немного сочувствия.

Зачем Вы так глубоко роете ?
По моему Админ для нас уже всё сделал. На вскидку:
Код: Выделить всё
Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
Atol10.FNQueryData()
Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 22:24
SergioRaguzini
Игорь Столяров писал(а): 30 Сентябрь 2020, 21:55
...На вскидку:
Код: Выделить всё
Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
Atol10.FNQueryData()
Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
Игорь, Спасибо! Но в том то и дело что это (у меня, к сожалению) не работает! Гляньте несколько сообщений вверх, вот мое с которого я начал сегодняшнее обсуждение:
хочу получить серийный номер, вызываю:
Код: Выделить всё
LOC:fn_Serial STRING(25)
...
fnQueryData PROCEDURE(),LONG,PROC
CODE
ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
ATOL.fnQueryData()
LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)
MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
идентичны 
! если бы заработало - было бы хорошо, но это не так. Будет минутка - попробуйте у себя
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 22:38
SergioRaguzini
Игорь Столяров писал(а): 30 Сентябрь 2020, 21:55
...нет, как и фискализированного накопителя...
Номер ФН отображается независимо от того фискализирован он или нет
ATOL драйвер 10.x
Добавлено: 30 Сентябрь 2020, 22:41
Игорь Столяров
SergioRaguzini писал(а): 30 Сентябрь 2020, 22:24
Будет минутка - попробуйте у себя
Я не вижу в этом коде проблем.
Но у меня не фискализирован ФН и как следствие не проходит запрос на параметры ФН:

- 1.jpg (25.84 КБ) 6712 просмотров
SergioRaguzini писал(а): 30 Сентябрь 2020, 22:38
Номер ФН отображается независимо от того фискализирован он или нет
Не согласен - ошибка явно указывает на некорректное состояние ФН.
ATOL драйвер 10.x
Добавлено: 01 Октябрь 2020, 10:07
SergioRaguzini
Привет Всем!
Игорь Столяров писал(а): 30 Сентябрь 2020, 22:41
...не фискализирован ФН и как следствие не проходит запрос на параметры ФН...
Дело не в том - фискализирован ли ФН или нет - информация о нем (номер ФН и т.д.) должна отображаться. Я, конечно, больше работал с "ШТРИХ"-ами, но, наверняка АТОЛ работает по такому же принципу.
У меня в АТОЛ-11Ф стоит
МГМ-ФН и чтобы отбросить сомнения, если хотите, могу свой АТОЛ сбросить (расфискализировать) и взять вашу тестовую программку посмотреть - получим ли упомянутую выше ошибку.
Я, только что, у себя собрал тестовую программку для ДТО-8 и попробовал считать номер ФН и информация о нем считывается корректно, в ДТО-10 тоже, но только через "Тест драйвера", а прикладной из Clarion пока нет - пустота...