Отчет о составе конфигурации (по количеству элементов справочников и количеству документов)




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

9 Comments

  1. bitools

    Нуууу, безделушка полезная, но зачем писать обычным перебором? Переделать бы на запросы — было бы слаще 🙂

    Reply
  2. black_doctor

    ну так в запросы пришлось каждый раз вставлять в запрос, а тут все тупо, и думать не надо)))

    кстати, с запросом было бы быстрей…

    ну в общем может быть на досуге сделаю)))

    Reply
  3. Borisych

    Для каждого Справочник из Метаданные.Справочники Цикл

    ИмяСправочника = Справочник.Имя;

    Запрос = Новый Запрос;

    Запрос.Текст = «ВЫБРАТЬ

    | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ «+ИмяСправочника+».Ссылка) КАК КоличествоЭлементов

    |ИЗ

    | Справочник.»+ИмяСправочника+» КАК «+ИмяСправочника;

    Выборка = Запрос.Выполнить().Выбрать();

    Выборка.Следующий();

    Сообщить(«Справочник.»+ИмяСправочника + «: «+ Выборка.КоличествоЭлементов + » элементов»);

    КонецЦикла;

    Для каждого Документ из Метаданные.Документы Цикл

    ИмяДокумента = Документ.Имя;

    Запрос = Новый Запрос;

    Запрос.Текст = «ВЫБРАТЬ

    | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ «+ИмяДокумента+».Ссылка) КАК КоличествоЭлементов

    |ИЗ

    | Документ.»+ИмяДокумента+» КАК «+ИмяДокумента;

    Выборка = Запрос.Выполнить().Выбрать();

    Выборка.Следующий();

    Сообщить(«Документ.»+ИмяДокумента + «: «+ Выборка.КоличествоЭлементов + » элементов»);

    КонецЦикла;

    Reply
  4. artmicro

    (3) Улыбнуло 🙂 Объясни пожалуйста, зачем в цикле каждый раз писать «Запрос = Новый Запрос;» и зачем в запросе слово «РАЗЛИЧНЫЕ»?

    Reply
  5. black_doctor

    так приятно, что столько умных решений и мнений, от всяких гениальных ребят пришло, очень интересно, что такие умные ребята, сами не брались за решение такой задачи, тем не менее рецензий куча)))

    а вообще, спасибо за коменты, тот вариант давно переработан)))

    но всё же лежит, чтобы задавали вопросы)))

    Reply
  6. black_doctor

    кстати, текст запроса можно было бы один раз присвоить…

    потом только значение встриваемой переменной изменять)))

    Reply
  7. Borisych

    (4) полгода прошло уж

    а. написал за минуту для примера.

    б. Запрос = Новый Запрос; и т.д. — потому что пользуюсь «Ctrl + Q» и шаблонами.

    в. Различные по-приколу, никто даже не отметил эту фишку — ты первый соображающий человек

    г. теперь знаю более простой способ получить необходимое

    Reply
  8. black_doctor

    так мне в личку до сих пор пишут :):):)

    как не странно :):):)

    Reply
  9. artmicro

    (5) Самому писать смысла нету, зачем тратить время на то, что уже милионы раз решалось 🙂 А переработанный вариант зря не выкладываете, могли бы отхватить пару плюсов 🙂

    (7) Извините, на дату конечно не посмотрел, просто надо было, вот и просматривал существующие решения.

    Reply

Leave a Comment

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