База штрихкодов для Розницы 2




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

18 Comments

  1. user593180_nixonsis123

    хотел сделать бесплатной но что то инфостарт не позволил

    Reply
  2. Shakirrr

    вроде статя но внутри пусто =(

    Reply
  3. user593180_nixonsis123

    (2) Всмысле обработка пустая?

    Reply
  4. webandroid

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

    Reply
  5. user593180_nixonsis123

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

    Reply
  6. user593180_nixonsis123

    (4) Только что определился, сделаю на след неделе

    Reply
  7. user593180_nixonsis123

    (4) Если в первой базе есть штрихкод 1 и 2 а во второй 2 и 3, то через штрихкод №2 будет установлена связь между ними, но если в первой базе 1 и 2 а во второй 3 и 4 тогда в этом случае будет новая номенклатура

    Reply
  8. webester

    (0)

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

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

    https://ean13.info и говорят вот это тоже работало https://barcodes.olegon.ru/(но я не пробовал)

    Reply
  9. user593180_nixonsis123

    (8) Обработка написана тогда когда нужно было в срочном порядке запускать несколько магазинов с более ли менее одинаковым ассортиментом, те что привели вы видел, полезные сервисы но все таки платные, хотя 600 рублей за 5000 запросов не так уж много, тут немного по другому там вы создаете все равно поштучно (насклько я понял) а здесь сканируете товары подряд создавая массив из штрихкодов и нажатием кнопки создаете «пачку» номенклатуры

    Reply
  10. webester

    (9)

    те что привели вы видел, полезные сервисы но все таки платные

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

    (9)

    а здесь сканируете товары подряд создавая массив из штрихкодов и нажатием кнопки создаете «пачку» номенклатуры

    Так вроде это просто выгрузка номенклатуры со штрихкодами, здесь же это… конвертация или даже выгрузка-загрузка данных если конфигурация одинаковая, зайдет идеально, писать ни строчки кода не надо, или нет?

    Reply
  11. user593180_nixonsis123

    (10) Про подручные средства можно поподробнее?

    (10)

    Так вроде это просто выгрузка номенклатуры со штрихкодами, здесь же это… конвертация или даже выгрузка-загрузка данных если конфигурация одинаковая, зайдет идеально, писать ни строчки кода не надо, или нет?

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

    Reply
  12. webester

    (11)

    Про подручные средства можно поподробнее?

    Перезагрузка роутера — получение нового ип, капча не беспокоит. Но так работало только у нас. У коллег, то-ли ип не менялся, то-ли капча все равно не пропадала, не помню.

    (11)

    Обработка не претендует на звание лучшей, просто может кому пригодится

    Не то, что бы я говорил, что она плохая или хорошая, просто добавил, что в целом проще было бы использовать штатные средства. Но если вам так удобнее… главное, что бы магазин запустился, на остальное в целом…

    Reply
  13. user593180_nixonsis123

    (12) Может мы не совсем понимаем друг друга, в файле в итоге образуется большая база штрихкодов, и при необходимости можно вытягивать отдельные записи

    Reply
  14. webester

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

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

    Reply
  15. user593180_nixonsis123

    (14)Случайно не осталась обработка? Хотелось бы взглянуть, да и многим пригодилась бы

    Reply
  16. webester

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

                Соединение = Новый HTTPСоединение(«www.ean13.info»);
    Ответ = Соединение.Получить(Новый HTTPЗапрос(«»+КакойТоШтрихКод+».htm»));
    
    РезультатПоиска = Новый Структура(«Статус, Товар,Страна,Производитель,Штрихкод», СтрокаСообщения);
    
    Если Ответ.КодСостояния = 200 Тогда
    ЧтениеХТМЛ = Новый ЧтениеHTML;
    ЧтениеХТМЛ.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    ПостроительДОМ = Новый ПостроительDOM;
    
    ДокументХТМЛ = ПостроительДОМ.Прочитать(ЧтениеХТМЛ);
    ЭлементыДОМ = ДокументХТМЛ.ПолучитьЭлементыПоИмени(«span»);
    Если ЭлементыДОМ[1].ТекстовоеСодержимое = «Товар не найден в базе данных» Тогда
    //может будем как то обрабатывать
    Иначе
    РезультатПоиска.Статус = «Найдено в интернете»;
    РезультатПоиска.Товар = ЭлементыДОМ[1].ТекстовоеСодержимое;
    РезультатПоиска.Страна = ЭлементыДОМ[4].ТекстовоеСодержимое;
    РезультатПоиска.Производитель = ЭлементыДОМ[5].ТекстовоеСодержимое;
    РезультатПоиска.Штрихкод = ТекКод;
    КонецЕсли;
    Иначе
    //может будем как то обрабатывать
    КонецЕсли; 

    Показать

    Сейчас говорят там https и еще что-то переделали, надо писать заново. Ну или смотреть. Ну и был момент поиска в текстовом файле. Это у вас уже есть. Форму для создания нового элемента справочника, тоже выкладывать не имеет смысла. Ее в целом может каждый набросать за несколько минут под свою специфику и как ему удобно.

    Reply
  17. user593180_nixonsis123

    (16) Спасибо

    Reply
  18. xeephon

    В текстовой файл ничего не записывается. По инструкции нет кнопки «Прочитать» и «Сохранить ШК из БАЗЫ», это видно даже на скрине автора.

    Reply

Leave a Comment

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