Быстрое создание характеристик номенклатуры по дополнительным реквизитам в УТ11 + ВИДЕО




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

27 Comments

  1. yaguarrr

    Ошибка получения файла

    Reply
  2. GATTUSO

    (1) yaguarrr, попробуйте еще разочек.

    Если все равно не скачается — напишу в техподдержку.

    Reply
  3. david1915

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

    Reply
  4. GATTUSO

    (3) david1915, в каком смысле «перезаписала»? 🙂

    Reply
  5. david1915

    (4) ну типа команды (уж не знаю язык) открыть все характеристики, записать и закрыть все характеристики. просто у меня вот такой гемор:

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

    Reply
  6. GATTUSO

    (5) david1915, если я правильно понял, что вам нужно. То просто надо перезаписать программно все существующие характеристики, это можно сделать например стандартной обработкой подбор и обработка объектов. Возможно надо будет написать код капельку посложней, чтобы открывалась программно форма характеристики и записывалась.

    Можете мне написать в скайп (он есть в моем профайле), постараюсь вам помочь.

    Reply
  7. bagdenia

    Добрый день! Скажите, а как обработка кушает свойства, когда тип у него файл? Что-то очень долго висит и ничего не происходит.

    Reply
  8. GATTUSO

    (7) bagdenia, приветствую! Обработка может долго работать — это нормально, если много свойств и большое количество номенклатуры.

    С обработкой файлов проблем быть не должно, НО на всякий случай можно в коде (код открытый) поставить, чтобы это свойство не участвовало никак в создании характеристик (существенно ускорит процесс создания).

    Reply
  9. bagdenia

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

    Reply
  10. GATTUSO

    (9) bagdenia, ну да, для вашего случае в коде пару строк надо изменить, чтобы файлы не перебирались и будет счастье 🙂

    Reply
  11. bagdenia

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

    Reply
  12. GATTUSO

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

    Reply
  13. bagdenia

    (12) а как же не участвовали, если надо чтобы участвовали? Ну вот пример.

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

    Если же автоматом — то файлы сами по себе никак не обозначают свою принадлежность конкретной позиции и свойству, и будет создано избыточное количество характеристик. Это только если по одной позиции обрабатывать и в параметрах обработки указывать еще папку файлов для конкретного свойства и для данного элемента ном-ры. Проще никак и не выйдет. Я не права?

    Reply
  14. GATTUSO

    (13) bagdenia, то есть свойство цвета имеет тип не строка (например, «синий», «красный» и тд), а тип файл? В котором как я понимаю присутствует этот цвет?

    Вы вчера обработку запускали-она прошла? Что в итоге вышло?

    Reply
  15. bagdenia

    (14) именно, файл. Называется файл красный, синий, но это файл, и так надо. Файл потом отправляется на сайт и служит иллюстрацией. Запускала, нет, не доходит до конца, отваливается с ошибкой сервера. И это только по одной позиции. Я смотрела внутрь на алгоритм, он пугающ )

    Reply
  16. GATTUSO

    (15) bagdenia, да, алгоритм нетривиальный 🙂

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

    Reply
  17. bagdenia

    (16) Бесплатно? )

    Reply
  18. GATTUSO

    (17) bagdenia, ну если там не совсем жесткач будет, то да:)

    Reply
  19. bagdenia

    (18) ух ты, крутяк ) Спасибо, напишу.

    Reply
  20. DjPrizrak

    под Управление торговлей для Украины 3.0 подойдет?

    Reply
  21. GATTUSO

    (20) DjPrizrak, если она схожа по структуре с УТ11, то да. Можете при желании выслать мне конфигурацию, я протестирую и скажу вам.

    Если даже не подходит-могу для Вашей конфигурации доделать обработку.

    Мои контакты в профайле.

    Reply
  22. djdiamond

    Управление торговлей, редакция 11.1 (11.1.10.94) — ничего не выводится!!! Жму заполнить и пусто(

    Reply
  23. djdiamond

    Первый же запрос который перебирает доп реквизиты выдаёт пустоту)

    Reply
  24. GATTUSO

    (23) djdiamond, нужно смотреть. Дополнительные реквизиты ХАРАКТЕРИСТИК есть? Именно для них сделана обработка

    Reply
  25. GATTUSO

    (23) djdiamond, интересно за что минус поставлен?

    В описании четко и подробно написано для чего обработка. Нужно читать наверное перед тем как скачиваешь. Не просто так все описывалось подробно.

    И видео так же имеется.

    Reply
  26. vitrym

    c УНФ 1.6 Совместима?

    стоит как раз такая задача, перекрестить все свойства (цвет*размер) и создать тыщу характеристик

    Reply
  27. GATTUSO

    (26) Иван, делалась под Ут11, но, думаю, доработки по адаптации под УНФ будут минимальны

    Reply

Leave a Comment

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