Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > КИС Lack & УС Land

API ЕГАИС (УТМ). Использование нового механизма получения данных от ЕГАИС в программе "УС Лэнд:ЕГАИС" : КИС Lack & УС Land

24.04.2024 19:19


18.01.2022 14:33
AndreyZh
 
М.Исаковский

Снова замерло всё до рассвета —
Дверь не скрипнет, не вспыхнет огонь.
Только слышно — на улице где-то
Одинокая бродит гармонь:
То пойдёт на поля, за ворота,
То обратно вернется опять,
Словно ищет в потёмках кого-то
И не может никак отыскать
... Навеяло от активности народа на форуме


Вместе с УТМ 4.х появился новый способ доступа к данным ЕГАИС, описанный со страницы 19 мануала по УТМ. Самая актуальная справка доступна по ссылке:

В отличии от классического способа получения данных через запрос -> ожидание ответа -> обработка ответа, в новом способе доступ к данным происходит мгновенно... Как понял в начале через api происходит обращение к БД УТМ, а если ответ не получен, то происходит обращение напрямую к БД ЕГАИС

Начальной иллюстрацией использования данного механизма в "УСЕга" - проверка принадлежности марки подразделению. Эта тема так же популярна на форумах ЕГАИС.

Добавил эту возможность к "древнему" режиму получения информации от ЕГАИС:





приходит ответ, обрабатывается, как описано: выдаётся результат - приведено сразу два взаимоисключающие:





по выходу - нажатию любой кнопки стирается рабочий временный файл. Продолжение следует...
20.01.2022 15:28
AndreyZh
 
Сегодня наткнулся на уточнения по api проверки марок... Конечно во всех "новостях" (обсуждениях) по ЕГАИС нужно смотреть актуальность и учитывать, что зачастую новшества в ЕГАИСе работают неправильно! Так же в приведенных обсуждениях появляются идеи, до которых сам не догадался... Оставлю это как примечания:

markers » Вчера, 05:50 на примечание fkr: что-то у меня закрались устойчивые сомнения по поводу того, что это действительно онлайн проверка.. Скорее всего - это никакая не онлайн проверка в её прямом понимании (как разъяснено в Букваре по УТМ), а лишь онлайн верификация марки, т.е. проверка, что такая марка действительно существует в системе и действительно принадлежит определённому FSRAR_ID, и всё.

Вопрос формального названия, конечно актуальный. Но, данная проверка, работает и дает понимание, какие марки всё ещё на балансе магазина, а какие уже нет (т.е. если марка продана или списана, то данная проверка вернет отрицательный ответ). Т.е. это не формато-логический контроль, а проверка, в наличии марка по определенному FSRAR_ID или нет. Во всяком случае, у меня она интегрирована в УС и позволяет ответить на вопрос, марка ещё в наличии или уже продана, но у нас по каким-то причинам в УС это не отразилось или обратные ситуации. Если конечно, как обычно в тихаря, не поменяли всё. Но жалоб не поступало.

PS: В отличии старого механизма (проверка по фильтру), данный API метод:

1) Работает стабильно (Так как не нужен фильтр и не важно его состояние)
2) Не встречались пока ложно-положительные и ложно-отрицательные ответы (что было в изобилии в проверке по фильтру)
3) Работает со старыми марками.


Появилось замечание со ссылкой на переписку с ТП ФСРАР... Воспринял технику проверки марок, как неработающую, пока не обратил внимание на дату, хотя на переписку ссылались в свежем сообщении:

tradition » Вчера, 15:59 На свежее замечание - "Вклинюсь в ваше обсуждение. Верификация работает не всегда корректно. У меня был пример, когда марка уже давным давно была списана чеком (при этом даже не у нас, а у нашего покупателя, мы - оптовик), но при этом верификация заявляла, что марка числится за нами (возвращала TRUE). Я об этом написал в ЛК, меня отшили... а можете приложить сюда ваше обращение в ЛК, ответ, ну и сам пример?





… и ещё одно полезное свойство нового сервиса с доступом через api:

Как вариант: Пришла квитанция о пересорте (кто-то привязал к себе 3 марки). Задача - найти 3 лишних марки, которые по факту есть у нас, но в ЕГАИС они за нами не числятся. Да, можно сделать запрос остатков ЦИ и сравнивать с ним, а можно напрямую реализовать функционал на ТСД, и результат будет сразу у кладовщика на экране, минуя при этом УС. Пикнул марку - не числится за нами, сразу отложил в сторону. И так далее, пока не найдет все 3 марки. Ну а далее уже посредством УС устранить пересортицу. Как бы не сильно выигрыш имеем, но почему бы и нет


Ещё раз напомню, что вызовы через api работают мгновенно, в отличии привычного механизма запрос-ответ
29.01.2022 11:52
AndreyZh
 
Как выявилось - api технически несложный механизм и легко реализуемый специалистами. По мне главное его достоинство - мегабыстрое по меркам ЕГАИС получение информации. Получить можно POST, cULR запросом или просто, копируя запрос в броузер, например для получения информации об текущей организации нужно отправить запрос:
Код:
curl -X GET http://localhost:8080/api/gost/orginfo > reply.txt
Правда ответ возвращается в непривычном, хоть и структурированном,,для разработчиков виде:
Цитата:
{"surname":"В------ов","givenname":"И---------------ч","t":"ДИРЕКТОР","street":"УЛИЦА С--------Я, 29 "Б"","cn":"ООО "П-------------Л"","ou":null,"o":"ООО "П-------------Л"","l":"ГОРОД САРАТОВ","st":"Саратовская область","c":"RU","emailaddress":"A---------------m","inn":"64------31","ogrn":"10---------30","snils":"0--------93","kpp":null,"from":"21.12.2021 12:30:10+0400","to":"21.03.2023 12:40:10+0400","serial":"17de8e0005ae96b641c089421b9ead9b"}
Для "укрепления" данной технологии в памяти, хотя и область её применения более обширная, сделал отчетик:




За пару секунд получаются ответы на три запроса, программа их "разбирает" по созданным универсальным алгоритмам и даёт результат:
Код:
Справка по запросу к ЕГАИС от 22.01.22 09:50:23 по организации:

ООО "ПР------------Л"                                                           

ФСРАР id подразделения: 030000-----5
ИНН: 6452----31 КПП: null ОГРН: 10664-------0
Алкогольная лицензия действующая

Адрес:
Саратовская область
ГОРОД САРАТОВ
УЛИЦА С-------АЯ, 29 "Б"

Руководитель:

ДИРЕКТОР Ви------в И--я В----------ч
СНИЛС:  07--------3
e-mail: And--------up.com

Контур ЕГАИС:  ТЕСТОВЫЙ
Данные по сертификатам:

ГОСТ. Выдан 2021-12-21 12:30:10 Действителен до 2023-03-21 12:40:10
УЦ:   ООО "КОМПАНИЯ "ТЕНЗОР"

Rsa.  Выдан 2021-12-21 14:39:46 Действителен до 2022-12-21 14:49:46
БД УТМ от 2021-12-17 14:43:58.009
UUID подразделения: 17de8e0005ae96b641c089421b9ead9b
Ваша версия УТМ:    4.2.0, редакция (сборка, build): 002470


P.S. На будущее всё разработано, отлажено, документировано. Можно будет что-то делать для реальных будущих задач. Напрашивается, что нужно было 5 лет назад - автоматическое задание большинство настроек программы для ЕГАИС - "УС Лэнд:ЕГАИС" при первом запуске, вместо замороченной её настройки в процедуре настройки... или процесс чтения/удаления документов из очереди УТМ может с api занимать доли секунды, а не десятки минут, как сейчас.
09.04.2022 09:21
AndreyZh
 
Облом! Сегодня предполагал отдохнуть от реальных задач, проведать огород и поделать домашние уличные дела... Однако в ночь зарядил дождь, который не собирается прекращаться... Пришлось отдыхать через смену видов работ, например вспомнить технику API и сделать что-нибудь просто так... В локальной БД УТМ, т.е. не нужен ключ и связь с интернет хранятся и обновляются обрабатываемые УТМ схемы документов ЕГАИС, которые можно запросить через API запросами:

Цитата:
/api/schema/list Запрос на получение списка схем с описанием
/api/schema/{name}
Всё равно делать нечего - слабал сервисный режим, вызываемый:




Необходимую для анализа, сохранения схему циклически выбираем из меню актуальных схем:




Опосля программа запрашивает устройство печати. Сохраняю в Win *.txt файл:




На выходе получаем информацию:
XSD Схема чека версии №3:
Код:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.0"
           xmlns:ns="http://fsrar.ru/WEGAIS/ChequeV3"
           targetNamespace="http://fsrar.ru/WEGAIS/ChequeV3"
           
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:c="http://fsrar.ru/WEGAIS/Common"
		   xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef_v2"
>

<xs:import namespace="http://fsrar.ru/WEGAIS/Common" schemaLocation="EGCommon.xsd"/>
<xs:import namespace="http://fsrar.ru/WEGAIS/ProductRef_v2" schemaLocation="ProductRef_v2.xsd"/>

  <xs:complexType name="ChequeV3Type">
    <xs:annotation>
      <xs:documentation>Чек, чек возврата, розница по безналу</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Identity" type="c:NoEmptyString50" nillable="false" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Идентификатор чека</xs:documentation>
        </xs:annotation>
      </xs:element>
		  <xs:choice>
      		  <xs:element name="Header" type="ns:Header" minOccurs="1" maxOccurs="1"/>
      		  <xs:element name="HeaderTTN" type="ns:HeaderTTN" minOccurs="1" maxOccurs="1"/>
		  </xs:choice>
	    <xs:element name="Content">
                <xs:annotation>
                  <xs:documentation>Содержимое чека</xs:documentation>
                </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:choice minOccurs="1" maxOccurs="unbounded">
                  <xs:element name="Bottle" type="ns:Bottle"/>
                  <xs:element name="Nomark" type="ns:Nomark"/>
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
          <xs:unique name="BAR">
            <xs:selector xpath="ns:Bottle"/>
            <xs:field xpath="ns:Barcode"/>
          </xs:unique>
          <xs:unique name="posid">
            <xs:selector xpath="ns:Nomark"/>
            <xs:field xpath="ns:PosIdentity"/>
          </xs:unique>
        </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Header">
    <xs:annotation>
      <xs:documentation>Чек, чек возврата</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Date" type="c:DateWTime" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Kassa" type="c:NoEmptyString50" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Shift" type="ns:COUNT" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Number" type="ns:COUNT" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Type" type="ns:TYPE" minOccurs="1" maxOccurs="1"/>
      <xs:element name="ConfirmOrder" type="c:NoEmptyString50" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="HeaderTTN">
    <xs:annotation>
      <xs:documentation>Розничная продажа по безналичному расчету</xs:documentation>
    </xs:annotation>
    <xs:sequence>
	  <xs:element name="Date" type="c:DateNoTime" minOccurs="1" maxOccurs="1"/>
	  <xs:element name="BillNumber" type="c:NoEmptyString50" minOccurs="1" maxOccurs="1"/>
	  <xs:element name="TTNNumber" type="c:NoEmptyString50" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Type" type="ns:TYPE" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Bottle">
    <xs:annotation>
      <xs:documentation>Маркированная продукция</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Barcode" type="c:Barmix" minOccurs="1" maxOccurs="1"/>
      <xs:element name="EAN" type="c:EANType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Price" type="c:NoNegativeDecimalType" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Nomark">
    <xs:annotation>
      <xs:documentation>Пиво</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="PosIdentity" type="c:IdentityType" nillable="false" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Product" type="pref:ProductInfo_v2" minOccurs="1" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Информация о продукции</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Quantity" type="c:PositiveDecimalType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="EAN" type="c:EANType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Price" type="c:NoNegativeDecimalType" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="COUNT">
    <xs:annotation>
      <xs:documentation>Целые не ноль и без ведущего нуля</xs:documentation>
    </xs:annotation>
        <xs:restriction base="xs:integer">
            <xs:pattern value="[1-9][0-9]{0,9}" />
        </xs:restriction>
    </xs:simpleType>
  <xs:simpleType name="TYPE">
    <xs:annotation>
      <xs:documentation>Справочник типов чеков</xs:documentation>
    </xs:annotation>
    <xs:restriction base="c:NoEmptyString50">
      <xs:enumeration value="Продажа">
        <xs:annotation>
          <xs:documentation>Чек продажи</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="Возврат">
        <xs:annotation>
          <xs:documentation>Чек возврата</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Возвращаемся к выбору другой схемы из списка или выходим из режима...
Часовой пояс GMT +3, время: 19:19.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.