Получить информацию из PDF417

Форум для обсуждения вопросов по подключению к системе ЕГАИС ОПТ и Розница

Модераторы: Operator 2, Operator 4, Operator 1

Правила форума
В данном разделе сообщения оставляются по следующим правилам.
- данный раздел создан исключительно для помощи в подключении к ЕГАИС.
- участники попытавшиеся оставить сообщения не в своей теме (не относящиеся к проблеме автора) немедленно утрачивают доступ к этому разделу.
- в данном разделе задаются только конкретные технические вопросы.
- за весь офтоп и ненормативную лексику будут выдаваться предупреждения, блокирующие на произвольное время доступ на форум
antonn
Сообщений: 400
Зарегистрирован: 12 янв 2016, 13:34

Получить информацию из PDF417

Сообщение antonn » 23 янв 2016, 14:40

Добрый день, как получить информацию по/из акцизной марки? Например производителя. Автоматизированными средствами, конечно (например через xml аналогично другим документам УТМ).
VBulat
Сообщений: 94
Зарегистрирован: 04 дек 2015, 10:47
Откуда: Симферополь

Re: Получить информацию из PDF417

Сообщение VBulat » 23 янв 2016, 16:51

Из полезной информации пока удается извлекать только алкокод.
viewtopic.php?f=4&t=2132&start=10
leonidt84
Сообщений: 52
Зарегистрирован: 26 ноя 2015, 19:07

Re: Получить информацию из PDF417

Сообщение leonidt84 » 23 янв 2016, 18:44

А по алкокоду можно через QueryAP получить ProductRef и узнать производителя/импортера, вид продукции, емкость, крепость и наименование, правда через ЕГАИС, который далеко не мгновенно отвечает
antonn
Сообщений: 400
Зарегистрирован: 12 янв 2016, 13:34

Re: Получить информацию из PDF417

Сообщение antonn » 23 янв 2016, 19:06

Спасибо про наводку с алккодом, продублирую на всякий случай в своей теме код получения его из pdf.

по ссылке была на 1С, переписал на шарпе (проверил на нескольких кодах, вроде работает верно):

Код: Выбрать все

public string GetAlcoCodeFromPDF417(string pdf417)
        {
            if (pdf417.Length == 68)
            {
                string base_sys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                string sub = pdf417.Substring(7, 12).ToUpper();

                UInt64 ex = 1;
                UInt64 alccode = 0;
                int k;
                for (int i = sub.Length; i > 0; i--)
                {
                    k = base_sys.IndexOf(sub[i - 1]);
                    alccode = alccode + (UInt64)k * ex;
                    ex = ex * 36;
                }
               
                sub=alccode.ToString();
                if (sub.Length < 19) {
                    sub = sub.PadLeft(19, '0');
                }

                return sub;
            }
            else {
                throw new Exception("Длина не соответствует PDF417.");
            }
        }


на delphi:

Код: Выбрать все

function GetAlcoCodeFromPDF417(const pdf417:string): string;
var i:integer; base_sys,sub: string;
    ex,alccode,k: int64;
begin
  base_sys:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  sub := UpperCase(copy(pdf417,8,12));
  ex:=1;
  alccode:=0;
  for i:=length(sub) downto 1 do begin
     k:=pos(sub[i],base_sys)-1;
     alccode:=alccode+ k*ex;
     ex:=ex*36;
  end;

  result:=IntToStr(alccode);
  if(length(Result)<19) then
    result:=StringOfChar('0', 19 - length(Result))+Result;
end;



А не подскажите еще такую штуку... Мне нужно оператору/эксперту при сканировании партии по-человечески ругнуться, что отсканированная марка (бутылка) должна быть исключена для работы (например потому что она уже числится принятой на складе). Разумеется человек не сможет понять что марка "22N00001CJFID****" требует удаления, но заметил, что на самой бумажной марке есть два строковых кода, которые дублируются в самой марке с 20 символа (как раз после алккода, один на 12 символов, второй на 6). Эти два кода расположены возле марки (могу картинку вставить, если не понятно). Вопрос - эти коды уникальны для марки (да и вообще что они означают)? чтобы я мог их использовать для указания конкретной бутылки.
Steel Rain
Сообщений: 510
Зарегистрирован: 21 дек 2015, 11:41

Re: Получить информацию из PDF417

Сообщение Steel Rain » 23 янв 2016, 19:06

antonn
Сообщений: 400
Зарегистрирован: 12 янв 2016, 13:34

Re: Получить информацию из PDF417

Сообщение antonn » 23 янв 2016, 20:43

Я там и "полистал", но моя тема в профиле останется, если понадобится еще раз ее найти.
Vodik
Сообщений: 3
Зарегистрирован: 09 июн 2016, 09:01

Re: Получить информацию из PDF417

Сообщение Vodik » 09 июн 2016, 09:08

Получение алкокода на c++.
string get_alco_code(const std::string& pdf417)
{
constexpr int base = 36;
const string base_sys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
long long digit = 0;
string alco_code = pdf417.substr(3, 16);
double power = alco_code.size() - 1;
double found = 0.00;
for (int i=0; i<alco_code.size(); ++i) {
found = (double)base_sys.find(alco_code[i]);
digit += found * pow(base, power);
--power;
}
ostringstream ss;
ss << digit;
alco_code = ss.str();
while (alco_code.size() < 19)
alco_code.insert(0, 1,'0');
return alco_code;
}
antonn
Сообщений: 400
Зарегистрирован: 12 янв 2016, 13:34

Re: Получить информацию из PDF417

Сообщение antonn » 10 июн 2016, 05:38

Ну и для mssql

Код: Выбрать все

ALTER function [dbo].[EGAIS_GetAlcoFromPDF417](@PDF417 nvarchar(80)) returns nvarchar(255)
as
begin

   declare @sub nvarchar(19),@base_sys nvarchar(36)
   set @base_sys='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   set @sub=upper(SUBSTRING(@PDF417,8,12));
   declare @i int,@k int,@s nvarchar(1),@alccode numeric(20),@ex numeric(20)
   set @i=LEN(@sub);
   set @alccode=0;
   set @ex=1;
   while @i>0 begin
      set @k=CHARINDEX( SUBSTRING( @sub,@i,1),@base_sys)-1
      set @alccode=@alccode+@k*@ex;
      set @ex=@ex*36;
      set @i=@i-1   
   end

   set @sub=cast(@alccode as nvarchar(255))   
   if(LEN(@sub)<19) begin
      set @sub=REPLICATE('0',19-len(@sub))+@sub;
   end
   
   return @sub;
         
end
Евгений_Б
Сообщений: 88
Зарегистрирован: 09 ноя 2015, 01:43
Откуда: Курган

Re: Получить информацию из PDF417

Сообщение Евгений_Б » 10 июн 2016, 06:37

Добавлю вариант dll на c

Код: Выбрать все

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>  /* sprintf, NULL */
#include <stdlib.h>     /* strtoull */

extern "C" __declspec(dllexport) int  Conv36to10(char* cNum36, char* cRes)
{
   char * pEnd;
   char buffer[50];
   int n;
   unsigned long long int ulli1;
   ulli1 = strtoull(cNum36, &pEnd, 36);
   n=sprintf(cRes, "%llu", ulli1);
   return n;
}
Разработка ПО для оптовой и розничной торговли , ЕГАИС http://vdm45.ru/
antonn
Сообщений: 400
Зарегистрирован: 12 янв 2016, 13:34

Re: Получить информацию из PDF417

Сообщение antonn » 25 июл 2016, 10:17

Есть марка 45380149022008810078407811130010014618708259322627241511709568836749 и 45380149022008810078407811130010002437813446535872913510995632603702, выше приведенный код выделяет из марки АлкКод 1184804097210768967. Но такой отсутствует в ЕГАИС, а вот запрос через личный кабинет указывает что алккод для такой марки должен быть 038014902200881007. Он еще и не 19 символов... Правда марка древняя, 2008 год, но вроде запрета продажи на такие нет?

Попробуйте у себя в системах выделить из марки алккод, получается ли у вас 038014902200881007?

Вернуться в «Вопросы по подключению к системе ЕГАИС Опт и Розница»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 5 гостей