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

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8740
Зарегистрирован: 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 КБ) 191201 просмотр
Вложения
Honest.rar
Пароль: крайний С6 релиз
(59.27 КБ) 1 скачивание
Последний раз редактировалось Игорь Столяров 19 Июль 2026, 21:07, всего редактировалось 137 раз.
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8740
Зарегистрирован: 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
Ветеран
Сообщения: 466
Зарегистрирован: 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
Ветеран
Сообщения: 466
Зарегистрирован: 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)
по аэродрому...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8740
Зарегистрирован: 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
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Ответить