Корректировка остатков по акцизным маркам ЕГАИС для Розницы 2.2




Принцип обмена данными из 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='\

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 не будет опубликован. Обязательные поля помечены *