Корректировка остатков по акцизным маркам ЕГАИС для Розницы 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='\

59 Comments

  1. pablo_escobar

    Как обработает старые марки?

    Reply ↓
  2. myALKleon

    (1) Пожалуйста, напишите в виде строки пример Вашей акцизной марки

    Reply ↓
  3. pablo_escobar

    452503932251971100731758122601600079399639463387081370775441­61720697

    Алкод вычислится, но он будет неправильный, для старых марок нет алгоритма, РАР это подтвердил. Алкод для такой продукции получпть только в личном кабинете.

    Reply ↓
  4. pablo_escobar

    Поэтому марки состоящие только из цифр, нужно отсеивать для ручной постановки.

    Reply ↓
  5. myALKleon

    (4)Алексей, спасибо Вам за замечание! Открыл поле «алкокод» для ручного редактирования.

    Reply ↓
  6. gigabyte-leha

    Подскажите а если несколько АП к одной карточки как поведет себя ваша обработка в такой ситуации?

    Reply ↓
  7. myALKleon

    (6) Алекс, обработка не пустит к сбору акцизных марок, пока Вы не устраните это (там встроенный инструмент для устранения этой, на мой взгляд, ошибки. Если такой вариант Вас не устраивает, в модуле формы можете просто открыть доступность страницы «сбор акцизных марок».

    Reply ↓
  8. gigabyte-leha

    А обновленную версию можете скинуть на почту или снова придется тратить sm

    Reply ↓
  9. myALKleon

    (8) Алекс, выслал Вам на почту.

    Reply ↓
  10. gigabyte-leha

    Спасибо большое уже увидел)

    Reply ↓
  11. avrudnev

    Артем, доброго дня.

    У нас сейчас 1 номенклатуре в 1С:Розница соответствует несколько (от 1 до 5) номенклатур ЕГАИС.

    Естественно, по результатам инвентаризации остатки не идут — где-то больше, а где то в сумме на это же количество меньше.

    Правильно ли я понимаю, что для Вашей обработки важно, чтобы 1й номенклатуре ЕГАИС было настроено соответствие только 1й номенклатуры 1С:Розница?

    Reply ↓
  12. myALKleon

    (11) Алексей, хммм, вообще за основу я брал не номенклатуру, а алкогольную продукцию, и подсчёт идёт по ним же. Обработка вас не пустит, пока не исправите сопоставления, в обычном режиме. Можно зайти в режиме администратора через «ещё», откроются все страницы и можно будет перейти к корректировке. Где взять пароль от админа я вам напишу в личку. В некоторые документы будет попадать номенклатура, в связке с алкогольной продукцией, будет браться тупо первая, но для вас это не страшно, ведь корректируем продукцию ЕГАИС.

    Reply ↓
  13. avrudnev

    (12) Значит для нас данная обработка позволит провести инвентаризацию в разрезе акцизных марок и отправит данные в ЕГАИС?

    Создаст ли она в ЕГАИС акты списания и постановки на баланс? Откуда она возьмет данные для этих актов (номенклатура 1С или алкокоды ЕГАИС по марке)?

    Reply ↓
  14. myALKleon

    (13) По алкокодам (по акцизным маркам). Да, позволит. Она создаст акт списания, и два акта постановки на баланс (один по излишкам, другой для продукции, которой у вас на остатках вообще не числится, то есть полученной до ЕГАИС, либо списанной по каким-то причинам в ноль)

    Reply ↓
  15. gigabyte-leha

    А можете тоже написать пароль?

    Reply ↓
  16. vitaliysv

    Скачал. Хорошо бы пароль получить для режима администратора. Кстати в регистре может быть несколько записей АП-Номенклатура с разными упаковками и характеристиками.

    Reply ↓
  17. myALKleon

    (16) Пароль находится на странице «проверка множественного сопоставления», нужно навести мышью на область правее кнопки с шагом 2, он высветится всплывающей подсказкой

    Reply ↓
  18. vitaliysv

    Пароль ввел, ничего не произошло… Закладки не разблокировались.

    Reply ↓
  19. myALKleon

    (18) Неправильно ввели пароль. Вводить нужно 4 символа, скорее всего, без пробела. Пароль — это точный объём вашей оперативной памяти на компьютере (если 4 гб, это не значит, что 4000, или 4096).

    Reply ↓
  20. vitaliysv

    Тогда для 16280 — какие четыре цифры вводить?

    Reply ↓
  21. myALKleon

    (20) Прямо их и вводить. Не работает, так?

    Reply ↓
  22. vitaliysv

    Нет не работает

    Reply ↓
  23. myALKleon

    (22) Виталий, отправил Вам в личку ссылку на скачивание версии, которая пустит любой пароль, который введёте.

    Reply ↓
  24. gigabyte-leha

    Обработку считаю очень полезной и нужной, все интуитивно понятно. Автору респект)

    Reply ↓
  25. tupoy

    А почему обработка не создает документы Списания и оприходования в учетной программе!? С корректировкой в ЕГАИС ясно, но учетные остатки должны совпадать с ЕГАИСовскими, не так ли?

    Reply ↓
  26. myALKleon

    (25)

    А почему обработка не создает документы Списания и оприходования в учетной программе!? С корректировкой в ЕГАИС ясно, но учетные остатки должны совпадать с ЕГАИСовскими, не так ли?

    Для вас есть два варианта:

    1 Своими силами дописываете обработку, чтобы корректировались не только остатки ЕГАИС, но и учётные, потребуются навыки программирования.

    2 Сначала делаете учётное списание всего маркируемого алкоголя, затем на основании вновь загруженных остатков в торговом зале (после корректировки) создаёте учётное оприходование, это действия на уровне пользователя, не требующие навыков программирования.

    Reply ↓
  27. progaoff

    Обновленную заново скачивать?

    Reply ↓
  28. progaoff

    И с паролем та же беда, ввожу что появляется, не проходит

    Reply ↓
  29. gigabyte-leha

    А обновленную версию можете скинуть на почту?

    Reply ↓
  30. myALKleon

    (27) Игорь, я не вижу вашего аккаунта «progaoff» в списке купивших.

    Reply ↓
  31. myALKleon

    (29) Алекс, Скинул прямую ссылку в Л.С.

    Reply ↓
  32. gigabyte-leha

    Добрый день, подскажите а доработка под новую версию Розница 2.2.6.* будет?

    Reply ↓
  33. myALKleon

    (33) Здравствуйте! Да, будет.

    Reply ↓
  34. myALKleon

    (35) Здравствуйте, Дмитрий! Это баг. Скажите, у вас какая версия обработки? Этот баг был в старой версии

    Reply ↓
  35. demon-footman

    Обработка 1.9

    1С:Предприятие 8.3 (8.3.10.2639)

    Розница, редакция 2.2 (2.2.6.33)

    Reply ↓
  36. user620079_alko-pskov

    Версия обработки 1.8, отсканированно порядка 8000 марок, все этой хозяйство экспортировал в новый файл, теперь открываю обработку, делаю импорт данных и …ничего …несколько часов и ничего не грузит. Файло с товаром на 1000-15000 позиций открывает без проблем … так же не работает функционал изъятия акцизной марки, она все равно остается !

    Reply ↓
  37. myALKleon

    (38) Скиньте мне текстовый файл, пожалуйста

    Reply ↓
  38. myALKleon

    (38) Баг поправлю. Он был связан с обработкой события сканера штрихкода. Но работала, если копировать марку вручную в поле удалить

    Reply ↓
  39. user620079_alko-pskov

    Да вот он, с утра уже третья попытка, никак не подгрузить … один раз получилось что подгрузил, но не полностью ..

    Reply ↓
  40. myALKleon

    (41) Спасибо, протестировал. Всё должно грузиться, при условии, что вы не переключаете окно 1С. Моё железо: Core i7-6700, в вашем файле 7765 акцизных марок, обрабатывалось около 10 минут. Окно 1С должно быть активно, нельзя ничего сворачивать, уверен, что проблема в этом.

    Reply ↓
  41. user620079_alko-pskov

    Так и есть, ничего не трогая в момент подгрузки на файловой все проходит, на серваке через rdp все попрежнему весит. Спасибо.

    Reply ↓
  42. maxpyp

    Добрый день обновил розницу до 2.2.7.29 теперь обработка не открывается. Подскажите что поправить, или как обойти ошибку в прикрепления файле.

    Reply ↓
  43. myALKleon

    (44) Скоро выложу обновление для новой розницы

    Reply ↓
  44. maxpyp

    (45)понял Ждём.

    Reply ↓
  45. maxpyp

    В процессе инвентаризации , выяснилось что не хватает нумерации при сборе акцизных марок. Чтобы была возможность видеть количество просканированных позиций.

    Reply ↓
  46. zeusius

    так же обновил розницу до 2.7.9 и не запускается

    Reply ↓
  47. zeusius

    2.7.29

    Reply ↓
  48. maxpyp

    (45)по срокам сориентируйте?

    Reply ↓
  49. myALKleon

    В процессе, скоро будет готова

    Reply ↓
  50. maxpyp

    Какие перспективы?

    Reply ↓
  51. maxpyp

    Уже 2.2.7.32 обновилось а у Вас тишина. Есть надежда на обновление?

    Reply ↓
  52. maxpyp

    Уважаемый разработчик! Очень нужно обновление, хочется надеяться , что Вы не забросили этот проект!

    Reply ↓
  53. myALKleon

    Надежда есть

    Reply ↓
  54. polukaroff

    Здравствуйте! нужно бы связаться, есть предложение. polukaroff@gmail.com

    Reply ↓
  55. maxpyp

    (55)Скажите когда же будет обновление?

    Reply ↓
  56. maxpyp

    Вроде бы дата на файле для закачки 26.03.2018, значит ли это что выщло обновление? Можно получить его как-то?

    Reply ↓
  57. Anatoly123123

    Обработка так до сих пор и не работает на версии 2.2.7?

    Reply ↓
  58. ьуеьшд

    День добрый. Работает ли обработка с новыми марками? и как работает с текущей конфигурацией 2.2.11.16?

    Reply ↓
  59. user1102783

    Здравствуйте, такой же вопрос.

    Работает ли с новыми марками?

    Reply ↓

Leave a Comment

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