Подсистема восстановления и регистрации изменений данных (версия 1.0.4.3)




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

24 Comments

  1. manoff

    Господа кто тестировал эту замечательную вещь отпишитесь на сколько сильно от нее раздувается база и есть ли проблемы по быстродействию. А так просто обалденное решение, плюсую!

    Reply
  2. popov.leonid

    да, мне тоже понравилось.

    Reply
  3. Арсенал

    Никто еще не упел про тестить эту программу

    Reply
  4. tormozit

    Особенно интересно как это на скриншоте 3608 изменения набора записей представлены.

    Reply
  5. cs25

    Однозначно ПЛЮС !!!

    Reply
  6. mdzen

    Понравилось. Хочу попробовать на 1С бухгалтерии. Интересной будет диаграма нагрузки пользователей, а то бухи жалуются, что работы невпроворот — вот и посмотрим, а заодно и кто и что меняет «ручонками шаловливыми»……. Писал давным давно подобное под 77 с использованием 1СРР — использовал Перехватчик… но там только факт изменения фиксировался …. Однозначно полезная весчь!!!!!!!!!!!!!!

    Reply
  7. Caspers

    Замечательная Вещь !!!

    Reply
  8. tormozit

    Убери у всех измерений ОсновнойОтбор — быстрее станет.

    Reply
  9. derek2

    А под 7.7 чето такого нету??

    Reply
  10. AKV77

    {ОбщийМодуль.ОбщегоНазначения(1749,43)}: Процедура или функция с указанным именем не определена (глЗначениеПеременной)

    ДублироватьСообщенияВЖурналРегистрации = <<?>>глЗначениеПеременной(«ДублироватьСообщенияВЖурналРегистрации»);;

    Конфигурация УПП. В чем может быть причина ошибки при открытии Журнала истории

    объектов ?

    Reply
  11. AKV77

    В УПП 1.2.12.21 не работает при открытии любого справочника, документа выдается список ошибок, пример ошибки указана в посте 10

    Reply
  12. bondarenko

    Вещь замечательная! Понравилось, буду тестить… Спасибо!

    Reply
  13. SedovSU@mail.ru

    (10,11) AKV77 — ошибка в том что ты не правильно сравнил и объединил конфигруации. Открой в конфигурации УПП модуль сеанса или модуль приложения — они пусты, потому что ты заполнил их модулями из моей конфигурацией. При объединении сними все галочки и поставь на общем модуле, подписки на событии, картинках, перечеслении, регистре, и константе — и нет больше ошибок.

    Reply
  14. gudun_ku

    Код не включен. Хочется версию, чтобы выгружать события в SQL а не в регистр сведений. Я понимаю, есть тут и платная подобная вещь с SQL, но лучше бы взялся и доделал бы, тем более у данной есть некоторые преимущества в простоте

    Reply
  15. tsd

    (13) на первый взгляд смотрится крайне завлекательно, однако 🙂

    неплохо бы добавить подсистему, объединяющую твои объекты. Ибо не есть гуд, когда после объединения объекты приходиться по наименованиям выискивать.

    неплохо бы добавить интерфейс, пусть даже состоящий из одной кнопки на панели.

    В таблице настроек по правой кнопке вроде бы доступны функции редактирования, но фактически я могу только удалить строку. Причем, если я случайно удалю какую-либо строку, то придется полностью перенастраивать всю таблицу.

    большое ррр за отсутствие хоть какого-то описания описания или справки. Ну почему я должен напрягать фантазию и догадываться, нафига нужна кнопка «Свернуть».

    Кстати, ежели на пустом журнале регистрации нажать кнопку свернуть выдаст ошибку.

    Бухгалтерия предприятия, провожу документ реализация, заползаю в движения, вручную корректирую проводки (удаляю одну). Если вызываю историю объекта Регистр бухгалтерииНаборЗаписей выводится «изменений не было. Объект был просто записан», хотя я удалил проводку. Если сделать откат на объекте Реализация, то галка ручная корректировка снимается, но проводка не восстанавливается.

    Предложение. Может стоит разделить таблицу объектов на 2. В основной держать основные объекты (справочники, документы и т.п), а во второй всяческие связанные регистры? Мне кажется так будет немного удобнее.

    вот, как то так 🙂

    Reply
  16. tsd

    еще немного косяков, но уже серьезных. (Смотрел все на БП)

    проводим документ реализация, в журнале истории объектов фиксируются изменения. Все хорошо.

    Баг 1

    Помечаем этот же документ на удаление. В журнале изменений ничего не фиксируется.

    Баг 2, скорее даже непродуманная фича, которая легко может привести к нарушению учета.

    Встаем в журнале регистрации на строку движений регистра Хозрасчетный нашей помеченной на удаление реализации (причем строку эту мы только по нюху определить можем, ибо в колонке объект написано только регистрНакопленияНаборЗаписей, а для какого документа ХЗ) и жмем кнопку откатить объект. В результате получаем записи по регистру бухгалтерии у помеченного на удаление объекта. Что есть прямое нарушение логики работы программы.

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

    Как только в журнале регистрации по документу или справочнику появится хоть одна запись этот элемент НЕВОЗМОЖНО удалить ибо на него присутсвуют ссылки в журнале изменений. Через год работы мусора в базе будет немеряно.

    Баг 4

    по текущей реализации движения каждого документа фиксируются отдельной строкой.

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

    При контроле в окне удаления помеченных объектов выдается ссылка на наш Журнал изменений. Ползу в журнал, нахожу строку документа и удаляю ее. ВСЕ строки движений по этому документу остаются в журнале!

    Ура, документ удален. Заползаю в журнал изменений, тыкаю в строку с движениями и восстанавливаю ее. В результате получаю движения по соответствующему регистру с регистратором «Объект не найден».

    Серьезно тестировать лениво, но думаю ход мыслей для поиска косяков понятен.

    Вообще, штука конечно полезная, только нужна соответствующая реализация. Чтобы использование данной разработки не создавало потенциально опасные дыры в работе учетной системы.

    Reply
  17. ALEXANDR_ERM

    Тестил, штука очень хорошая, вот правда один момент обнаружился. Любой объект , до момента первой записи в регистр, первые изменения не фиксирует, пишет что изменений не было объект был только записан. Ну я конечно нашел вариант перезаписать все объекты в базе, но думаю это не выход так что прошу обратить на это внимание…

    Reply
  18. dimokl

    А есть ли ограничения по правам пользователей, чтобы журнал работал?

    В УПП после установки этого журнала не у всех пользователей запускается программа — пишет, что ошибка прав доступа.

    Reply
  19. Abadonna

    Заголовок поправь. » восстаВноления» написано

    Reply
  20. Поручик

    Автор, поправь заголовок. Подумай о тех, кто будет искать такую фичу.

    Reply
  21. itmind

    Если поставить галочку «Использовать регистрацию выполнения записи объекта», то периодически у всех выскакивает ошибка «В данной транзакции уже были ошибки».

    Можешь дать исходный код?

    Reply
  22. Pupqin

    Уважаемые пользователи, я начинающий в 1С подскажите как открыть данную подсистему?

    Reply
  23. Cyberboy

    Что делать если я ее уже внедрил, а теперь хочу убрать из конфигурации?

    Reply
  24. wwizard

    У меня 8,2

    При сравнении и объединении конфигураций, база перестала работать….

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

    Reply

Leave a Comment

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