Исправление сопоставлений номенклатуры ЕГАИС




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

41 Comments

  1. karpik666

    Множественное сопоставление это не ошибка, это вариант решения, когда мы продаем 1 вид номенклатуры, а в ЕГАИС продается несколько

    Reply
  2. myALKleon

    (1) Андрей, спасибо за Ваш комментарий. В таком случае, сколько акцизных марок для одной позиций номенклатуры у Вас запрашивает 1С Розница в режиме РМК? Насколько мне известно, РМК для одной позиции номенклатуры запрашивает одну акцизную марку, неважно сколько позиций алкогольной продукции ЕГАИС к ней сопоставлено. И списывается после продажи, соответственно, тоже одна, которая была «расшифрована» из считанной марки. Поправьте, меня, пожалуйста, если ошибаюсь.

    Reply
  3. karpik666

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

    Reply
  4. karpik666

    (2) Обратите внимание, что в документе ЧекККМ нет Реквизитов с типом «НоменклатураЕГАИС», а хранятся только акцизки и наша номенклатура, таким образом в момент продажи она не сопоставляется с Номенклатурой ЕГАИС, а просто передаются данные о том, что был продан какой-то товар, имеющий такой-то акциз

    Reply
  5. myALKleon

    (4) Андрей, Вы правильно мыслите. Но есть большое «НО»:

    Потребует столько акцизок, сколько позиций номенклатуры. Например, номенклатура «Коньяк Арарат» сопоставлена к пяти позициям этого же «арарата» в ЕГАИСЕ, пробиваем 1 позицию номенклатуры, запросится одна акцизная марка. На сервере спишется именно та акцизка, которая расшифрована. То есть в итоге, получаем, что для розничных магазинов именно для продажи не принципиально, как сопоставлено, спишется все равно по акцизной марке.

    А что для документов корректировки? Акт списания, акт постановки на баланс? Там указывается номенклатура и связь к ней, причём берётся, по-моему, тупо первая. Для них в таком случае сопоставление 1к1 критично.

    А как быть предприятиям, осуществляющим услуги общественного питания? Они ежедневно делают акт списания, в котором указывают номенклатуру, и автоматически подставляется алкогольная продукция ЕГАИС. Для них сопоставление ещё более критично.

    Reply
  6. karpik666

    (5) это уже будет пересортица, вы наверное заметили, что есть такая причина списания и причина постановки на баланс «Пересортица», в рамках одно нашей номенклатуру может быть «Пересорт» нескольких позиций ЕГАИС, не знаю как в рознице, но для Управление торговлей 10.3 я сделал обработку Инвентаризация по акцизной марке ЕГАИСКорректировка остатков ЕГАИС (Управление торговлей 10.3), которая учитывает этот «Пересорт» и автоматически корректирует остатки по данной причиние

    Reply
  7. karpik666

    (5) вообще пересортица актуальна в основном для пива, так как оно не регистрируется в ЕГАИС при продаже, а вот по поводу маркируемой продукции подскажите, когда вам нужно делать Акт списания и акт постановки на Баланс?

    Reply
  8. myALKleon

    (6) Андрей, эта обработка есть только у Вас, она платная. Насчёт пересортицы тоже правы, только Вы же понимаете, что через пересортицу для пользователя сложнее. В типовом функционале нет инструмента, который позволяет нормально учесть пересортицу, каждый раз когда мы выбираем номенклатуру, подставляется первая связь ЕГАИС, когда пытаемся поменять выбранную связь, открывается попросту весь классификатор, даже без отбора по сопоставленной номенклатуре.

    Reply
  9. myALKleon

    (7) А корректировка остатков по пиву, как и поддержка в актуальном состоянии носит лишь «рекомендательный характер», насколько мне известно.

    Reply
  10. karpik666

    (8) по-моему для пользователей как раз сложнее плодить миллион одинаковых номенклатур, да еще у которых одинаковый штрихкод, какую номенклатуру вы выберите при продаже, если у вас 3 позиции с одинаковым штрихкодом, а в егаис это 3 разных производителя? И куда вы выбираете номенклатура, когда проставляется первая связь с ЕГАИС? Кстати если вы 2 раза щелкните мышкой при сопоставлении на номенклатуру курсор спозиционируется на сопоставленные

    Reply
  11. karpik666

    (9) но продажи то нужно регистрировать на сколько я знаю и нужно делать самостоятельно акт списания

    Reply
  12. myALKleon

    (11) Выберем ту, которая описана в названии, если это пиво и неважно, что выберем, если это маркируемое.

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

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

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

    Reply
  13. karpik666

    Что значит рекомендуется делать свои? У вас на предприятия делают свои штрихкоды?

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

    , как это не важно?, а как вы потом будете выравнивать остатки с егаис? у вас продан товар x, который сопоставлен номенклатурой егаис Y, а продается на самом деле номенклатура ЕГАИС Z.

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

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

    Reply
  14. myALKleon

    (13) Неважно в рамках ЕГАИС.

    Вот поэтому и нужно иметь:

    товар А сопоставленный к ЕГАИС А

    товар Б сопоставленный к ЕГАИС Б

    При том что товар А и Б, по-сути одинаковые, но сделаны на разных заводах одного производителя.

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

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

    Reply
  15. karpik666

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

    Reply
  16. myALKleon

    (15) Согласен, давайте на этом и остановимся. Но , всё-таки, насчёт «простоты». В рознице есть такая кнопочка, на которую никто не обращает внимания «Печать справок 2».

    По-хорошему, каждый раз, когда мы формируем документ передачи в торговый зал, мы должны клеить эти справки. Сталкивался с таким, клиент всё перемещал, а потом решил вернуть всё поставщику. Нужно делать возврат из торгового зала, а там нужно указать справку, и вот тут то и засада, ведь все бутылки перемешаны.

    Reply
  17. AlexCherdakov

    (15) мы тоже раньше работали как вы предлагаете «для удобства розницы» и сдача отчетов в РАР для бухгалтерии была адом, ладно пиво там можно не отражать реальные продажи а рассчитывать по поступлениям но вот с крепким алкоголем такой фокус череват серьезными последствиями, теперь на каждую позицию ЕГАИС своя позиция номенклатуры (благо прошел тот период когда поставщики плодили номенклатуру как горячие пирожки) алкогольный код в артикул и оклейка внутренними штрих кодами (там же справка Б), полгода полет нормальный

    ЗЫ сеть не большая, дюжина магазинов

    Reply
  18. karpik666

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

    Reply
  19. karpik666

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

    Reply
  20. AlexCherdakov

    декларация же, приложения 11, 12 да и с оптовиками работал там вообще полный набор

    Reply
  21. karpik666

    (20) в программе Розница эта декларация есть?

    Reply
  22. AlexCherdakov

    (19) согласен, но и недооценивать факт перехода на учет 1 в 1 и оклейку не могу

    Reply
  23. karpik666

    (20) и причем здесь оптовики, если мы рассматриваем только розничную торговлю, для оптовиков есть специализированные решения, например Управление Торговлей: Алкогольная продукция, со всей необходимой отчетностью, там функционал по учету алкоголя итак встроен, без какого либо ЕГАИС.

    Reply
  24. karpik666

    (22) я его не недооцениваю, потому что это как раз самый простой вариант сказать: «Чтобы у вас шли остатки, заведите свои штрихкоды, и обклейте ими все бутылки», по моему это огромные трудозатраты, которые можно избежать, используя мой вариант.

    Reply
  25. AlexCherdakov

    (21) используем обработку http://infostart.ru/public/157454/

    Reply
  26. AlexCherdakov

    (23) при том что у них точно так же встает вопрос сопоставления номенклатуры

    Reply
  27. AlexCherdakov

    (25) все же предлагаю вам обдумать сдачу отчетности в РАР при моем и вашем способе розничной торговли алкогольной продукцией

    Reply
  28. karpik666

    (24) Что данная решение не работает так как вы ожидаете, то нужно разбираться в чем причина конкретно с заполнением данной декларации: какие ошибки были при заполнении, что не так указывалось.

    Reply
  29. karpik666

    (26) какой вопрос? пришел товар с тем же штрихкодом, что и был, в ЕГАИС это другой код, мы его пикаем сканером, у нас находится уже существующая номенклатура, мы его сопоставляем с нашей.

    Reply
  30. karpik666

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

    Reply
  31. AlexCherdakov

    (28) еще раз «по честному» заполнить декларацию при вашем методе учета вы не сможете, если опираться на свой справочник Номенклатура вам придется сдавать в РАР данные которые вам предоставит поставщик, если совсем не опираться на вашу номенклатуру а опираться только на номенклатуру ЕГАИС у вас неверно будут заполнены продажи, еще раз повторюсь сначала обдумайте этот вопрос потом пишите

    Reply
  32. AlexCherdakov

    (29) вопрос дальнейшего предоставления отчетности в контралирующие органы

    Reply
  33. karpik666

    (31) посмотрел приложение 11 декларации алкогольной продукции, действительно, если сопоставлять с несколькими, то не получится однозначно указать, что товар пришел именно от этого Производителя, из-за этого нельзя получить остатки на начало периода, продажи и т.д, хотя все эти данные хранятся в егаис из розницы мы не сможем их получить

    Reply
  34. webandroid

    А у нас умудрились несколько раз привязать одну и ту-же номенклатуру к одной и той-же номенклатуре ЕГАИС. В этом случае ваша обработка поможет?

    Reply
  35. myALKleon

    (34) Несколько раз одну номенклатуру к одной и той же невозможно, а если и нажали, то не страшно, одинаковая связь два раза подряд не создается

    Reply
  36. webandroid

    (35)это пользователи не могут, а программисты что хочешь могут 🙂 Был перенос из одной базы в другую и вот результат. Проверено, это одна и та-же номенклатура и номенклатура ЕГАИС то-же одинаковая. Нужно чтобы одна запись оставалась.

    Reply
  37. myALKleon

    (36) На скрине открыт регистр сведений «Соответствие номенклатуры ЕГАИС», выделите ненужную строчку и нажмите клавишу «Delete» на клавиатуре, это удалит выделенную связь.

    Reply
  38. user593840_metall_14

    Как я понимаю эта обработка решит проблему которая представлена на картинке, правильно ?

    А еще такой вопрос а может быть что 1 Алкогольная продукция ЕГАИС связана с более чем одной номенклатурой? например 2 номенклатурами или 3 и т д ?

    Reply
  39. user891855

    В последнем обновлении сопоставление одной позиции номенклатуры и нескольких позиций алкопродукции отменили. Теперь имеем одну номенклатуру Пиво балтика7 ж/б 0.9 у нас и кучу алкопрдукции разных поставщиков, кто производит это пиво….тула, питер, клин и тд… Не понимаю зачем это сделано? Это очень неудобно и при поступлении продукции и при списании((

    Reply
  40. CrimeanWind

    Для рознице 2.2.7 нечто подобное возможно реализовать? В ней убрали из регистра соответствия индентификатор упаковки, а у нас на нём построено всё сопоставление

    Reply
  41. user1014133

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

    Скачал данную обработку:

    Проверяю на Рознице 2.2.

    Платформа 8.3.10.2667 (Конфигурация Розница, редакция 2.2 (2.2.7.37))

    и

    8.3.10.2772 Конфигурация (Розница (базовая), редакция 2.2 (2.2.7.42))

    Список выходит, но при нажатии на ШАГ 1 — Выходит ошибка: Поле объекта не обнаружено алкогольная продукция и «задвоенные» связи не отменяются. Проваливаюсь в карточку товара, там физически убираю второе сопоставление — так работает.

    Подскажите в чем суть и второе

    Есть подозрение что список задвоенных выходит не весь.

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

    Reply

Leave a Comment

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