Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Модератор: Дед Пахом

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

Привет всем !

Класс для разрешительной проверки КМ (кодов маркировки) через API ТС ПИоТ ЕСМ от АО «ЕСП».
Поддержка работы с API ЦРПТ: ПО Локальный модуль и Национальный каталог.
Полный боевой комплект с описанием интерфейса API и примерами.

Реализованный в классе функционал соответствует ПФС версии 1.18 от 26.06.2026 г. (27 сценариев),
для получения сертификата совместимости и допуска к работе в промышленной среде ТС ПИоТ ЦРПТ. 😎

Благодарность за помощь на старте проекта: FinsoftRZ и Alex412.
Любые замечания, исправления и дополнения - приветствуются !

Список изменений в версии от 19.07.2026 г.
----------------------------------------------------------------------------------------------------
- Внесены изменения по Методическим рекомендациям ЦРПТ версии 17 от 15.07.2026 г.
- Устранены проблемы по запросам и внесены изменения в примеры.
----------------------------------------------------------------------------------------------------
Рекомендуем использовать актуальные версии классов LibCURL, cJSON и PrintF.

esp.png
esp.png (13.96 КБ) 192507 просмотров
Вложения
Honest.rar
Пароль: крайний С6 релиз
(59.27 КБ) 6 скачиваний
Последний раз редактировалось Игорь Столяров 19 Июль 2026, 21:07, всего редактировалось 137 раз.
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

StillZero писал(а): 19 Июль 2026, 14:31 254 возвращает твой метод
Мой метод всё обрабатывает, по-крайне в то время когда я его делал.
Причём это тот случай с костылём, когда мы получаем статус ответа на запрос 200, а внутри содержится код ошибки 204:

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

     ! Успешное выполнение запроса и получен результат от ТС ПИоТ
     If lStatus = 200
        
        ! Проверка кода ошибки внутри ответа на запрос
        If Json.ToGroup(Self.ResponseBuffer,gResponse) and gResponse.Code > 0
        
           If gResponse.Code <> 204  ! Не показывать сообщение при работе в поставарийном режиме
              Honest::Message('Место проблемы:   ' & sPlace          & '|'  & |
                              'HTTP статус:      ' & lStatus         & '||' & |
                              'Код ошибки:       ' & gResponse.Code  & '|'  & |
                              'Ошибка:           ' & json::FromUTF8(gResponse.message) & |
                              csApiHost)
           end                   
                        
           lStatus = -gResponse.Code  ! Код ошибки внутри успешного ответа на запрос (сообщение уже показано)
        end
        
        ! Сброс флага 203 ошибки для контроля повторов
        If Sub(sPlace,1,4) = 'PIoT' and lStatus = 200 then PIoT:FlagError203 = False.

Далее получив код 204 внутри ответа ТС ПИоТ класс выполняет попытку выполнить проверку пакета КМ
напрямую через локальный ПО ЛМ для получения данных тега 1260 для чека, что бы корректно выполнить выбытие марок:

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

  ! Обработка ошибки по статусу HTTP при неработающем ТС ПИоТ
  ! Статус 203 я здесь добавил, что бы получить данные для печати чека
  elsIf InList(lStatus,203,204,500,504) > 0 Or InRange(lStatus,514,520) Or InList(lCode,500,504,5000) > 0

     ! Обрабатываемые HTTP статусы
     ! 203        Аварийный режим (нет списка с результатом, но считаем, что проверка выполнена)
     ! 204        Поставарийный режим (код в теле ответа)
     ! 500        Internal Server Error - внутренняя ошибка сервера при обработке запроса
     ! 504        Gateway Timeout - превышено время ожидания ответа от upstream сервиса  
     ! 514 - 520  Требуется проверка в ПО ЛМ при неработающем ТС ПИоТ

     ! Пробуем подключиться к ПО ЛМ «Честный ЗНАК»
     ! Параметры подключения не передаём, т.к. всегда после Init()
     If Self.POLM_Login()

И видимо из-за отсутствия у Вас на компьютере проинициализированного ПО ЛМ далее уже возвращается
код 254 - ПРОВЕРКА НЕ ВЫПОЛНЕНА.

Если этот разбор по коду класса должен был делать именно я - то я его сделал.
Если Вас не устраивает предлагаемое решение и Вы хотите самостоятельно получить и
обработать код 204 - добавляйте метод Self.CheckResponse_MyEdition() и обрабатывайте.
Главное, что бы было понимание всего цикла процесса продажи маркированного товара. :D
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
StillZero
Ветеран
Сообщения: 468
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Благодарил (а): 5 раз
Поблагодарили: 1 раз
Контактная информация:

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение StillZero »

мы получаем статус ответа на запрос 200, а внутри содержится код ошибки 204:
Верно, об этом речь.
Мой метод всё обрабатывает
Напомню, что я говорю о продаже товара в пост-аварийном режиме.

Метод: HonestClass.CheckResponse Procedure(String sPlace) !,Long

Код из него, который ты приводил выше:

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

gResponse   Group(PIoT:G_Result).
...
     If lStatus = 200
        ! Проверка кода ошибки внутри ответа на запрос
        If Json.ToGroup(Self.ResponseBuffer,gResponse)  and gResponse.Code > 0
           If gResponse.Code <> 204  ! Не показывать сообщение при работе в поставарийном режиме
              Honest::Message('Место проблемы:   ' & sPlace          & '|'  & |
                              'HTTP статус:      ' & lStatus         & '||' & |
                              'Код ошибки:       ' & gResponse.Code  & '|'  & |
                              'Ошибка:           ' & json::FromUTF8(gResponse.message) & |
                              csApiHost)
           end                   
Часть ответа с сервера:

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

{"codesResponse":[{"code":204,"description":"ok","codes":[{"cis":"010481
Этот ответ типа PIoT:G_Response. Таким образом gResponse.Code (типа PIoT:G_Result) в данном случае всегда будет равно нулю.

И эта строка не сработает на 204 тоже, так как в ответе 200:

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

  elsIf InList(lStatus,203,204,500,504) > 0 Or InRange(lStatus,514,520) Or InList(lCode,500,504,5000) > 0
Таким образом код 204 обрабатывается некорректно сейчас.

Игорь, подтверди, пожалуйста, мои выводы.
по аэродрому...
Аватара пользователя
StillZero
Ветеран
Сообщения: 468
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Благодарил (а): 5 раз
Поблагодарили: 1 раз
Контактная информация:

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение StillZero »

С казябрами сам себе отвечу. Игорь почти везде пишет в файл так:

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

Self.Debug('PIoT_CheckCodes_Request',Root,CP_ACP)
если писать без указания кодировки, то русский отображается корректно в файле в UTF-8

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

gContact.lDebugCodePage = CP_UTF8 ! не знаю влияет ли, код метода Debug не смотрел
Self.Debug('PIoT_CheckCodes_Request',Root)
по аэродрому...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

StillZero писал(а): 20 Июль 2026, 5:52 почти везде пишет в файл так
Абсолютно верно. Потому что по общему правилу мы смотрим в протоколе UTF-8 данные из программы в ANSI.
Параметр gContact.lDebugCodePage определяет кодировку записи протокола обмена пакетами (см. примеры).
Если пакет не содержит данных в ANSI, наверно можно указать что данные уже в UTF-8 (не проверял):

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

  Self.Debug('PIoT_CheckCodes_Request',Root,CP_UTF8)
Здесь мы опять приходим к теме, на которую всем пофиг: viewtopic.php?f=29&t=5373
В классе CJSON все перекодировки полей нужно делать в ручном режиме. Позиция автора: Вам надо, Вы и делайте.
К чему я присоединяюсь и тоже желаю удачи Вам. Но неискренне. :D
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

StillZero писал(а): 20 Июль 2026, 5:46 Таким образом код 204 обрабатывается некорректно сейчас.
OK ! Давайте я по другому скажу. Ошибка 204 обрабатывается внутри класса.

Простой вопрос: что Вы хотите делать получив в ПМСР ошибку 204 работы в поставарийном режиме ?
Да и после ошибки 203 тоже. Подумайте пожалуйста. Отправлять пакет без тега 1260 ?

Это называется нарушение (продажа КМ без штампа о прохождении разрешительной проверки).
Ведь о том, что у Вас локальный ТС ПИоТ находится в аварийном режиме ОФД и Честный ЗНАК не знают.
Наверно, потом будет какая-то процедура написания заявок с приложением пртокола ТС ПИоТ для отмены штрафов ...

Если у Вас ботан сидит на обслуживании одной программы и контролирует состояние обмена - это решение.
У нас серийные программы для предпринимателей. Поэтому в случае многочисленных вариантов отказа ТС ПИоТ,
мы пытаемся совершить продажу (получить тег 1260 для чека) с помощью ПО Локальный модуль.
В т.ч. и с использованием токена из ТС ПИоТ (пока не доступно). И если нам это не удаётся - то выдаётся
код 254 о невозможности выполнения проверки КМ. Мы в этом случае отказываем в печати чека с КМ.

А Вы можете отправить чек на печать. Ведь свой опыт всегда ценится больше чем чужой. :D

ПРЕДЛАГАЕМОЙ В ЭТОЙ ТЕМЕ РЕШЕНИЕ ЯВЛЯЕТСЯ НАШЕЙ РЕАЛИЗАЦИЕЙ РАБОТЫ С ТС ПИоТ И
НЕ ПРЕТЕНДУЕТ НА КАКУЮ-ЛИБО АКАДЕМИЧЕСКУЮ ПОЛНОТУ ВЫОЛНЕННИЯ ПРОТИВОРЕЧИВЫХ
И МЕНЯЮЩИХСЯ ОПИСАНИЙ ТС ПИоТ (которых на самом деле 3 версии: ЦРПТ, ПО ЛМ и ЕСМ).
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
StillZero
Ветеран
Сообщения: 468
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Благодарил (а): 5 раз
Поблагодарили: 1 раз
Контактная информация:

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение StillZero »

Игорь Столяров писал(а): 20 Июль 2026, 6:59 что Вы хотите делать получив в ПМСР ошибку 204 работы в поставарийном режиме ?
В методичке ребята предлагают разрешить продажу в 203 и в 204, как в оффлайн режиме.
по аэродрому...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

StillZero писал(а): 20 Июль 2026, 7:04 как в оффлайн режиме
Давайт не будем пытаться удивлять девушек владением иностранной терминологией ! :D
Что значит "оффлайн режим" для разрешительной проверки ? Она ведь не записывается как чеки в ФН.
Off-Line проверка КМ выполняется через установленный на компьютере ПО Локальный модуль.
Что собственно, класс и делает для Вас. 🤦‍♂️
Последний раз редактировалось Игорь Столяров 20 Июль 2026, 8:58, всего редактировалось 1 раз.
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 6083
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 25 раз
Поблагодарили: 90 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение finsoftrz »

Игорь, пиот по какой-то причине не работает, магазин встал и теряет деньги и покупателей, это так себе решение.

Кстати, у нас тут контора, которая занимается обслуживанием касс и продает своё кассовое ПО, разработала свой пиот. Сейчас проходят сертификацию, но для сп и ещё какой-то модели, не для основных атол/штрих.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

Я понимаю, что сейчас приоритетной является задача расматривания своего ПМСР в протоколах. :D
Но если будет возможность - посмотрите пожалуйста прилагаемый документ.
Вложения
ЦРПТ - Методические_рекомендации_по_взаимодействию_с_ЛМ_ЧЗ_при_нерабочем ТС ПИоТ_вер1 (1).pdf
(450.69 КБ) 6 скачиваний
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

finsoftrz писал(а): 20 Июль 2026, 7:20 у нас тут контора
Таких контор много. Например: https://rr-electro.ru/news/ts-p-io-t-dl ... rr-elektro
Но у всех одна ошибка - они считают, что сертификация это вопрос технологий.
А на самом деле это вопрос финансирования разработок ЦРПТ. :D
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 6083
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 25 раз
Поблагодарили: 90 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение finsoftrz »

Игорь Столяров писал(а): 20 Июль 2026, 7:23 Я понимаю, что сейчас приоритетной является задача расматривания своего ПМСР в протоколах. :D
Но если будет возможность - посмотрите пожалуйста прилагаемый документ.
Ну да, рекомендация самостоятельно проверять маркировку через ЛМ, если недоступен пиот, была давно. Я думал, Вы просто запрещаете продажу, если получаете техническую ошибку от пиот. В Ваш класс давно не заглядывал.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 6083
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 25 раз
Поблагодарили: 90 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение finsoftrz »

Игорь Столяров писал(а): 20 Июль 2026, 7:27
finsoftrz писал(а): 20 Июль 2026, 7:20 у нас тут контора
Таких контор много. Например: https://rr-electro.ru/news/ts-p-io-t-dl ... rr-elektro
Но у всех одна ошибка - они считают, что сертификация это вопрос технологий.
А на самом деле это вопрос финансирования разработок ЦРПТ. :D
Я думаю, они все понимают. Скорее всего, решили зарабатывать на не очень широко распространенных моделях ккм, у них много где кассовая программа стоит.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
StillZero
Ветеран
Сообщения: 468
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Благодарил (а): 5 раз
Поблагодарили: 1 раз
Контактная информация:

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение StillZero »

Внес изменения в код Honest.clw для продажи товара в пост-аварийном режиме https://esm-emu.ao-esp.ru/mark/22?mode=online.
Изменения помечены комментарием КОСТЫЛИ 204.
На первый взгляд ничего не поломал и тест теперь работает.

Изменил код метода HonestClass.CheckResponse:

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

!!! Проверка ответа сервиса
HonestClass.CheckResponse  Procedure(String sPlace) !,Long
Json        cJSONFactory
gResponse   Group(PIoT:G_Result).
! --------------- КОСТЫЛИ 204 -------------------------
gResponse204 GROUP(PIoT:G_Response). 
! --------------- КОНЕЦ КОСТЫЛИ 204 -------------------------
lStatus     Long(0)       ! Возвращаем HTTP статус запроса
csApiHost   cString(121)  ! Версия API и хост сервиса

  Code
     ...
     ! Успешное выполнение запроса и получен результат от ТС ПИоТ
     If lStatus = 200
        
        ! Проверка кода ошибки внутри ответа на запрос
        If Json.ToGroup(Self.ResponseBuffer,gResponse) and gResponse.Code > 0
        
           If gResponse.Code <> 204  ! Не показывать сообщение при работе в поставарийном режиме
              Honest::Message('Место проблемы:   ' & sPlace          & '|'  & |
                              'HTTP статус:      ' & lStatus         & '||' & |
                              'Код ошибки:       ' & gResponse.Code  & '|'  & |
                              'Ошибка:           ' & json::FromUTF8(gResponse.message) & |
                              csApiHost)
           end                   
                        
           lStatus = -gResponse.Code  ! Код ошибки внутри успешного ответа на запрос (сообщение уже показано)
        end

        ! --------------- КОСТЫЛИ 204 -------------------------
        If json.ToGroup(Self.ResponseBuffer, gResponse204)
           If gResponse204.codesResponse[1].code = 204 
              lStatus = -204
              Self.Message('ВНИМАНИЕ !||Продажа товара в поставарийном режиме работы ТС ПИоТ.')
           end
        end
        ! --------------- КОНЕЦ КОСТЫЛИ 204 -------------------

        ! Сброс флага 203 ошибки для контроля повторов
        If Sub(sPlace,1,4) = 'PIoT' and lStatus = 200 then PIoT:FlagError203 = False.
        
        ...
Изменил код метода HonestClass.PIoT_CheckCodes:

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

        ...
        ! Получен ответ об успехе
        If lStatus = 200
           If json.ToGroup(Self.ResponseBuffer,gResponse,, |
               '[{{"name":"codes", "Instance":' & Instance(qResponse,Thread())  & '},' & |
                '{{"name":["valid","verified","found","realizable","utilised",' & | 
                          '"isBlocked","isCheckedOffline","isOwner",'           & |
                          '"isTracking","sold","grayZone"],"IsBool":true},'     & |
                '{{"name":"VarDate1",  "JsonName":"1"},'  & |  ! Вариативные сроки годности
                '{{"name":"VarDate2",  "JsonName":"2"}]')      ! {"1":"VALUE1","2":"VALUE2"}
                
              !Message('Records(qResponse) = ' & Records(qResponse))
  
              ! Если нет ошибок обработки запроса и получен список проверки КМ                             
              If gResponse.codesResponse[1].code = 0 and Records(qResponse) > 0
                 bRetVal = 1  ! Предполагаем что все КМ в списке успешно прошли проверку                 
              else 
                 lCode   = gResponse.codesResponse[1].code  ! = 500,504,5000
              end                
           end  ! If json.ToGroup( 
        
        ! Есть код ошибки внутри успешного ответа на запрос
        elsIf lStatus < 0    
           lCode = -lStatus
           ! --------------- КОСТЫЛИ 204 -------------------------
           IF lStatus = -204 THEN lStatus = 204. 
           ! --------------- КОНЕЦ КОСТЫЛИ 204 -------------------
        end  ! If lStatus = 200
        ...
по аэродрому...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8745
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 40 раз
Поблагодарили: 149 раз

Класс для API ТС ПИоТ ЕСМ от АО «ЕСП»

Сообщение Игорь Столяров »

StillZero писал(а): 20 Июль 2026, 10:35 Изменил код метода HonestClass.CheckResponse:
Отлично ! Но долго ...
И красивей, тогда уже, было бы просто засабклассить метод HonestClass.CheckResponse() и всё.

Видимо это судьба публичного проекта ходить по кругу, и я ещё раз хочу сказать,
что ПФС - это лоховской тест на базовые навыки работы с API ТС ПИоТ, который сдаётся за 5 минут.
Он ни в коем случае не отражает всю технологию работы с ТС ПИоТ, и тем более всей разрещительной проверки,
которая в настоящий момент состоит из 4 компонент:
- ЦРПТ ГИС МТ;
- ЦРПТ ПО Локальный модуль;
- ТС ПИоТ / ЕСМ;
- Национальный каталог маркированных товаров.

Я не разу не видел в реальной работе 203/204 ошибки, а вот 400/500 - полно. Но в ПФС их обработки неть ! 🤷‍♂️
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Ответить