Штрихкодирование автозапчастей. Альфа-авто.




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

13 Comments

  1. Nio

    Сколько раз брался за это так и не получилось запустить ШК на складах. Дело в том что поставщики предоставляют электронные документы. И проще грузить из электронных версия. А для выдачи используют каталоги, где уже проставлены кат. номера. Кладовщику в таком случаи нужно просто найти запчасть уже по готовому списку. В итоге получается что ШК нужны только для инвентаризации. А быстрая и точная инвентаризация кладовщикам не выгодна. Вот я и попадал на откровенный саботаж. Вводили даже дополнительные премии за заведение ШК и оклейку товаров, но так и не сложилось.

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

    Reply
  2. TODD22

    (1) Nio,

    Вводили даже дополнительные премии за заведение ШК и оклейку товаров, но так и не сложилось.

    Ещё бы ввели прогрессивную шкалу депремирования за отсутствие ШК. Может и дело бы наладилось.

    И нормальный руководитель всех саботажников отправил бы искать себе другую работу.

    Reply
  3. de0nis

    Да, тут для поступления товара не всегда имеет смысл, т.к. есть электронные накладные и надо побыстрее товар принять. А для отгрузок бывает удобно иногда. С ячейками как раз тоже удобно бывает, в Альфе если вести полноценный ячеистый склад (не просто привязать номенклатуру к ячейкам, а именно возможность учета чего сколько в какой ячейке) то склад должен быть ордерный. И получается двойной документооборот — ПТиУ, РТиУ и Складские ордера. Менеджеры заполняют доки по электронным, а кладовщики сканером заполняют складские ордера. Потом можно сравнить, что получилось и проверить приходы и отгрузки. Можно еще ячейки оклеить штрих кодами и подставлять их в документы автоматически.

    Reply
  4. GopSTOP

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

    Reply
  5. proger1c81

    У нас тоже штрихкодирование не взлетело, т.к. при приемке товар ссортируется по брендам и номерам каталожным. В таком же порядке отправляются на полке. В таком же порядке после оформления электронной накладной печатается приемочный лист. По нему кладовщики быстро крыжат отклонения. При отпуске товара — его можно легко найти, т.к. по бренду и первым буквам кат.номера понятно, где товар находится. А инвентаризацию просто проводят незаинтересованные лица. Отклонения конечно потом показываются материально-ответственным лицам и происходит разбор полетов.

    Таким образом, ни штрихкодирование, ни ячеистость не применяется у нас.

    Reply
  6. de0nis

    (5) proger1c81, тоже хороший вариант. По сути «псевдо ячеистость». Координаты только не числовые, а по брендам артикулам. Но это удобно только если поддерживается примерно постоянный склад. Если он часто и сильно меняется, то это не применимо, особенно для кузовных деталей, бампера и капоты по алфавиту сортировать не очень то удобно и не везде положишь их, а если что-нт не влезет и придется весь склад переставлять. 🙂 От ячеек в такой ситуации никуда не деться.

    Reply
  7. proger1c81

    (6) Все верно, у меня случай, когда поддерживается ПРИМЕРНО постоянный склад, когда работаешь с постоянными поставщиками. В случае больших складов для интернет магазинов нужна совсем другая WMS.

    Каждый сам выбирает по своему бюджету и необходимостям

    Reply
  8. lstep

    Спасибо. Полезная статья. Воспользуюсь. Сейчас как раз занимаюсь внедрением штрих-кодирования на предприятии автосервиса. Номенклатура более 50 тыс. наименований. Описанный метод позволит облегчить работу по заполнению справочника.

    Reply
  9. de0nis

    (8) Спасибо за отзыв. Надеюсь информация поможет.

    Reply
  10. caldino

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

    Дано: 1С УТ 10.3 вручную дописанная для продажи Автозапчастей (автора уже не найти).

    На данный момент в Поступление загружается табличка из Эксель и потом проводится. Товар считается вручную кладовщиками, ищутся артикулы , сверяется количество. Номенклатура на сладе более менее постоянная. Потом, при отгрузке, так же по артикулу и количеству делается сборка на основании реализации.

    Далее — вопросы:

    1. Для приемки нужен ТСД или достаточно сканера штрих-кодов?

    2. При поступлении товара идет сверка с готовой накладной поступления из 1С или в пустую накладную вносятся значения при каждом «пропикивании» ?

    3. Базу штрих кодов надо вносить по ходу работы или надо вносить заранее? Пока в Номенклатуре есть только Артикулы и Бренд поставщика.

    4. При отгрузке товара идет сверка с готовой накладной поступления из 1С или в пустую накладную вносятся значения при каждом «пропикивании» ?

    Подскажите пожалуйста, ни разу не сталкивался с сканированием товара по штрих коду. Спасибо за ответы.

    Reply
  11. de0nis

    (10) Нюансов много, всё зависит от задач и условий, но грубо:

    1. Сканер будет сканировать на прямую в документ 1С по одной строке. ТСД накапливает информацию в себе, потом полностью весь товар можно перенести в накладную в 1С. Т.е. если ШК заполнены в базе, то для заполнения накладной достаточно сканера и если есть возможность приёмки у компьютера, что б сразу видеть считался ли штрих код и определилась ли номенклатура. ТСД позволит принимать товар без компьютера на улице.

    2. В типовом функционале УТ 10.3 сверки, что должно быть и что заполнили по ШК — нет. В пустую накладную добавляются строки. Можно или доделать в 1С функционал сверки, или некоторые ТСД позволяют это делать, зависит от модели ТСД и установленного на нём софта.

    3. Собственно об этом и была статья 🙂 Штрих коды желательно что б уже были. С статье описан вариант автоматического поиска номенклатуры по артикулу, который закодирован в штрих коде и подводные камни с которыми столкнулись в этой задаче. Этот функционал требует доработки конфигурации, в типовом варианте, если ШК не заполнен номенклатура не будет найдена. В зависимости от релиза УТ, возможно будет предложено выбрать номенклатуру из справочника и она автоматически привяжется к считанному штрих коду. Но заполнение штрих кодов во время работы сильно увеличит время приёмки и отгрузки.

    4. см. п. 2. В типовом функционале сверки что должно быть и что набили нет.

    Reply
  12. de0nis

    (10) По оборудованию всё сильно зависит от условий эксплуатации и схемы работы. В целом достаточно обычных одномерных сканеров (есть без проводные), ТСД по необходимости, тут нужно смотреть поддержку выбранных моделей для УТ 10, и возможно нужно будет докупать софт для самого ТСД и настраивать его. Желательно принтер этикеток, что б можно было печатать этикеты со штрихкодами для товара на котором нет этикеток или переделать поврежденные ШК.

    Reply
  13. caldino

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

    Reply

Leave a Comment

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