Универсальная выгрузка/загрузка XML (2.0.26) С АНАЛИЗОМ ИЗМЕНЕННЫХ ОБЪЕКТОВ ПРИ ЗАГРУЗКЕ




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

52 Comments

  1. agent100

    Спасибо очень нужно. Я так и делаю что сравниваю две базы(. Буду тестить!

    Reply
  2. WiseSnake

    (1) Пожалуйста.

    Найдете косяки, обязательно напишите!

    Reply
  3. bambula

    В стандартах не встречал подобного. А посему +

    Reply
  4. shavkat_95@mail.ru

    А как эта штука работает с Регистрами (сведений)? У меня сразу выплюнула ошибку (для набора записей регистра сведений говорит нет метода ЭтоНовый).

    А без анализа грузит нормально.

    Reply
  5. shavkat_95@mail.ru

    Наверное, нужно ставить проверку на тип объекта (только справочники и документы)

    Reply
  6. WiseSnake

    shavkat_95@mail.ru спасибо за замечание!

    Я просто пока не тестировал ее с загрузкой регистров. Времени особо нет. Но я понял в чем дело. Сейчас попробую поправить. Если быстро получится то выложу и отпишусь.

    Reply
  7. WiseSnake

    Попробовал исправить… Обновил файл… Попробуйте пожалуйста

    Reply
  8. shavkat_95@mail.ru

    Сейчас ошибка другого типа У РС нет поля Ссылка

    Reply
  9. shavkat_95@mail.ru

    +(9) в смысле : Поле объекта не обнаружено (Ссылка)

    Reply
  10. WiseSnake

    Ясно… Надо тестить… мож вечерком сяду…

    Reply
  11. WiseSnake

    Пока сделал так чтобы не выпадало ошибок. Справочники и документы показываются полностью. Регистры показывают что были загрузки (возможно и не менялись) но что конкретно изменилось пока не видно.

    Reply
  12. shavkat_95@mail.ru

    Теперь реагирует на изменения в РС, но не замечает изменений взагружаемом документе. Для пробы выгружаю из Торговли 7 РКО в Бухгалтерию 8. Сначала выгрузил с одной суммой, затем этот же РКО с дугой суммой — не реагирует анализ. Показывает только, что были измененения в РС.

    Reply
  13. kadik

    Я искал подобное.

    На днях скачаем и протестируем.

    Коментарии обязательно озвучим.

    Reply
  14. vmv

    Для ЗУПа 8.1 подойдет такая обработка? На последнем диске ИТС она не рабочая, слетает на последнем релизе типовой конфы

    Reply
  15. WiseSnake

    (15) Скорее всего слетает не из-за обработки, а из-за используемых правил. Надо подправить правила в соответствии с последним релизом, как мне кажеться.

    Reply
  16. k_serg

    Вещь нужная, протестирую сообщю

    Reply
  17. rand74

    пока только разбираюсь, спасибо за проделанный труд и открытый код

    Reply
  18. WiseSnake

    Пожалуйста! Буду рад если обработка пригодится.

    Reply
  19. Kontakt

    испробуем завтра)

    Reply
  20. OSlike

    Спасибо. Очень актуально.

    Reply
  21. quest

    Спасибо.

    Reply
  22. WiseSnake

    Серьезное обновление:

    Новое в версии 1.0 (beta):

    1. Усовершенствован анализ сделанных обработкой изменений, теперь в отчет выводятся:

    а) Документы

    б) Справочники

    в) Регистры сведений

    г) Регистры накопления

    д) Регистры рассчетов

    е) Константы

    2. Добавлены настройки анализа. Есть 3 варианта анализа:

    а) Принимать решение о принятии сделанных обработкой изменений

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

    в) только проанализировать действия обработки (удобно при тестировании обработки!!!)

    3. Появилась возможность отключить типовой контроль при записи объектов!!! Даже в обработчиках

    4. Добавлены алгоритмы. Процедуры используемые привыполнении обработки теперь можно выносить в отдельный алгоритм. Так же отработанные алгоритмы легко переносить в алгоритмы конфигурации «Конвертация данных 2.0»

    5. В анализ добавлена колонка «Уникальный идентификатор», что дает возможность отката!

    6. Исправлены ошибки.

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

    Reply
  23. WiseSnake

    Немного переборщил с текстом правильный текст читать в шапке

    Reply
  24. aspirator23

    Постоянно пользуюсь: приходится каждый день делать обмены. Очень удачная на мой взгляд обработка. Спасибо! Надеюсь автор будет поддерживать по мере своих возможностей обновленные релизы КД от 1с.

    Reply
  25. WiseSnake

    (26) Спасибо!

    В том то и прелесть данной обработки, что как раз обновления поддерживать очень просто. Ограничение только в том какой релиз КД я сам сейчас использую ))))). А это зависит от моей загруженности.

    Reply
  26. aspirator23

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

    Reply
  27. WiseSnake

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

    А по вопросу: теоретически возможно, можно до завершения транзакции обратно вернуть значения объектов. Думал об этом, но если это и будет реализовано то не скоро, это факт, есть более интересные вещи которые надо реализовать!

    Reply
  28. Збянтэжаны Саўка

    а что добавлено изменено по сравнению с предыдущей версией?

    Reply
  29. WiseSnake

    Изменения последней версии отражены в описании разработки и в посте 23.

    Reply
  30. Збянтэжаны Саўка

    (30) Хм я то думал что обновление от 01.07.2009 как в заголовке,

    а пост (23) от 27.04.2009.

    Reply
  31. Збянтэжаны Саўка

    Спрашиваю потому как скачать не могу.

    В любом случае спасибо за продукт и за ответ.

    Reply
  32. WiseSnake

    (31)Ааа, понятно. Я исправлял кое что в описании к разработке, по этому и стоит дата исправления.

    (32) Подождите денек и скачайте завтра ;).

    Reply
  33. 1vasia1

    Порой очень нужная весч. Быстрее XML врятли что-то придумается. Да и парсить его с руки.

    Reply
  34. onyx

    Спасибо. Очень актуально.

    Reply
  35. popova190

    спасибо,пригодилась обработка.

    Reply
  36. WiseSnake

    (36) Поставьте плюс, если вы рекомендуете данную публикацию к прочтению и использованию.

    Плюс добавляет публикацию в Мои рекомендации.

    Reply
  37. eli1984

    Пригодилась. Спасибо!

    Reply
  38. Еле

    очень пригодилась, спасибо

    Reply
  39. Aydrey

    Большое спасибо. простой и ничего лишнего. спасибо за сэкономленное время.

    Reply
  40. MMCNosferatu

    Алексей, у меня недостаточно баллов для скачивания обработки, однако её функционал весьма бы пригодился. Если не трудно, отпишитесь на saexton@gmail.com

    Reply
  41. materiy_boec

    Спасибо

    Вопрос?

    Бух 2.0

    мне необходимо перекинуть остатки и документы за 3 месяца в новую идентичную базу, эта обработка мне поможет?

    Reply
  42. WiseSnake

    (42) Поможет, если Вы умеете пользоваться «Конвертацией данных 2»

    Reply
  43. mariyanna

    Огромное спасибо!!! Очень полезная обработка оказалась!

    Reply
  44. CratosX

    (42) materiy_boec, (43) КД в этом случае не нужна, нужна обработка с диска ИТС, ВыгрузкаЗагрузкаДанныхXML

    Reply
  45. WiseSnake

    (45) 1. Вопрос был не в этом. А в том может ли помочь эта обработка. Ответ: может, правила обмена формируются за 5 мин. Как бонус мы видим что загружается.

    2. Как вы выгрузите остатки? Если программа велась 3 года, а надо выгрузить остатки, например, с начала года и документы сначала года?

    Reply
  46. SergeyGladyshev

    Очень полезная обработка, автору респект!

    Reply
  47. cybviolence

    Обновление обработки не планируется?

    Reply
  48. knocking

    (48) cybviolence, тоже интересует ответ на этот вопрос, а то 2.0.26 уже старовата.

    Reply
  49. knocking

    Важно! Для 8.2 нужно не забыть открыть обработку в конфигураторе, чтоб сконвертировать в формат 8.2.

    Reply
  50. WiseSnake

    (48) cybviolence, да есть обновление и другие разработки. Только времени нет этим заниматься…

    Reply
  51. dufrein

    УПП 8.2 не работает. 1С:Предприятие 8.2 (8.2.19.80)

    версия 1.3 (1.3.65.3)

    Reply
  52. aspirator23

    (51)

    Алексей, понимаю что обработки для инфостарта это скорее хобби, но возможна для этой обработки управляемая форма?

    Обработкой активно пользуюсь и вот настала «пора» управляемых форм, а на них она увы…

    Reply

Leave a Comment

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