Подсистема "Акцизные марки" для УТ 11.2 и Розница 2.2




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

58 Comments

  1. coolseo

    Печатная форма формируется с помощью стороннего сайта?

    Reply
  2. RocKeR_13

    (1) coolseo, нет, сайт использую для получения картинки PDF417.

    Reply
  3. pablo_escobar

    (2) зачем? 1С сама умеет формировать pdf417

    Reply
  4. Modeus

    Добрый день, скачали вашу подсистему, установили, но она как-то не правильно работает, заключается это в то что акцизы выводятся на печать не в pdf417? а в виде обычного штрихкода, и соответственно не читаются. Подскажите куда копать. Платформа 1с 8.3.9 Розница 2.2.4 (последний релиз)

    Заранее спасибо.

    С уважением.

    Reply
  5. RocKeR_13

    (4) Modeus, ок, проверю!

    Reply
  6. codename-s

    Как успехи с проверкой? Тоже скачали, установили, не работает печать штрихкодов, если в ручную запрашивать картинку и печатать PDF417 то нормально сканируется

    Reply
  7. RocKeR_13

    (4) Modeus, (6) codename-s, весьма странно… Еще раз тестировал на УТ 11.2.3.200 и Розница 2.2.4.25 и 2.2.4.30 — формируются PDF417

    Reply
  8. codename-s

    Высылаю вам скрины пройденной операции и ручного запроса. Розница 2.2.4.30

    Reply
  9. RocKeR_13

    (8) codename-s, а пробовали считать акцизную марку с 3 скрина в блокнот? Там другой код что ли зашит? И что в Excel-файле, не открылся он у меня…

    Reply
  10. codename-s

    Пробовал, не хватает 2-х последних символов, код везде один и тот же, эксель исправил.

    Reply
  11. Modeus

    У меня формируются так-же как у codename-s на 3 скрине

    Reply
  12. RocKeR_13

    (10) codename-s, (11) Modeus, вернул формирование марки с помощью сайта, вышлю конфигурацию в личные сообщения

    Reply
  13. seva1405

    Автор, подскажи как пользоваться твоей подсистемой?

    Создал документ запрос акцизныз марок:

    https://yadi.sk/i/CnA4unMs333MDG нписано получен штрихкод, но поле штрихкода пустое:

    https://yadi.sk/i/gpGf4U1H333MoQ

    как правильно сделать?

    Reply
  14. seva1405

    Не работает подсистема, документ висит со статусом передан запрос, при нажатии «выполнить обмен с УТМ» вываливается ошибка «Индекс находится за границами массива» и документ остается висеть со статусом «передан запрос».

    Reply
  15. seva1405

    В общем разобрался, автор, извиняюсь сам затупил. Не верно вводил тип марки. Нашел в отладке комментарий «Акцизная марка не прошла проверку» .

    Спасибо за подсистему и +

    Reply
  16. bikmullina

    Печать штрихкодов отрабатывается некорректно

    Reply
  17. bikmullina

    Ещё раз обращаюсь к разработчику о ошибке печати акцизных марок.

    Жду ответа

    Reply
  18. RocKeR_13

    (17) Здравствуйте! Прошу прощения, действительно пропустил добавление картинки в макет. Исправлю!

    Reply
  19. bikmullina

    Спасибо, теперь всё корректно распечатывается.

    Reply
  20. Sergal9991c

    Добрый день! Поставил Вашу подсистему. Новый штрих-код приходит и записывается, а на печать не выводит. Как быть?

    Reply
  21. nikaleks

    Спасибо за подсистему, отличная работа!

    Есть только один вопрос, а расширением не проще было бы сделать?

    Reply
  22. RocKeR_13

    (21) спасибо за отзыв! Изначально хотел расширение сделать, но потом решил, что неплохо было бы сохранять данные о запросах и номерах марок в базе, а расширение не позволяет добавлять справочники, документы и т.п. А так есть у меня обработки, где также присутствует функционал запроса марок

    Reply
  23. kepka

    Добрый день

    В описании написано:»В случае новых акцизных марок вы можете воспользоваться сканером штрихкодов: после считывания DataMatrix-кода будет автоматически создан новый элемент справочника «Номера акцизных марок» (если он не найден).»

    Сканирую марку в документ- вторая колонка «номер» не заполняется. В самом справочнике номеров ее тоже нет.

    В чем может быть проблема?

    Розница 2,2,5,22

    Reply
  24. Modeus

    (kepka)Поддерживаю, приходится вручную с бутылок вводить алко код, а так же серию и номер.

    Reply
  25. RocKeR_13

    (23), (24) прошу прощения за поздний ответ, в связи с изменениями в обработке событий пришлось немного переделать конфигурацию.

    Reply
  26. Protman

    Из полученного штрих кода потом можно получить алкокод чтобы получить по нему номенклатуру?

    Reply
  27. RocKeR_13

    (26) в данной подсистеме нет, а вообще можно будет

    Reply
  28. Protman

    (27)В дополнение к предыдущему вопросу хотелось бы ещё чтобы было сопоставление «Тип марки» к «Виды алкогольной и спиртосодержащей продукции» и/или брать информацию из карточки номенклатуры. Залежалый товар всегда есть в базе и данная подсистема помогла бы вернуть его в продажу после повреждения штрих кодов марки…

    Reply
  29. Protman

    А если в НСИ-Штрихкоды можно будет добавлять через Вашу подсистему «Акцизные марки» штрихкоды марок то вообще великолепно 🙂

    Reply
  30. Protman

    Жаль что ценник растёт быстрее чем функционал 🙁 Приходится пока пользоваться бесплатной демо-версией «Трезвый Декларант. ЕГАИС» для решения проблемы нечитаемых акцизных марок

    Reply
  31. RocKeR_13

    (28) не очень понятно пожелание: что изменит связь с видами АП?)

    (29) а кто сейчас запрещает?) Только вот для чего это нужно?

    Reply
  32. Protman

    (31) Есть марки с оторванной головой где указано, для примера, что это «АМ. Вина виноградные до 0,75» а в базе есть эта бутылка с соответствующим проставленным видом АП.

    (29) Ну пока только методом копипастить, а нужно для других обработок где акцизки берутся из соответствующего справочника.

    Reply
  33. RocKeR_13

    (32) понял вас, но это будет актуально только для старых марок+надо искать связь между типом марки и видом АП.

    (29) да у меня постоянные мои «любимчики» вечно вместо штрихкодов забивают марки в регистр «Штрихкоды», так что тут опять вас не пойму)

    Reply
  34. user660819_1

    Срочно нужна помощь, установил данную доработку на конфигурацию Розница, редакция (2.2.5.22), попробовали отправить запрос все пришло, распечатали несколько акциз для проверки.

    Смутило куча запросов в протоколе обмена ЕГАИС, куча пустых строк в секунду по несколько раз, решил что просто это ваше регламентное задание так работает. Не придал значение этому.

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

    Посмотрел в итоге база с 1гб выросла на 5.5 гигов (делал копию перед обновлением).

    Что делать? Может эти запросы забили базу?

    Reply
  35. RocKeR_13

    (34) хм, вообще после удачной загрузки из УТМа удаляется ответ с марками и при повторном чтении ответов записи в протокол не должны идти. Да и подозрительно часто идет запись. Еще раз попробую у себя

    Reply
  36. user660819_1

    (35) может поможет ньюанс, что у меня несколько магазинов в этой базе. Т.е. с нескольких УТМ идет запрос документов.

    Reply
  37. RocKeR_13

    (36) попробовал у себя еще раз (правда только у меня 1 утм): все хорошо приходит и удаляется… Попробуйте отключить пока регламентное задание «Загрузка акцизных марок» и получать марки по кнопке «Выполнить обмен с УТМ». Попробую организовать несколько УТМ. А можно с нескольких записей из протокола обмена скопировать все со вкладки «Текст XML», чтобы понять, что это хоть

    Reply
  38. Protman

    del

    Reply
  39. user660819_1

    (37) Прикрепил Тексты с запросов. Отключил регламентное задание, нажимаю в вашей доработке «Выполнить обмен УТМ» база повисает и начинает кушать всю память, принудительно убил процесс. Что-то совсем все плохо(

    Reply
  40. RocKeR_13

    (39) ааа, было у одних такое дело: у вас накладная не может в базу подгрузиться. Нужно журнал регистрации смотреть, на чем ошибка выскакивает. Была проблема, когда приходила АП, длина алкокода у которой была меньше 19 символов. Либо попробуйте запустить в режиме отладки, настроить автоматическое подключение к фоновым заданиям, задать остановку при ошибке и запустить обработку запросов ЕГАИС. Можно попробовать универсальной обработкой отобрать всю АП, длина кода у которых меньше 19 и добить нулями спереди такие коды до 19 символов.

    Reply
  41. user660819_1

    (40) Т.е. это совпадение, что после установки вашей доработки такое произошло? И с ней не связано?

    Reply
  42. RocKeR_13

    (41) ну судя по тому, что в пустых записях протокола ттн висят, то из-за них беда. Я такое встречал, когда запросили продукцию производителя: тоже база висла как только запускалась обработка ответов ЕГАИС. Хорошо бы увидеть, что в журнале регистрации по этой ошибке пишется

    Reply
  43. user660819_1

    (42) В итоге так и не заработало. Взял копию базы до обновления, все нормально получил, все ттн, проблема не в них.

    Решил попробовать еще раз, сделал копию уставил только один УТМ, отправляю запрос на получения марок, начинает с невероятной скоростью расти база из-за запросов в ЕГАИС.

    Закрываю базу, открываю снова, жму в доработке обмен с УТМ, получаю штрих коды и так до следующего запроса на получение марок.

    Как убрать эти постоянные запросы?

    Reply
  44. user660819_1

    Ещё вопрос, не могу получить ответы на бутылки у которых серия состоит не из 9 чисел, а из 8. Приходит ответ, что марка не прошла проверку. Подскажите, что не так, гуглил ничего интересного не нашёл.

    Reply
  45. RocKeR_13

    (44) Здравсвуйте! К сожалению, не смог смоделировать ситуацию с зависанием: при загрузке данных из УТМ все проходит штатно как в автоматическом режиме (регламентным заданием), так и при загрузке вручную.

    На счет марок с 8 символами: это импортная продукция, запрашивается также нормально (приложил скриншот с примером). Попробуйте в 1С открыть номер марки, все ли поля в ней заполнены?

    Reply
  46. Niberu

    Здравствуйте.

    Имеется Розница, редакция 2.2 (2.2.5.27).

    Скачал эту разработку «подсистему», интегрировал по инструкции в копию базы, стартую и пробую, ошибка сразу в первой же форме «Запросов» при нажатии на «обмен с утм».

    И, в целом, непонятно где настройка выбора УТМ из имеющихся в рег.свед «настройки обмена с егаис», через который хочу запрос нечитаемых акцизок отправить.

    {ОбщийМодуль.АМ_ИнтеграцияЕГАИС.Модуль(113)}: Поле объекта не обнаружено (ОтветМодуляЕГАИС)

    СписокАдресов = РезультатОперации.ОтветМодуляЕГАИС;

    Reply
  47. RocKeR_13

    (46) Здравствуйте! Приношу извинения: пока занят был поддержкой других публикаций. В ближайшее время проведу тесты на свежих версиях

    Reply
  48. Niberu

    (47) В этой розничной тестовой базе (полная копия боевой) убрал все настройки УТМ, кроме одного. В слепой надежде, что у вас обработка работает только в базах с одним утм (в комментах были ваши сообщения, что вы работали-тестили на базе с одним утм) — не помогло.

    Reply
  49. slonba

    добрый день

    скажите приходит ответ

    Марки не прошли проверку

    что я делаю неправельно

    Reply
  50. RocKeR_13

    (49) Здравствуйте! Либо по переданным данным не найдена марка, либо марка была продана. Если запрашиваете данные по старым маркам, то вроде их можно было продавать до 1 сентября 2017 года (http://ppt.ru/news/132797)

    Reply
  51. slonba

    (50)Для примера было взято 3 бутылки из ассортимента магазина. и у всех пишет марка не прошла проверку это в файловом варианте. А в клиент-серверном вообще только запрос передан и дальше движения нет.

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

    Reply
  52. RocKeR_13

    (51) Тип, серия и номер должны быть заполнены. Возможно у них опять этот функционал недоступен. Попробую сегодня сам запросить, посмотрю, что да как. Вы на какой конфигурации работаете?

    Reply
  53. slonba

    везде я использую Розница, редакция 2.2 (2.2.5.27)

    где то август-сентябрь я накатил ваши доработки на копию рабочей базы и оно даже работало.

    потом октябрь-ноябрь мы перенесли рабочею в клиент серверный вариант, далее накатил доработки, но сразу не проверил работу вашего функционала. недели 3-4 назад выяснилось что он остановился на этапе Запрос передан.

    неделю назад я создал файловую копию и в ней на всей продукции Марка не прошла проверку

    все мои манипуляции были сделаны в Розница, редакция 2.2 (2.2.5.27).

    смутило то что сначала то работало, то на копия была удалена(((

    Reply
  54. slonba

    везде я использую Розница, редакция 2.2 (2.2.5.27)

    где то август-сентябрь я накатил ваши доработки на копию рабочей базы и оно даже работало.

    потом октябрь-ноябрь мы перенесли рабочею в клиент серверный вариант, далее накатил доработки, но сразу не проверил работу вашего функционала. недели 3-4 назад выяснилось что он остановился на этапе Запрос передан.

    неделю назад я создал файловую копию и в ней на всей продукции Марка не прошла проверку

    все мои манипуляции были сделаны в Розница, редакция 2.2 (2.2.5.27).

    смутило то что сначала то работало, то на копия была удалена(((

    Reply
  55. slonba

    (52) Добрый день, ну что удалось проверить?

    Reply
  56. jmi

    Установили ваш модуль. Но в разделе запросы акцизных марок при выполнении обмена с утм

    выходит ошибка Метод объекта не обнаружен (Доступные транспортные модули). Конфигурация Розница 2.2.7.32

    Reply
  57. RocKeR_13

    (56) В 2.2.7 уже есть типовой документ для запроса марок

    Reply
  58. jmi

    (57) Спасибо

    Reply

Leave a Comment

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