Загрузка данных из внешних файлов для Розницы 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='\

8 Comments

  1. Kontakt

    День добрый. Очень хорошая обработка. Но есть замечание:

    1. При создание новой позиции и характеристики. Дублируются позиции и характеристики. Не происходит поиск.

    например. загружаем сразу две строки. Номенклатуры такой нет. арт1 майка 1размер. арт1 майка 2размер. создаются две позиции номенклатуры. хотя одна с разными характеристиками. И создаются новые характеристики. Они уже заведены. Сделайте повторный поиск при заведение новой позиции. и поиск по характеристикам.

    2. Загрузка доп. реквизитов и сведений. Например у номенклатуры добавлены доп реквизиты модель, сезон, пол, и др. вот бы сразу бы погружать при создание. Цены бы обработке не было)

    3. Вынести отдельной кнопкой создание штрих кода.

    Reply
  2. Sanya1984

    Сейчас

    (1)Спасибо, рассмотрю возможность доработки

    Reply
  3. Nigelist

    (0) не поделитесь кодом запроса, из модуля менеджера документа? А то у меня проблема с сопоставлением номенклатуры по ШК. И количество не заполняется почему то.

    Reply
  4. Sanya1984

    ВЫБРАТЬ РАЗРЕШЕННЫЕ

    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,

    ВЫРАЗИТЬ(ШтрихкодыНоменклатуры.Владелец КАК Справочник.Номенклатура) КАК Номенклатура,

    ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,

    ШтрихкодыНоменклатуры.Упаковка КАК Упаковка

    ИЗ

    РегистрСведений.Штрихкоды КАК ШтрихкодыНоменклатуры

    ГДЕ

    ИСТИНА

    И &ШтрихкодыТекстУсловияОтбор

    И ШтрихкодыНоменклатуры.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)

    ;

    ////////////////////////////////////////////////////////////­////////////////////

    ВЫБРАТЬ РАЗРЕШЕННЫЕ

    Номенклатура.Ссылка КАК Номенклатура,

    ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика

    ПОМЕСТИТЬ НомХар

    ИЗ

    Справочник.Номенклатура КАК Номенклатура

    ГДЕ

    НЕ Номенклатура.ЭтоГруппа

    И НЕ Номенклатура.ПометкаУдаления

    И Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать)

    И &ТекстУсловияОтбор

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ

    Номенклатура.Ссылка,

    ХарактеристикиНоменклатуры.Ссылка

    ИЗ

    Справочник.Номенклатура КАК Номенклатура

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры

    ПО (ВЫБОР

    КОГДА Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.ИндивидуальныеДляНоменклатуры)

    ТОГДА Номенклатура.Ссылка

    КОГДА Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.ОбщиеДляВидаНоменклатуры)

    ТОГДА Номенклатура.ВидНоменклатуры

    ИНАЧЕ НЕОПРЕДЕЛЕНО

    КОНЕЦ = ХарактеристикиНоменклатуры.Владелец)

    ГДЕ

    Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик <> ЗНАЧЕНИЕ(Перечисление.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать)

    И НЕ Номенклатура.ПометкаУдаления

    И НЕ ХарактеристикиНоменклатуры.ПометкаУдаления

    И &ТекстУсловияОтбор

    Reply
  5. Nigelist

    (4) Спасибо!

    Reply
  6. Nigelist

    (4)

    &ТекстУсловияОтбор

    Подскажите, что вы отбираете по этому условию?

    Reply
  7. Nigelist

    (6)

    &ШтрихкодыТекстУсловияОтбор

    и это.

    Reply
  8. Sanya1984

    (6) (7) Планировал сделать отборы по типу номенклатуры. По-умолчанию, передаются след параметры: ТекстУсловияОтбор = «ИСТИНА»;

    ШтрихкодыТекстУсловияОтбор = «ИСТИНА»; Можно эти отборы спокойно убрать.

    Reply

Leave a Comment

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