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

В FTP разделе форума создана папка: 
/_Books/Atol.KKT со всей сопутствующей документацией.
----------------------------------------------------------------------------------------------------
Рекомендуем использовать актуальные версии классов 
cJSON и 
PrintF.
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 17 Март 2021, 11:20
				 Игорь Столяров
				gromov писал(а): 17 Март 2021, 11:08
А можно без вот этого, а по-человечески
 
А это не ответ на Ваш вопрос. Просто сегодня получил письмо от АТОЛ и выложил ссылку в раздел АТОЛ. 

Как я понимаю, скучать не придётся. 
Что касается эмулятора ФН, то цена очень хорошая. Но как-то смущает, что они предлагают фиксированные
настройки для тестового ОФД. Поддерживается ли работа со сторонними ОФД ? Непонятно ... 
Там ведь вопрос с шифрованием данных при обмене с ОФД и наличия сертификата в ФН выданного ФНС.
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 17 Март 2021, 11:36
				 gromov
				Поскольку у меня нет опыта работы с ккм вообще, хочется просто "поиграться". Понять, что и как. Получить наконец полноценный чек. Разобраться короче. А связь с ОФД это потом.
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 17 Март 2021, 11:58
				 Игорь Столяров
				gromov писал(а): 17 Март 2021, 11:36
Получить наконец полноценный чек
 
Скажу про себя. Я полтора года назад выскулил полноценный МГМ: 
https://online-kassa.ru/kupit/mgm-fn-1.1/
Вставил его в ФР ... и с тех пор он там и воткнут непонятно зачем. Я его не фискализировал, работать это не мешает.
Как-то в переписке с тех. поддержкой АТОЛ они вскользь упомянули, что без фикализации ФН мне будут недоступны
какие-то функции (наверно запросы по данным собственно ФН) - но я пока с такими не сталкивался.
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 17 Март 2021, 12:07
				 gromov
				Хорошо, подумаю.
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 07 Апрель 2021, 16:43
				 gromov
				Привет, коллеги. Вопрос по касс. чеку.
Клиент оплачивает услугу, кот. состоит из нескольких позиций. Все они ясное дело должны быть отражены в чеке. Но есть одно НО. Услуга может быть оплачена неполностью. 
Например: услуга=2650, оплата = 500.
По совету ГУРУ умножаю каждую позицию на соотношение 500/2650. Логично.
Однако эта сволочь (Атол) все правильно считает и в итоге чека имеем 500.01. Некрасиво.
Покорежил слегка класс Admin-а. Добавил функцию регистрации итога и кой-чего в метод PrintCheck. Стало только хуже))). Из доки понял, что округлять можно копейки в меньшую сторону . Теперь в некоторых случаях имею так: в программе оплата 800, а в чеке 799. Я,как клиент, на это забил бы, но случаются персонажи, которые мозг из-за двух копеек вынесут. Подскажите, что сделать. Оставить эту копейку и хрен бы с ней ?
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 07 Апрель 2021, 17:35
				 Игорь Столяров
				gromov писал(а): 07 Апрель 2021, 16:43
Однако эта сволочь (Атол) все правильно считает и в итоге чека имеем 500.01. Некрасиво.
 
Вы ведь сделали всё правильно, просто не поняли смысл использования LIBFPTR_PARAM_SUM (отброс копеек). 

Что бы его применять нужно умножать сумму строки на коэффициент и не тупо округлять математически, 
а всегда в большую сторону. Т.е. RoundHigh(12.0143) = 12.02 и т.д. 
И потом эти копейки (включающие в себя в т.ч. и погрешность округления) отбросить. Вот и всё. 

 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 07 Апрель 2021, 18:08
				 gromov
				Спасибо, попробую.
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 23 Ноябрь 2021, 10:08
				 Игорь Столяров
				Часто бывает нужно получить какой-то параметр чека из ФН по его номеру.
Например, текущее законодательство не требует печатать в чеке СНО предприятия.
Предложу, в прекрасный класс Admin'а метод, который решает такую задачу.
Код: Выделить всё
! --- Получить из ФН ККТ параметр по номеру чека / тега
Atol10.GetCheckTag  Procedure(Long xCheckNumber_, String xTag_)  !,String
MyJSon         JSONDataClass
Loc:RetValue   CString(256)
Loc:TheRequest CString(256)
Loc:DocTLV   Group
documentTLV    Group
TheValue         CString(256)
               end
             end
  Code
  If Self.FlagLoaded and (xCheckNumber_ > 0)
  
     ! Формируем запрос на получение данных чека по номеру из ФН ККТ
     Loc:TheRequest = '{{"type":"getFnDocument","fiscalDocumentNumber":' & Clip(Left(xCheckNumber_)) & '}'
     
     Self.SetParamStr(LIBFPTR_PARAM_JSON_DATA, Loc:TheRequest)
     If libfptr_validate_json(Self.fptr) = 0  ! Проверка корректности запроса
     
        Self.SetParamStr(LIBFPTR_PARAM_JSON_DATA, Loc:TheRequest)  ! Надо повторно указывать запрос
        If libfptr_process_json(Self.fptr) = 0  ! Есть положительный ответ из ФН на Ваш запрос
           MyJSon.SetExternalName('TheValue',xTag_)  ! Указать какой тег из ответа хотим получить
           MyJSon.FromJSON(Self.GetParamStr(LIBFPTR_PARAM_JSON_DATA),Loc:DocTLV)
           
           ! Собственно отжимаем из ответа значение нужного тега
           Loc:RetValue = MyJSon.UnEscapeString(Loc:DocTLV.documentTLV.TheValue)
           
        end  ! If libfptr_process_json(Self.fptr)
     end  ! If libfptr_validate_json(Self.fptr)
  end  ! If xCheckNumber_ > 0
  
  Return Loc:RetValue
Теперь, например, можно получить реальный СНО чека после его печати:
Код: Выделить всё
  CheckNomer = MyAtol.GetLastCheck()  ! Номер последнего чека из ФН
  Case Int(MyAtol.GetCheckTag(CheckNomer,'1055'))  ! Тег 1055 - это СНО чека
  Of LIBFPTR_TT_OSN                ! 1. Общая СНО
     TaxType = 1
  Of LIBFPTR_TT_USN_INCOME         ! 2. Упрощенная Доход
     TaxType = 2
  Of LIBFPTR_TT_USN_INCOME_OUTCOME ! 3. Упрощенная Доход минус Расход
     TaxType = 3
  Of LIBFPTR_TT_ENVD               ! 4. ЕНВД
     TaxType = 4
  Of LIBFPTR_TT_ESN                ! 5. Единый сельскохозяйственный налог
     TaxType = 5
  Of LIBFPTR_TT_PATENT             ! 6. Патентная СНО
     TaxType = 6
  Else
     TaxType = 0              ! ХЗ
  end
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 25 Ноябрь 2021, 10:00
				 Игорь Столяров
				Пример метода в класс ATOL10 для печати штрих-кода (с текстовым названием):
Код: Выделить всё
Atol10.PrintBarCode  Procedure(String xStrText_,String xStrSCod_, Byte xVidCode_)
  Code                            
  If (Self.FlagLoaded = True) and (Clip(Left(xStrSCod_)) <> '')  ! Если есть штрих-код
     Self.SetParamStr( LIBFPTR_PARAM_BARCODE,   xStrSCod_)                ! Данные штрихкода
     Self.SetParamInt( LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER)  ! Выравнивание: по центру
     Case xVidCode_
     Of 2 OrOf 4  ! EAN13
        Self.SetParamInt( LIBFPTR_PARAM_BARCODE_TYPE,       LIBFPTR_BT_EAN_13)  ! Тип штрихкода: EAN13
        Self.SetParamBool(LIBFPTR_PARAM_BARCODE_PRINT_TEXT, True)               ! Печать текста
     Of 3 OrOf 5  ! QRCode
        Self.SetParamInt( LIBFPTR_PARAM_BARCODE_TYPE,       LIBFPTR_BT_QR)      ! Тип штрихкода: QRCode
        Self.SetParamInt( LIBFPTR_PARAM_SCALE,              6)                  ! Масштаб
     end
     If libfptr_print_barcode(Self.fptr) = LIBFPTR_OK
        Self.LastSeparator = False
        If InRange(xVidCode_,2,3)
           Self.SetParamInt(LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER)  ! Выравнивание ТЕКСТА
           Self.PrintText(xStrText_,LIBFPTR_TW_NONE,0)
        end
     else
        Self.ErrorMessage('libfptr_print_barcode')
     end
  end
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 7:28
				 Admin
				Приветствую всех.
Понадобилось добавить маркировку к молочке и воде. Ну и соответственно встали вопросы.
Товар с маркировкой по одной штуке в чек отдается? 
Т.е. купили 10 пакетом молока, я должен их по одному каждый со свое маркировкой отдать в ККТ и  на чеке 10 позиций будет?
Игорь Столяров, к тебе вопрос. Подсмотрел твой код:
Код: Выделить всё
If Clip(QSpisok.Dump) <> '' then Self.SetParamBiteArray(LIBFPTR_PARAM_MARKING_CODE,Self.RecodeMarking(QSpisok.Dump)).
Это рабочий код?  Т.е. строку со сканера ты просто в Dump кидаешь?
А что за копирование делает метод RecodeMarking?
И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.
Можно мне как то расписать что делать? 
Ну и коды у меня (со сканера) какие то коротенькие... типа 
Код: Выделить всё
0104607004890062215KXIXZ^93Z/9z сыр
0104607091303254215oG3Fk^93U+m+ молоко
Там где ^ = CHR(29)
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 8:34
				 Игорь Столяров
				Admin писал(а): 29 Ноябрь 2021, 7:28
И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.
 
У меня метода ParseMarkingCode() добавляет в код маркировки коды <29>, которые съел сканер.
Если у Вас сканер возвращает марку с служебными кодами -> Вы сразу её передаёте в КММ в том
виде как получили со сканера:
Код: Выделить всё
  Self.SetParamInt(      LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT_OTHER)  ! Для ФФД 1.1 тип марки
  Self.SetParamBiteArray(LIBFPTR_PARAM_MARKING_CODE, QSpisok.Dump).
 
Admin писал(а): 29 Ноябрь 2021, 7:28
Товар с маркировкой по одной штуке в чек отдается?
Т.е. купили 10 пакетом молока, я должен их по одному каждый со свое маркировкой отдать в ККТ и на чеке 10 позиций будет?
 
Абсолютно верно. То же самое и давно, если покупать 10 бутылок водки или пар кроссовок ...
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 8:44
				 Admin
				Admin писал(а): 29 Ноябрь 2021, 7:28
А что за копирование делает метод RecodeMarking?
И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.
 
Такс давай уточним все таки. По RecodeMarking я все понял. У нас сканер не сжирает код. Нам это похоже не нужно.
А дальше ты передал код в АТОЛ но не вижу вызова 
libfptr_parse_marking_code
Я вот про этот код как на картинке. Типа если ты средствами ККТ декодируешь код то потом должен сам его в 1162 записать.
И вот этого я у тебя и не вижу. Может ты уже чего нового написал? 
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 8:53
				 Игорь Столяров
				Admin писал(а): 29 Ноябрь 2021, 8:44
Может ты уже чего нового написал
 
Нет. Просто Вы пытаетесь смотреть сериал с 4-ой серии 3-го сезона. 

Действительно, вначале марку нужно было разбирать, и каждый компонент записывать в свой тег.
Если Вам так в жизни повезло, то сейчас всё упростилось - просто передаём марку как массив байт
(единственная засада - но она легко обходится) и дальше добрый драйвер всё сделает сам ... см. рисунок.
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 9:00
				 Admin
				Игорь Столяров писал(а): 29 Ноябрь 2021, 8:53
Если Вам так в жизни повезло
 
 
 
			 
			
					
				ATOL драйвер 10.x
				Добавлено: 29 Ноябрь 2021, 9:35
				 Admin
				Дело за малым, прошить тестовый ККТ до ФФД 1.2
А то на текущей версии не работает маркировка.