<?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='\
Что значит >>намного более удобно???
Только ради отладки? так этот плюс не очевиден! В 95 % отладчик не нужен. Какой смысл лезть в конфигуратор и там что то писать? Я думаю что этот метод только замедлит написание правил.
Сама идея универсальной выгрузки-загрузки XML состоит в том, что обработка выгрузки-загрузки у всех одинаковая и она способна прочитать любые (корректные для конфигурации с которой производится работа) правила обмена и произвести выгрузку данных по этим правилам, а также загрузить любой (корректный для конфигурации с которой производится работа) файл обмена.
Если меняется обработка. то ее нужно высылать вдогонку с правилами и файлом обмена.
По поводу использования алгоритмов:
В случае семерки алгоритм вызывается из обработчика по имени функции, которая является наименованием алгоритма в КД, параметры в алгоритм можно передать через второй параметр: <Ваш любимый алгоритм>(, <Ваш любимый параметр>). В теле алгоритма переданный параметр будет доступен через переменную «ВходящиеДанные».
В случае восьмерки алгоритм вызывается методом «Выполнить(Алгоритмы.<Ваш любимый алгоритм>)» в теле обработчика, поэтому никакие параметры в него передавать не нужно, т.к. все переменные обработчика видны при выполнении алгоритма.
Для удобства отладки в промышленных масштабах в случае восьмерки, лучше дописать КД, чтобы она формировала текст модуля обработки, как она это делает для семерки.
(1) » … В 95 % отладчик не нужен …»?
— Хотя бы простая проверка синтаксических ошибок, может только ускорить написание правил.
(2) » …вызывается методом «Выполнить(Алгоритмы.<Ваш любимый алгоритм>)» в теле обработчика, поэтому никакие параметры в него передавать не нужно… »
— Мы можем написать ‘Функции’, которые возвращают ‘Результат’.
Полностью согласен с AVARY (2). Теряется универсальность. Так я, например, пользователю отправил один XML и он все сам разрулил. А так придеться еще ему долго объяснять что куда сохранить и откуда запустить…
(3) Отчасти согласен, но лучше прикрутить синтаксический контроль к «Конвертации данных» 😉 я бы Вам огромнейшее спасибо сказал…))))
(4) А конструкцией Выполнить(Алгоритмы.<Ваш любимый алгоритм>) мы можем прочитать необходимые данные и если необходимо их изменить, а большего и не надо
К тому же обработка может вообще не открыться в случае если вы сначала писали для одной конфигурации правила, а затем стали писать для другой с другими метаданными… как быть иметь копии V8Exchan81.epf для каждой базы или как?
Есть конечно плюс в обработке, это возможность отладки! Но….Каждый выбирает путь сам 😉
(2)(5) Универсальность… Замечательные слова. На практике перед пользователем стоит задача перенести данные из одной конкретной базы в другую конкретную базу, поэтому пишем правила именно для этой ситуации. Далеко не каждый пользователь, даже если он отслеживает последние версии конвертации (не встречал таких) может и захочет искать нужный файл V8Exchan81.epf, так что выслать его ему его все равно придется.
(2)»… Для удобства отладки в промышленных масштабах в случае восьмерки, лучше дописать КД, чтобы она формировала текст модуля обработки, как она это делает для семерки»
— уже написали разработчики, если не изменяет память, с 21 релиза конвертации
Иногда эффективнее добавить свои функции, чем использовать Алгоритмы. Пример описывать не буду. Скажу только, что для отдельных проектов это может быть актуально.
Вижу публикация уже мертва, но все же оставлю это здесь, для пользования возможностями и гибкостью функций, достаточно в конфигурациях приемника (или источника) создать общий модуль с набором необходимых вам функций, и вызывать их уже из процедур конвертации