Ведение артикулов и изображений номенклатуры по характеристикам. Простое решение




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

19 Comments

  1. 1cprogr_nsk

    А почему бы артикул, который вы используете в характеристике, использовать как Наименование этой характеристики, а ЦВЕТ как свойство ХАРАКТЕРИСТИКИ

    Reply
  2. Boudybuilder

    (1) dr.death, Для этого прийдется делать еще один шаг добавляя свойство характеристике. Да и непонятно как это сработает при выгрузке на Битрикс…

    Reply
  3. 1cprogr_nsk

    Свойства характеристикам — типовой функционал. На битриксе всё это учитывается при выгрузке, просто в xml ваши данные будут в других тегах. нужно будет на сайте настроить что откуда брать в карточку товара

    Reply
  4. Lyns_owner

    Чего вы добьетесь, установив текст в таб. части? З.Ы. вы добавили обязательный реквизит в процедуру, которая вызывается если не из всех, то из БОЛЬШИНСТВА документов системы, вы все эти вызовы переписали? Ради того, что в документе видеть текст, который не попадет на печать?

    Reply
  5. Boudybuilder

    (4) Lyns_owner, а чет там менять то? Глобальная замена в помощь!

    Reply
  6. cool.vlad4

    (5) это была шутка? менять все вызовы…я уж молчу, что лучше тогда просто лишний параметр сделать по умолчанию Неопределенно и все. Решение в статье сомнительное. Нет, даже постановка задачи сомнительная. Ну изображения понятно, а артикулы здесь причем?

    Reply
  7. Boudybuilder

    (6) cool.vlad4, ладно… Мне эти артикулы стока минингита не доставляют как изображения… Теперь не знаю как нормально на Битрикс все таки выгружать… Одни так говорят … другие так… 🙁

    Reply
  8. Ele1234567

    Здорово!

    Reply
  9. jigourt

    мучает один вопрос, чем ПВХ свойства объектов не угодило?? на мой взгляд сомнительное удовольствие вносить столько изменений.

    Reply
  10. Boudybuilder

    (9) jigourt, А Как в СВОЙСТВО Вы бы картинку записали?

    Reply
  11. jigourt

    (10) добавляете справочник изображений в тип значения характеристики и вуаля

    вообще в принципе прочитал публикацию. справочник характеристик подчинен номенклатуре, а вы добавляете артикул подчиненному элементу. в вашем случае, я бы характеристики перенес в свойства и наплодил бы нужное кол-во номенклатур с нужными артикулами. в вашем случае вы ломаете всю природу справочника Характеристики номенклатуры и как следствие у каждого элемента своя картинка

    Reply
  12. Boudybuilder

    (11) jigourt, а как складской учет вести в разрезе свойств?

    Reply
  13. jigourt

    (12) а зачем вам это делать если у вас один артикул это определенный набор свойств?

    судя по картинкам, у вас будет свойство Цвет с неким значением, а артикул переедет к артикулу самой номенклатуры

    Reply
  14. Boudybuilder

    (13) Ну да. По характеристикам мы ведем только по цветам. И там свойства одинаковы. А вот для ноутбуков например, разный артикул — это и разные свойства. Но модель может быть одна и та же самая. Мы больше это делали для битрикса. Так как там в таком случае непонятно как связать такие товары в предложения. Когда есть одна модель но с разными свойствами. У нас это отдельные товары. 🙁 (отдельная номенклатура)

    Reply
  15. jigourt

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

    Reply
  16. Boudybuilder

    (13) jigourt, один артикул это определенный набор свойств.

    Тогда какой смысл вобще в характеристиках? Раз и свойства разные , то по характеристикам нефиг вести.

    Reply
  17. jigourt

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

    Reply
  18. Boudybuilder

    (17) jigourt, тодЫ ж я правильно все решил! Что вы меня путаете?

    Reply
  19. jigourt

    (18) как правильно, когда вот это

    во-первых это добавить реквизиты справочнику ХарактеристикиНоменклатуры «Артикул» и «ОсновноеИзображение» аналогично справочнику Номенклатура

    противоречит тому, что я сказал

    Reply

Leave a Comment

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