Предварительный просмотр файла загрузки УРБД




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

14 Comments

  1. kran

    Ну что вы, люди… Прошу комментариев и пожеланий по теме.

    Найденные ошибки приветствуются.

    За выявленные ошибки спасибо sdaf-у.

    Reply
  2. SunShinne

    Пожелания по функционалу:

    Добавить фильтр для документов и операций по периоду. Например ввести два поля, ДатаНач и ДатаКон, если ДатаКон не задана, то в таблицу выводятся все документы после ДатаНач, если же и ДатаНач не указана то фильтр по периоду не дйствует.

    P.S. Спасибо 🙂

    Reply
  3. Mitrich

    Тут тож оставлю данные:

    Комп 2,8 ГГц, 512 ОЗУ, Win 2000 sp4, 25 релиз, УСН подправленная, файл обмена 967 килобайт (из ТиС выгрузка за 9 дней была в периферии, порядка 1000 документов новых/измененных + чуток справочников)

    «Обработка начата в 14:25:25

    Обработка закончена в 14:31:28″

    Т.е. 6 минут.

    Загрузка 90-100%, ОЗУ 50-200 М кушал, пик до 300

    Для ТиС тоже попробовал. Файл обмена в 600 кБт за 40 секунд обработался (наверно потому, что документы в основном только новые были).

    Ну и пожелание продублирую — статистику сводную в конец отчета выводить. Сколько и каких справочников/документов в файле и т.п.

    Reply
  4. SunShinne

    Попробовал новую версию — раз в 50 быстрее работает. На одной базе у меня старая версия прекращала работу с ошибками, новая вообще без проблем. Круто. Только без фильтра по периоду, юзеров пользоваться обработкой заставить не смогу.

    Reply
  5. SunShinne

    Косяк:

    Процедура ОбработкаПериодическогоЗначения

    err: Пер.ИспользоватьОбъект(ИмяРеквизитаПер, ОбъектПер);

    {\SERVER1C$ХХХEXTFORMSURBDPREVIEW.ERT(287)}: Дети не является константой или периодическим параметром!

    Сейчас попробую в отладчике посмотреть на чем спотыкается

    Reply
  6. SunShinne

    Вставил конструкцию:

    Попытка

    Пер.ИспользоватьОбъект(ИмяРеквизитаПер, ОбъектПер);

    Возврат;

    Исключение

    Сообщить(«ИмяРеквизитаПер: «+ИмяРеквизитаПер);

    Сообщить(«ОбъектПер: «+ОбъектПер);

    Сообщить(«ТипЗначенияСтр(ОбъектПер): «+ТипЗначенияСтр(ОбъектПер));

    Сообщить(«ОбъектПер.Вид(): «+ОбъектПер.Вид());

    КонецПопытки;

    После выполнения выдаются сообщения типа:

    ИмяРеквизитаПер: Дети

    ОбъектПер: Юридические лица

    ТипЗначенияСтр(ОбъектПер): Справочник

    ОбъектПер.Вид(): Сотрудники

    Это может после доработки для ТИС появилось (у меня в конфе Рарус ЕСХН Юрлиц вообще нет)

    Reply
  7. SunShinne

    Пардон,

    ОбъектПер.Вид() = «Сотрудники», Юрлица — это наименование сотрудника (приколисты)

    Reply
  8. SunShinne

    Теперь вот так пишем:

    Попытка

    Пер.ИспользоватьОбъект(ИмяРеквизитаПер, ОбъектПер);

    Исключение

    Сообщить(ОписаниеОшибки());

    Возврат;

    КонецПопытки

    Вот список ошибок:

    Дети не является константой или периодическим параметром!

    ДоходОблагаемыйПФР_СНачалаГода не является константой или периодическим параметром!

    Инвалид не является константой или периодическим параметром!

    КоличествоДнейБолезни не является константой или периодическим параметром!

    КоличествоДнейОтпуска не является константой или периодическим параметром!

    НачислятьНалогиСФОТ не является константой или периодическим параметром!

    Оклад не является константой или периодическим параметром!

    ПроцентСевернойНадбавки не является константой или периодическим параметром!

    СальдоНалогаНаДоходы не является константой или периодическим параметром!

    Субконто1 не является константой или периодическим параметром!

    Субконто2 не является константой или периодическим параметром!

    Субконто3 не является константой или периодическим параметром!

    СчетЗатрат не является константой или периодическим параметром!

    ТипВычета не является константой или периодическим параметром!

    ХарактерРаботы не является константой или периодическим параметром!

    Статус не является константой или периодическим параметром!

    РазмерВычетаНаРебенка не является константой или периодическим параметром!

    ДвойнойВычетНаДетей не является константой или периодическим параметром!

    ДетиИнвалиды не является константой или периодическим параметром!

    РазмерВычетаНаРебенкаИнвалида не является константой или периодическим параметром!

    Подразделение не является константой или периодическим параметром!

    Reply
  9. SunShinne

    Хм… странные ошибки, дети у сотрудников — периодический реквизит 🙁

    Reply
  10. kran

    Вообще тут проблема может быть только одна — mdшники разные.

    Посмотри Описание структуры метаданных: (Конфигуратор-конфигурация-Описание структуры) в источнике и приемнике. Смотри этот справочник.

    Вся проблема в том, что в файле обмена нет сведений, что какая цифирь означает, поэтому разборка идет на основании метаданных той базы, в которой запустил обраотку.

    В твоем случае идет не соответствие и сдвиг.

    Reply
  11. SunShinne

    Это многое объясняет. Спасибо.

    Reply
  12. NoRazum

    Winrar уже не в моде.

    По началу разжимает им.

    Очень полезная обработка.

    При больших объемах. Падает. Нехватка памяти.

    Reply
  13. pvlunegov

    Спасибо за отличную обработку.

    Winrar действительно уже не в моде. Пришлось допиливать обработку, чтобы брала не архив, а файл Dat и работала с ним.

    Еще доработал — добавил опцию — «Без вывода детальной информации по изменениям».

    Выводятся только Дерево — типы справочников, документов, номера (коды справочников), даты документов.

    Для иерархических справочников выводятся родители.

    Могу выложить дополненную версию вашей обработки для народного достояния.

    Reply
  14. espero2000

    (13) Хорошо бы выложить.

    Reply

Leave a Comment

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