Регистрация изменений в документах




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

21 Comments

  1. websamson

    Возможно. Увидел это, понравилась идея, захотелось реализовать что-то похожее.

    В описании указано, что это достаточно простая, без особых фич разработка.

    Reply
  2. hame1e00n

    А отчет по изменениям можно потом составить?

    Reply
  3. hame1e00n

    И не сильно ли пухнет база?

    Reply
  4. websamson

    (3) конечно дописать можно 🙂

    (4) даже не могу вам сказать. Сами только к конфе прикрутили

    Reply
  5. hame1e00n

    (5) а вообще, спасибо, нужная вещь! 🙂

    Reply
  6. websamson

    (6) пользуйтесь 🙂

    Reply
  7. hame1e00n

    А получается это только для изменений информации, а изменения структуры БД не получится отследить?

    Reply
  8. hame1e00n

    websamson, а вот не знаешь, как выбрать объект конфигурации? ну чтобы вот как выбираешь документ, также, только например выбрать сам объект? через метаданные?

    Reply
  9. b_ravil_t

    Для упрощения внедрения можно применить «Подписки на события» и не надо перелапачивать все доки.

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

    Наверно и к регистрам привязатся можно — это в планах развития обработки 😉

    Reply
  10. PowerBoy

    Понравился поиск изменений реквизитов в таб.частях. Можно наверно для ускорения по большим таб. частям добавить индексирование таблиц значений или сделать запросами.

    Reply
  11. rasswet

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

    Reply
  12. JIGIT

    +

    предлагаю вместо ссылки(рекизит «Объект» в регистре) использовать УникальныйИдентификатор — по коду дописать больше прийдется, но когда выростет база — не будет тормозов….ИМХО

    Reply
  13. JIGIT

    (8) Хранилищем пользуйтесь 😉

    Reply
  14. JIGIT

    [ 8 ] Хранилищем пользуйтесь 😉

    з.ы. смайлы подставляются )))

    Reply
  15. JIGIT

    а если менять Дату или Номер документа — жаль не подхватывает ((

    Reply
  16. анфиска

    Для какой конфигурации???????????????????????

    Reply
  17. JIGIT

    [ 17 ] думаю для любой подойдет 8)

    Reply
  18. websamson

    (17) для любой 😉

    Reply
  19. as7bs

    Как решить вопрос с удалением помеченных объектов на который имеются ссылки в регистре независимом сведений «РегистрацияИзмененийВБазе» в который пишутся сведения об изменениях?

    Мне приходится сначала обработкой «Подбор и обработка объектов» удалять записи из данного регистра по условию Объект.ПометкаУдаления=Истина и только потом «Удаление помеченных объектов».

    Т.е. обычные пользователи без помощи администратора не могут удалить помеченные на удаление объекты. Как вариант написать небольшую обработку для пользователя, которую запускать перед «Удалением помеченных объектов».

    Reply
  20. nofx

    (20) as7bs, А если просто проставить свойство «Ведущее» у измерения «Объект» в регистре, который хранит историю?

    (СП говорит что при удалении ссылки, удалится и запись регистра)…

    Reply
  21. nofx

    В разработке есть ошибка. При регистрации изменении в ТЧ числового типа данных (только числового) таблица «БЫЛО» получается пустая.

    Reply

Leave a Comment

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