Работа с расшифровкой отчета на СКД




Принцип обмена данными из 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. HAMMER_59
    ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОтчета,Новый УникальныйИдентификатор)

    Т.е. при каждом формировании отчета, данные расшифровки будут помещаться в отдельное хранилище, и будут храниться до конца сеанса.

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

    Reply
  2. Isonic

    (2) можно и идентификатор формы. Так, думаю, будет правильнее

    Reply
  3. awk

    Почему не в фоне формирование отчета? Почему не предопределенная процедура в модуле объекта?

    Reply
  4. Isonic

    (4)поясните подробнее

    Reply
  5. awk

    Э… То что вы привели в процедурах Сформировать(Команда), СформироватьНаСервере очень плохой стиль…

    Есть процедура модуля отчета ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) — лучше работать через нее…

    Reply
  6. Isonic

    (6)не соглашусь.

    когда «отчет» не будет является основным реквизитом, будет ли доступно ваше событие?

    Reply
  7. herfis

    (7) Пример должен быть цельным. Ваш пример — именно отчет. Компоновка не в отчете будет иметь свои особенности, как и расшифровка. Так что замечание по делу. Это же в помощь новичкам? А ваша статья может ввести новичков в заблуждение.

    И было бы неплохо довести пример до программного обращения к данным расшифровки в ее программной обработке, так как это тоже неочевидный момент для новичков.

    Reply
  8. Isonic

    (6)прошу прощения, вы имели в виду модуль объекта отчета. тогда да.

    Reply
  9. herfis
    Настройки = МакетСКД.НастройкиПоУмолчанию

    Вот это тоже фигня. Мало того, что игнорируются пользовательские настройки (которых в реальном отчете просто не может не быть), так еще и предполагается что вариант отчета только один.

    Короче, пока что минус статье. Очень уж сырая.

    Reply
  10. Yashazz

    С одной стороны, попытка рассказать своими словами, что хорошо; ибо обычно внаглую передирают Хрусталёву. С другой, да, кривизны и спорных моментов много.

    Reply
  11. Isonic

    (10)

    (11)

    Я неимоверно рад, что у нас есть такие умные люди как Вы!

    Reply
  12. Yashazz

    (12) Автор, поучитесь общаться в интернетах. В частности, мой Вам добрый совет: научиться понимать разницу между обсуждением произведения и автора. Мы критикуем публикацию, а вы странным образом пытаетесь перейти на личности.

    Reply
  13. Isonic

    (13) вы пишете «кривизны и спорных моментов много». Так покажите где, иначе смысл вашей критики? Есть спорные моменты, давайте обсудим

    Здесь не кинопоиск (или подобное), здесь люди учатся и делятся опытом. Вы указали на ошибку, я запомнил, изучил, и больше ее не повторяю. Разве это плохо?

    Reply
  14. herfis

    (12)

    Я неимоверно рад, что у нас есть такие умные люди как Вы!

    Моя критика была недостаточно конструктивной? Если что-то непонятно — уточняйте, не стесняйтесь.

    Ваша критика моей критики уж точно неконструктивна.

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

    Reply

Leave a Comment

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