Загрузка цен и номенклатуры из табличного документа




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

23 Comments

  1. olga_hach_new

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

    Подскажите, для кокой версии платформы и версии программы создана эта обработка? В моем случае при открытии выдается сообщение, что требуется конвертация документа, затем вылетает сообщение «Внешняя обработка не может быть прочитана текущей версией программы».

    Спасибо. 🙂

    Reply
  2. shurubchik

    Писалась на 8.2.13.199 если нужно могу выслать на 8.1 какая у вас?

    Reply
  3. shurubchik

    Придумать что то новое на этом поприще довольно таки сложно. Функционал я думаю всё-таки отличается как минимум особенностими интерфейса и т.п. вашу обработку видел только в картинках.

    Reply
  4. shurubchik

    За что минус от Вас я не понял если честно.

    Reply
  5. transhina

    Минус за то, что бесплатно 😀

    Reply
  6. shurubchik

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

    Reply
  7. shurubchik

    интересно о каких багах идёт речь 😀 обработка была сделана под конкретного заказчика и свою функцию выполнила на 100% писалась быстро не доводилась. баги могут быть на другой задаче. к примеру поиск идет первой попавшейся номенклатуры а надо бы искать все варианты, но такой задачи и не было.

    Reply
  8. mt1974

    Пара вопросов возникла — как из файла загрузить полное наименование? Что должно быть в заголовке столбца?

    При нажатии на кнопку «Поиск соответствия» возникает ошибка —

    Я что-то не так заполнил?

    Спасибо за ответ.

    Дмитрий

    Reply
  9. shurubchik

    Полное наименование можно загрузить через поле описание. какая у вас конфигурация?

    Reply
  10. mayzinger

    Если я правильно понял, то обработка написана для 8.2? Если можно скиньте для 8.1 на maizingersv@rambler.ru, заранее спасибо!

    Reply
  11. TbSasha

    А эта обработка написана именно для УТ10.3 для УТ11 она не подойдет?

    И что делает пункт меню «установить группу в номенклатуру»?

    Reply
  12. tango

    да, блин, низцкие сцуки.

    ну, это типа согласен с (8)

    **

    а минуса не буду, публикейшен вполне выше на фоне

    Reply
  13. cool.vlad4

    ой вей…я вот не согласен с (8)

    Пол рунета кричит про низкие зарплаты у программистов

    развивайтесь блин, учите новое будут хорошие зарплаты, хотя где у прогеров плохие зарплаты? путинской зарплаты все равно не будет 😀 убрать opensource и через два года останутся только красноглазые гики…вообще печально, что 1С особняком стоит в плане техник разработок…и потом свобода выбора…интересно а под какой лицензией 1С разрешает передавать обработки в своем формате сторонним лицам?

    Reply
  14. cool.vlad4

    (19) да, знаю я все это, я просто решил накаркать 😀 вспомнил про apple и их адскую вещь appstore, где контроль идет преимущественно над приложениями, вот я и имел ввиду, что 1С выгоднее ужесточить не лицензии продуктов, а их разработку и дополнительные модули(обработки)…но это так офф…вполне возможно, что скоро все на такую ерунду перейдут…нелицензионные обработки просто не будут работать…вшить в них ключ криптовский…и все…а насчет копипаста, все должно быть в меру и ни с чем не конфликтовать. вообще apple в этом плане гениальная вещь по вытягиванию денег

    Reply
  15. d.snissarenko

    (19) Причем с обеих сторон 🙂

    Reply
  16. Rassvet_ekb
    Reply
  17. trad72

    за обработку благодарю, сам изучаю 1с как пример помогла для самообразования, конечно +

    Reply
  18. Kaatinga

    Взял за основу для импорта листов для Рарус Автосервис+Автозапчасти. Очень интересно получилось. Кому интересно пишите в лучку.

    Reply
  19. alexa3100@mail.ru

    Спасибо огромное)

    Reply
  20. savvato

    Здравствуйте! Очеь понравилась обработка. Есть маленькая «хотелка». Можно ли к

    заголовки — номенклатура, код, артикул, описание, цена, ед)

    добавить поле «группа номенклатуры» и поле «производитель»?

    Reply
  21. shurubchik

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

    Reply
  22. savvato

    Сам немного поправил код там где мне было необходимо, автору биг сенкс, за отличную обработку в шаре. Рекомендую.

    Reply
  23. maratsat

    Скриншотами палите контору)))

    Как увидел картинки, то чуть не упал)) Родные названия!

    Когда я работал (до лета 2010) у нас была загрузка по другому сделана. Подгружался xls файл с тремя полями — article, price, supply. Прайс- базовая цена, Сапплайс — закупочная цена.

    И мы этой обработкой пользовались где то с 2005-2006г, как компания на 8.1 перешла.

    А вы тут что-то новое сделали. Удобно наверно ))

    А можно сделать чтобы было несколько столбиков цен? Типа — базовая, крупнооптовая, мелкооптовая?

    Reply

Leave a Comment

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