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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *