<?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='\
я дeлaл пoдoбнoe для пapтионного учёта, нo c иcпoльзoвaниeм штaтныx пpoцeдуp УТ. лoг y мeня пишeтcя в жypнaл peгиcтpaции. выкладывать не стал, но если есть интерес.
(0) Лучше оформить в виде отдельного класса-обработки, в которой решать проблемы по выводу информации и т.п.
Например. вместо
Док.ДобавитьСтроку(Сообщение)
намного лучше будет смотреться вызов спец.метода
ВывестиСообщение(Сообщение)
В случае использования подобных промежуточных методов появляется различные возможности — можно инкапсулировать работу клиента и сервера, т.к. часто подобные обработки приходится вызывать и от имени клиента для проверки, анализа и т.п.
У меня в подобных задачах юзается следующий интерфейс, т.е. методы типа
Инит
Сброс
ВывестиСообщение
ВывестиСостояние
ОсновнаяОбработка (или типа ВыполнитьВыгрузку_КокаКола, ВыполнитьВыгрузку_Мултон, ВыполнитьВыгрузку_Сладко, ВыполнитьВыгрузку_Лебедянь, Балтика и т.д. )
ПолучитьТекстЛог
(2) Разумеется. В рабочей конфигурации так и сделано. Это же, повторяю, был пример для начинающих разработчиков.
(1) Чем больше информации в открытом доступе, тем лучше. Сам я начинал с сборника ЕСИС, т.к. с работы доступ к интернету был очень ограничен. 🙂
(3) Кстати, код процедуры лучше разукрась. Разукрашка для инфостарта здесь валяется.
(4) Да я бы разукрасил, тем более что саму «разукрашку» нашел. Но! Скачать не могу, лимит исчерпан :))) Так что завтра наверное 🙂
(3) Даже для начинающих разработчиков пример слишком уж упрощен 🙁
1. Сохранение данных в файл не лучший вариант.
а) В случае нескольких выполнений предыдущее содержание файла удалится.
б) У пользователя Винды, от чьего имени запускается и работает клиент-сервер, просто может не быть прав на каталог C: (при обычной установке 1С без доп.настройки прав прав на этот каталог не будет точно !! )
В итоге запись будет невозможна и задание просто не будет работать.
Я, например, на днях на подобное нарвался — у пользователя Usr1C81, под чьим именем работал сервер 1С, не было прав на каталог на сервере домена.
ИМХО журнал регистрации гарантированно лучше.
2. Для начинающих пользователей еще было очень полезно получить код по непосредственному запуску регламентного задания из клиентского кода, без ожидания срабатывания по расписанию, например, для отладки и/или проверки выполнения
Показать полностью
(6) Чем больше информации в одном месте, тем лучше 🙂 Опыт лишним не бывает. А что касается файла, то я его делал исходя из личного опыта, т.к. работаю по удаленке, и мне лучше посмотреть электроннку с очетом, который приходит каждое утро, чем лезть по удаленке, загружать базу, смотреть журнал регистрации и т.п.
У меня выдает в текстовый файл
Ошибка при вызове метода контекста (Восстановить): Операция не выполнена!
Возможно, в базе имеются работающие пользователи
Хотя в базе никого нет