Поиск битых ссылок с отбором типа




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

17 Comments

  1. kondrashka

    Ошибка при вызове метода контекста (Выполнить): {(7, 30)}: Несовместимые типы «ССЫЛКА»

    В УПП8.1.14.72 конфа 1.2 (1.2.24.2) ошибки.

    ГДЕ Об.РегламентнаяОперация <<?>>ССЫЛКА БизнесПроцесс.РасчетНДС И ВЫРАЗИТЬ(Об.РегламентнаяОперация КАК БизнесПроцесс.РасчетНДС).Ссылка есть null И Об.РегламентнаяОперация <> Значение(БизнесПроцесс.РасчетНДС.ПустаяСсылка) ИнформацияОбОшибке

    Ошибка при вызове метода контекста (Выполнить): {(7, 30)}: Несовместимые типы «ССЫЛКА»

    ГДЕ Об.РегламентнаяОперация <<?>>ССЫЛКА БизнесПроцесс.ЗакрытиеМесяцаУСНДоходыМинусРасходы И ВЫРАЗИТЬ(Об.РегламентнаяОперация КАК БизнесПроцесс.ЗакрытиеМесяцаУСНДоходыМинусРасходы).Ссылка есть null И Об.РегламентнаяОперация <> Значение(БизнесПроцесс.ЗакрытиеМесяцаУСНДоходыМинусРасходы.ПустаяСсылка) ИнформацияОбОшибке

    Reply
  2. Danil.Potapov

    РегламентнаяОперация — какой у нее тип?

    Reply
  3. rasswet

    млин) вчера было надо..

    Reply
  4. rasswet

    а механизм по удалению восстановлению, не будешь прикручивать?

    у меня в регистре сведений была ссылка на строку, в которой не было регистратора (а должен) это как пофиксить?

    кстати запустил в типовой БП-вылетело

    Ошибка при вызове метода контекста (Выполнить): {(7, 9)}: Поле не найдено «Об.Валюта»

    ГДЕ Об.<<?>>Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка) ИнформацияОбОшибке

    Reply
  5. Danil.Potapov

    Хорошо, посмотрю

    Reply
  6. hame1e00n

    Очень нужная вещь, спасибо!) 😉

    Reply
  7. NadinB

    нужная обработка. Спасибо

    Reply
  8. Danil.Potapov

    (4) исправил

    Reply
  9. rasswet

    (8) cпасибо!

    Reply
  10. drkhaired

    А если это не регистратор, а скажем Партия, то механизм работать не будет?

    Reply
  11. sommid

    спасибо, то что надо.

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

    Reply
  12. axae

    Спасибо, действительно здорово!

    P.S. Первым делом добавил открытие объекта источника для просмотра по двойному клику на нем 🙂

    Reply
  13. axae

    Вторым делом добавляю возможность восстановления удаленных объектов прямо из этой обработки, с целью затем использовать поиск и замена значений… 🙂

    Reply
  14. a_a

    Обработка очень помогла при переходе на БП 2.0 уж очень много битых ссылок скопилось

    Reply
  15. tulaka

    давно ждал эту обработку

    Reply
  16. mikhailovaew

    Спасибо! очень удобно — можно быстро посмотреть, какие битые элементы справочника засветились в документах. Маленькое замечание: недоступна кнопка открытия объекта, содержащего битую ссылку, из-за флажка «Только просмотр» в поле табличного документа.

    Reply
  17. mikhailovaew

    (12)

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

    или можно просто снять флажок «Только просмотр» с поля табличного документа, начнет работать кнопка открытия объекта

    Reply

Leave a Comment

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