Замена наименования номенклатуры




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

18 Comments

  1. V.Nikonov

    Лучше с Опциональностью: Наименование; НаименованиеПолное. Тогда инструмент будет более гибкий.

    Ещё лучше разделить Шаблон поиска и Заменяемый текст…

    Хотя, ПРАВИЛЬНЕЕ — сначала сформировать Таблицу значений с новыми реквизитами, и только после подтверждения (отдельной кнопкой) производить Замену!

    Reply
  2. ranis888

    (1) Это мои первые обработки, не кидайтесь тапком сильно 🙂

    Reply
  3. FesenkoA

    (2) Учись принимать критику. Лучше начать писать хорошо сразу, чем переучиваться, как это делал я)

    Reply
  4. ranis888

    (3) Хорошо

    Reply
  5. ranis888

    (1) Хорошо, одно из ваших пожеланий сделаю в следующей обработке

    Reply
  6. ranis888
  7. V.Nikonov

    (2) Я не УПРЁКИ выдавал, а РЕКОМЕНДАЦИИ. Выставляя творение на суд читателей, надо задумываться о полезности ваших трудов. Желательно не отсчитываться о проделанной работе (не всем это интересно), а предлагать «достаточно универсальный», ПОЛЕЗНЫЙ продукт для широкого круга пользователей.

    Посему предлагаю, то что не сложно быстро подправить… потом обновить Публикацию.

    Reply
  8. user633533_encantado

    Ну сделал ты простую примитивную обработку, ну нафига ее публиковать. Бесполезный мусор же.

    Reply
  9. ranis888

    (7) Я это всё учту. Спасибо

    Reply
  10. ranis888

    (8) Этот «Бесполезный мусор» уже понадобился людям…

    Reply
  11. user633533_encantado

    Я подобные обработки пишу по 10 штук в день и все они у меня начинаю название с префикса «Разовая_», догадайся почему ?

    Reply
  12. ranis888

    (11) Повторюсь, что данная обработка может пригодиться людям(хоть и разово)

    Reply
  13. user633533_encantado

    (12) Повторюсь: мусор. Обработка, которую может написать любой школьник знакомый с 1С недостойна публикации.

    Reply
  14. ranis888

    (13) Если вас задела моя публикация, вы смело можете написать мне в ЛС и там обсудить. Если у вас нарушена психика, можете обратиться к специалистам

    Reply
  15. Kaval88

    Вкратце суть обработки, вдруг кому-то пригодится:

    НоменклатураОбъект = Выборка.Номенклатура.ПолучитьОбъект();

    НоменклатураОбъект.Наименование = НаЧтоЗаменяем;

    НоменклатураОбъект.Записать();

    Reply
  16. ranis888

    (15)Почти. Запросом получаем наименования номенклатуры, соотвествующие условию.

    НоменклатураОбъект.Наименование = НаЧтоЗаменяем;

    и это не верно. Таким образом ты изменишь всё наименование номенклатуры, а не только часть наименования

    Reply
  17. Kaval88

    (16)ну функции работы со строками я не стал описывать, простите.

    Reply
  18. Evilleo

    Скачивал тк написано что для управляемых форм.

    Обработка для множественной замены текста в наименованиях элементов номенклатуры в конфигурациях «Управление торговлей», «Бухгалтерия предприятия» как для обычных, так и для управляемых форм.

    Но управляемой формы похоже нет, эта обработка для обычных форм.

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

    Reply

Leave a Comment

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