Расшифровка алкогольной акцизной марки (ЕГАИС)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

23 Comments

  1. Tarlich

    Это марку руками вбивать ? -))

    Reply
  2. sdv88

    (1) Tarlich, нет времени чтобы сделать считыванием со сканера, позже добавлю. пока просто делюсь алгоритмом.

    Reply
  3. rvs-slim

    (2)

    Точно знаете по:

    — идентификатору производителя

    — дате заявки на нанесение марки

    — номеру заявки на нанесение марки

    — серии марки

    — порядковому номеру марки

    Напишите Всем с какой по какую позицию…

    Например Так:

    — алкогольный код с 8 поз. длина 12



    Спасибо…

    Reply
  4. sdv88

    (3) rvs-slim, Точно. там не так….

    Там определенный алгоритм, идет перевод в другую систему счисления.

    Reply
  5. rvs-slim

    (4)

    Все верно в другую…

    в 36-ю …

    но позиции если Вам известны скажите Всем … что здесь такого…

    Жалко там даты розлива не зашито…сняло бы многие проблемы…

    Reply
  6. beard1

    присоединяюсь к вопросу. что в той марке? где какая изна за какой циферкой? если не секрет, конечно 😉

    Reply
  7. m-serg74

    (5) rvs-slim,

    Жалко там даты розлива не зашито

    ее там в принципе быть не может — производитель заказывает марки до того как произвел продукцию, потому в справке А и указывают какой диапазон был использован для конкретной партии

    Reply
  8. rvs-slim

    (7) m-serg74,

    я и говорю ЖАЛКО!!!

    Reply
  9. sdv88

    (5) rvs-slim, вообще можете скачать и посмотреть. я читаю символы с 8го 12 штук

    Reply
  10. Berrimor

    вот цитата с форума РАРа

    Цитата:

    Re: Расшифровка штрих-кода PDF-417 акцизной марки

    Сообщение operator9 » 11 дек 2015, 13:02

    Данные полученные из марки ФСМ, пример:

    136-102719868197240715410498397226

    136- тип марки — в данном случае ФСМ, так как первая цифра «1» (если первые три цифры начинаются на «2», то это АМ)

    Далее идет последовательность цифр, составляющая серию + номер марки + контрольная сумма.

    Для ФСМ 12 цифр (серия + номер)

    136- тип марки ФСМ

    102- серия марки

    719868197 — номер марки

    240715410498397226 — контрольная сумма гознака

    20N00001CGUMZYCB99J1NKN31105001000056NQQMS5VP4HTF5SB46ZSQQJD­8BNJP891

    20 – Номер Версии ПС ЕГАИС

    00001CGUMZYCB99J – Зашифрованный в кодировке Base36 код продукции(алккод)

    1NKN31105001 – Номер заявки на печать.

    000056 – номер марки на печать

    NQQMS5VP4HTF5SB46ZSQQJD8BNJP891 — защитная последовательность

    Reply
  11. beard1

    сильно смущало и не мог найти подтверждения, что в Приложении к Приказ № 33н от 12 мая 2010 года расписано так:

    Символы Сведения

    Символы   Сведения
    —————————
    2       Версия ПС ЕГАИС
    17       Специальный идентификатор //алккод, как я понял
    12       Номер и дата заявки
    6       Номер марки в заявке
    31       Контрольная группа

    т.е на алккод 17 символов, а во всех алгоритмах получения алккода, берут с 8 или 9 позиции

    еще раз спасибо!

    Reply
  12. OrcaMax

    Чувак, у нас аналогичные публикации ))) забавно. Идея ведь на поверхности. Меня носом ткнул http://infostart.ru/profile/3651/

    Reply
  13. Natali_77

    (9) а можете добавить ещё как определить данные по:

    идентификатору производителя

    дате заявки на нанесение марки

    номеру заявки на нанесение марки

    серии марки

    порядковому номеру марки

    Reply
  14. cdrsu

    Не работает в рознице

    Reply
  15. ayava
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Сч = 0;
    Значение=СокрЛП(«22N00000XY8EURN31182NS2605180010097820RUFK56LES08GY4EBZCNZF­E0AKOSKD3″);
    
    Если СтрДлина(Значение) <> 68 Тогда
    Сообщить(«Код марки некорректной длины»);
    //  Возврат Неопределено;
    КонецЕсли;
    
    Если Сред(Значение, 4, 5) = «00000» Тогда
    Значение = Сред(Значение, 9, 11);
    Сч = 11;
    Иначе
    Значение = Сред(Значение, 8, 12);
    Сч = 12;
    КонецЕсли;
    
    Результат = 0;
    
    Для Поз = 1 По Сч Цикл
    
    Множитель = 1;
    
    Для СчМ = 1 По Сч — Поз Цикл
    Множитель = Множитель * 36;
    КонецЦикла;
    
    Результат = Результат + (Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ», Сред(Значение, Поз, 1)) — 1) * Множитель;
    
    КонецЦикла;
    
    Сообщить(Формат(Результат, «ЧЦ=19; ЧВН=; ЧГ=0»));
    
    КонецПроцедуры
    

    Показать

    Reply
  16. Компания БИТ

    (13) поддерживаю, информация о производителе/импортере необходима

    Reply
  17. tolyan_ekb

    Подскажите старые марки без букв расшифровываются?

    Reply
  18. myALKleon

    (17) Анатолий, нет, старые марки без букв не поддаются расшифровке

    Reply
  19. YAMIN

    пусто. ничего не открывается. пустая страница 1с

    Reply
  20. krasavcheg2

    Добрый Вечер, а возможно декодирование новой марки 150 сим.?

    Reply
  21. demONx7

    (20) Поддерживаю. Тоже интересен данный вопрос.

    Reply
  22. Virsy

    (20) Думаю что не возможно. В новой марке нет алкокода. Только коды АП, номер марки по порядку и цифровая подпись.

    Reply
  23. Икар

    Привет.

    Тип марки (3 символа) + Серия марки (3 символа) + Номер марки (8

    символов)*+ Служебная информация ЕГАИС (7 символов)** + Контрольная

    сумма и электронная подпись, созданная при помощи СКЗИ по ГОСТ (129

    символов)

    ИТОГО: 150 символов.

    Пример состава штрихового кода:

    101100261679680118001D5CCFC794963898C1B13E41231CKY42T7UDIJJY­2AWLH

    S7HPGINLMY7PQPDNJALVS42WNCHYRCO257SPCSCF4ASM37BZNTLIASYRVGFU­TC

    XDXDJPML5MMVLEEHZWPWJVI

    16

    * — количество символов в номере марки одинаковое, как для федеральных

    специальных, так и для акцизных марок.

    ** — информация, используемая Росалкогольрегулированием для нужд

    системы и закрытая для пользователей системы.

    Единственный способ, для определения алкокода как вижу, запрос по Серия марки (3 символа) + Номер марки (8

    символов) в онлайн проверке акцизных марок, там вроде бы возвращается всё по акцизке. Только как реализовать, мне пока не понятно.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *