Просмотр временных таблиц запроса в отладчике без изменения кода




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

20 Comments

  1. taiimer

    Спасибо, очень полезная тема, часто приходилось изворачиваться и придумывать велосипед!

    Reply
  2. Pixar0000

    Вообще-то для этого есть Консоль запросов в которой отлаживаешь запрос как хочешь, а потом переносиш в код

    Reply
  3. dandykry

    Запрос.МенеджерВременныхТаблиц.Таблицы[Индекс].ПолучитьДанные().Выгрузить()

    Где индекс это порядковый номер временной таблицы

    Reply
  4. CyberCerber

    А еще можно, нажав Shift+F9, обратиться к переменной Запрос, и вызвать ее метод «ВыполнитьПакетСПромежуточнымиДанными()». Там будет массив результатов со всеми временными таблицами.

    Reply
  5. vladismi

    (3) Как вариант:

    Запрос.МенеджерВременныхТаблиц.Таблицы.Найти(<Имя временной таблицы>).ПолучитьДанные().Выгрузить()

    Индекс временной таблицы может меняться, а вот имя никогда…

    Reply
  6. balanton

    (3)

    Таблицы[Индекс]

    можно и не Индекс, а имя таблицы

    Reply
  7. unichkin

    Давным давно еще был прием, когда в общем модуле есть отладочная функция, типа такой:

    Функция ПросмотрВТ(Запрос, ИмяВременнойТаблицы) Экспорт
    
    ЗапросТМП = Новый Запрос(«ВЫБРАТЬ * ИЗ » + ИмяВременнойТаблицы);
    ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
    Возврат ЗапросТМП.Выполнить().Выгрузить();
    
    КонецФункции
    

    Показать

    Но на самом деле и это — фигня.. После того как я узнал про отложенную отладку в ИР, все это ни к чему.

    Reply
  8. frkbvfnjh

    (4) Это самый лаконичный и правильный вариант на мой взгляд для новых версий платформы, но вариант автора как я понял будет работать даже в 8.1.

    Reply
  9. HAMMER_59

    Комментарии лучше чем сама статья.

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

    Непонятно как поступает метод ВыполнитьПакетСПромежуточнымиДанными() предложенный (4), возможно, выгружает все таблицы, тогда такой вариант это то что нужно.

    Reply
  10. dandykry

    (5) Как угодно, все зависит от ситуации. Мне проще посмотреть Запрос.МенеджерВременныхТаблиц.Таблицы и посмотреть индекс. Это удобство.

    ВыполнитьПакетСПромежуточнымиДанными() — когда хочется посмотреть все таблицы и проанализировать. Все находится перед глазами. Особенно хорошо, когда временных таблиц не много, иначе все равно приходится копаться в них. В таком случае в табло отладки интересующие таблицы удобнее вставить.

    Запрос.МенеджерВременныхТаблиц.Таблицы.Найти(<Имя временной таблицы>).ПолучитьДанные().Выгрузить() — когда видишь текст запроса, видишь имя таблицы, а индекс понять сложно.

    Своя функция в общем модуле или метод автора — Если 8.2 и ранние 8.3, то метод автора или своя процедура в общем модуле. С появлением расширений в 8.3.6 можно обойтись экспортной функцией в обработке.

    Хорошо знать инструменты и использовать их в нужный момент.

    P.S. Лично я не догадывался, что можно хитрить с текстом запроса. Буду использовать в других случаях.

    Reply
  11. DmitrySinichnikov

    (8) Ну давайте еще под 7х будем варианты всякие писать)))

    Reply
  12. Dzenn

    Спасибо, пригодится 🙂

    Reply
  13. the1

    В 8.3 можно расширение с общим модулем прикрутить для просмотра ВТ, ну и вызывать по SHIFT+F9 расчет

    Отладка.ПолучитьВТ(Запрос)
    Reply
  14. Craig

    (2) Ну- Ну, попробуй в ЗУПе консоль запроса использовать, когда тысяча и одна временная таблица формируют промежуточный итог, а тебе нужно посмотреть, только этот маленький промежуточный итог.

    Reply
  15. dmitryburykin

    (3) Спокойно отрабатывает и по имени таблицы, не только по индексу

    Запрос.МенеджерВременныхТаблиц.Таблицы[«НалоговаяБазаПоНалогуНаИмущество»].ПолучитьДанные().Выгрузить()

    Reply
  16. dandykry

    (20) Пол года почти уже прошло))

    Как угодно, все зависит от ситуации. Мне проще посмотреть Запрос.МенеджерВременныхТаблиц.Таблицы и посмотреть индекс. Это удобство.
    Хорошо знать инструменты и использовать их в нужный момент.
    Reply
  17. dmitryburykin

    (21) для меня была тема актуальна, сегодня.

    может еще кому-то пригодится.

    Reply
  18. cdromscsi

    Спасибо, пригодилось

    Reply
  19. svetanik

    Спасибо автору за тему и вариант. Также пригодились комментарии. В УПП 1.3 на 8.2, боюсь, отложенная отладка не существует.

    Reply
  20. sokol_5441

    Запрос.МенеджерВременныхТаблиц.Таблицы[2].ПолучитьДанные().Выгрузить()

    Reply

Leave a Comment

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