Загрузка дополнительных реквизитов и сведений справочника Номенклатура из Excel и таблиц УТ 11, ERP 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='\

21 Comments

  1. dvbdvb

    Будет ли работать на УТ 11.3?

    Reply
  2. Windyhead

    (1) На ERP 2.2.4 работает, значит и на УТ 11.3 тоже работать будет.

    Reply
  3. skmMining

    В УТ 11.3.4.103 не производит поиск номенклатуры по артиклу

    Reply
  4. Windyhead

    (3) Точно, была опечатка в коде, поправил. Спасибо что подсказали.

    Reply
  5. skmMining

    (4) Все работает, спасибо за оперативность

    Reply
  6. Oleg_N

    Добрый день,

    Скачал обработку, у меня у номенклатуры два дополнительных реквизита

    1 кратность, тип значения строка, загрузил значения без проблем.

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

    Reply
  7. Windyhead

    (6) Добрый день, в этой обработке нет загрузки и установки «представлений» загружаемых значений. По-идее не так сложно доработать при необходимости. Насколько помню текстовые представления значений есть только у дополнительных реквизитов и хранятся в реквизите «ТекстоваяСтрока» соответствующей табличной части

    Reply
  8. Oleg_N

    (7)Прошу сообщить стоимость доработки

    Reply
  9. Windyhead

    Добрый день. За 1500р сделаю.

    Пока себе это так вижу: Добавится в настройках реквизит с номером колонки содержащим представление и представление подгружается если оно заполнено в соответствующей колонке (т.е. указан номер колонки и ячейка не пустая и у доп реквизита установлена галочка «выводить в виде гиперссылки» ) ,

    Если вам нужно что то иное то опишите точнее.

    Reply
  10. parovoz8888

    Доброго дня! Меня интересует загрузка перечня допреквизитов к справочнику номенклатуры. Использую КА 2.4.3.170. Ваше решение позволяет загружать несколько допреквизитов к одному элементу номенклатуры одновременно?

    Reply
  11. Windyhead

    (10) Для этих целей как раз и создана эта обработка. Посмотрите внимательно скриншоты, в первой таблице в колонках идут значения доп реквизитов/ сведений, которые будут загружены для каждой позиции номенклатуры найденной по заданным условиям поиска

    Reply
  12. user895401

    Может ли обработка загружать доп реквизиты к характеристикам номенклатуры ?

    Reply
  13. Windyhead

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

    Reply
  14. user895401

    Добрый день. А сколько это будет стоить ?

    Reply
  15. user715400

    Добрый день!

    Нужно что бы обработка загружала несколько доп реквизитов для одной номенклатуры через точку с запятой, например артикул 12345 у этой номенклатуры есть три доп реквизита «мягкий» «жирный» «зеленый», если я укажу в колонке три раза артикул 12345 и справав следующей колонке укажу три доп реквизита разных то сможет обработка все три доп реквизита загрузить в эту номенклатуру? Мне нужно что бы в доп. реквизите получилось вот так: мягкий; жирный; зеленый

    Reply
  16. Windyhead

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

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

    Вам нужно привести свои данные к виду таблицы с колонками:

    Нименование или Артикул | Твердость | Жирность | Цвет

    где колонки «Твердость | Жирность | Цвет» как раз и будут доп реквизитами.

    Reply
  17. СергейКа

    В целом хорошо, на КА 2 работает.

    1. Неудобно переставлять таблицу при большом листе, можно было бы загрузку все же сделать )).

    2. В некоторых случаях сбивается загрузка значений — заголовок берет из одной колонки, а значение из предыдущей.

    3. Если колонку загружать не нужно, то вариант только создания допсвойства, нужно добавить возможность пропуска.

    Но все это легко поправляемое.

    Reply
  18. Windyhead

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

    1) «Переставлять таблицу при большом листе» не понял какое именно действие неудобно.

    2) Это возможно только в случае «не перезаполнения» таблицы «настройка колонок свойств», о чем обработка предупреждает и предлагает сделать автоматически

    3) подразумевалось что ели не загружаем то и не создаем (просто удаление свойства из таблицы настройки колонок свойств), но это уже нюансы.

    Reply
  19. СергейКа

    (18)

    1. В листе для загрузки 40 тысяч строк и 65 колонок )) Выделите и вставьте с первого раза, не всегда получается.

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

    3. Совместно со 2-м пунктом )

    Reply
  20. Windyhead

    (19)

    1. 65 колонок не проблема, а вот 40тыс строк согласен )) просто перешел на загрузку с табличного документа, после того как надоело бороться с пользователями у которых объединенные колонки в xls файле и они это отказываются замечать и доказывают что обработка работает не правильно.

    2. Если колонка не является доп свойством ее просто удаляем из нижней таблицы настройки свойств и все. там нет счетчика, все работает через имена соответствий которые устанавливаются в момент инициализации. а вот если подредактировать состав колонок в табличном документе и не перезаполнить состав свойств , тогда да, собьется (но об этом идет предупреждение).

    Reply
  21. СергейКа

    (20) По 2. Не совсем. Колонку подтягивает верно (доп свойство), а значение берет из другой. Там счетчик именно на получение значения из поля.

    Reply

Leave a Comment

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