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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *