[Расширение] Загрузка данных из Excel в табличную часть документа с созданием не найденной номенклатуры




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

21 Comments

  1. e.kogan

    Спасибо, очень вовремя попалась. Самой выдирать было сугубо лень )

    Reply
  2. Hellisad

    Хорошая обработка

    Не хватает только загрузки единицы измерения

    Reply
  3. kancler.a

    Отличная обработка, простая и функциональная, Александру персональный привет.

    Reply
  4. garga

    При попытке загрузки в документ «Перемещение»(цены и суммы отсутствуют) выдает ошибку: Поле объекта не обнаружено (ЦенаВключаетНДС)

    Reply
  5. Sanya1984

    (4) К сожалению, данная обработка работает только в тех местах, где есть кнопка «Загрузить из внешнего файла». В описании обработки было сказано: почти в любой документ. В связи с вашей ошибкой дописал в описании, что только там где есть кнопка «Загрузить из внешнего файла».

    Reply
  6. Sanya1984

    (4) Могу посоветовать загружать в Поступление товаров, а затем на основании этого документа уже создать перемещение товаров

    Reply
  7. garga

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

    Reply
  8. Salinerius

    Спасибо!!!

    Reply
  9. Sanya1984

    (7) Напишите почту вышлю обработку, где исправлено загрузка для документа «Перемещение товаров»

    Reply
  10. garga
  11. garga

    (9) Большое спасибо за обработку!!!

    Reply
  12. nsm

    (9)Здравствуйте, Александр.

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

    Я пишу загрузку из XML файла, не могу понять как связать Цикл создания НовогоЭлемента и предварительную проверку на наличие данного Элемента в СправочникеНоменклатура. Как бы догадываюсь, что, например, НайтиПоНаименованию() или НайтиПоРеквизиту(), но на деле выходит ерунда.

    Спасибо.

    Reply
  13. Sanya1984

    (12) Поиск используется типовой (смотрите данную обработку в УТ 11.3), который ищет по заполненным реквизитам (например: по наименованию и артикулу). Единственное, что я добавил, если находит больше 1 элемента номенклатуры, то сообщаю пользователю об этом, а там уже пользователь решает, что делать. Для поиска по нескольким реквизитам используйте запросы.

    Reply
  14. alex_a_k

    С документом Установка цен номенклатуры работает?

    Reply
  15. Sanya1984

    (14) не работает, документ установки цен можно создать на основании поступления товаров

    Reply
  16. Bangalore

    Спасибо!

    Reply
  17. zoomych

    После обновления до 11.4.9.70 перестала работать (((

    такая крутая обработка была.

    Может кто знает где копать??

    Текст ошибки

    {ОбщийМодуль.ОбработкаТабличнойЧастиСервер.Модуль(327)}: Метод объекта не обнаружен (Свойство)

    Если СтруктураПараметровДействия.Свойство(«ПоДатеОтгрузки») И

    Reply
  18. Sanya1984

    (17) Исправлено, добавлена новая версия

    Reply
  19. 9_Mikhail_9

    (18)В перемещении товаров расширение или обработка работают?

    Reply
  20. Sanya1984

    Док. перемещение:

    1. В расширении точно не работает, так как там нет пункта меню «Загрузить из внешнего файла».

    2. В обработке работало, до версии 11.4.5 включительно.

    Есть вариант загрузить товары в поступление, а на основании создать перемещение.

    Reply
  21. 9_Mikhail_9

    (20)Скачал обработку но там к сожалению не работает на версии 11.4.8.92

    Reply

Leave a Comment

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