Выгрузка и загрузка данных XML турбо v0.9




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

54 Comments

  1. coder1cv8

    Не очень понятны отличия от типовой обработки. Отбор и в оригинале есть. «Ускорено построение и обработка дерева метаданных»? хм… Или типовая не работает в 8.1?…

    Reply
  2. tormozit

    (1) По поводу отбора не уверен. У меня есть версия без отбора и есть версия с отбором, кажется от PowerBoy.

    >»Ускорено построение и обработка дерева метаданных»

    Да. Именно это и есть главная доработка. Плюс еще несколько исправлений мелких ошибок в типовой.

    >Или типовая не работает в 8.1?

    Работает.

    Reply
  3. coder1cv8

    (2) Просто по внешнему виду, твоя один в один типовая… 🙂 Вот: http://www.infostart.ru/file.php?0,file=424

    Reply
  4. tormozit

    (3) Не могу найти в БП 1.5 такой обработки. Как называется?

    Reply
  5. coder1cv8

    Да, хотелось бы переносить документы вместе с движениями (лучше опционально)… Как у меня http://infostart.ru/profile/12366/projects/1167/ только не под один документ, а универсальную, вот это было бы интересно…

    Reply
  6. coder1cv8

    (5) Она с КД 2.0.16.1 идет…

    Reply
  7. tormozit

    (4) Согласен. В этом плане твоя разработка лучше. Но я ставил целью лишь ускорить тормозную ИТСную обработку.

    Reply
  8. coder1cv8

    В любом случае, за старания «+» 🙂

    Reply
  9. tormozit

    (7) Спасибо. Теперь я убедился.

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

    По поводу расширения функционала я подумаю.

    Reply
  10. coder1cv8

    > По поводу расширения функционала я подумаю.

    Да ну его, не заморачивайся… )) На данный момент переносить те же операции между БП можно только моей обработкой, либо КД (с БОЛЬШИМ гимором), ну и через ПланыОбмена. И меня, лично, такая ситуация вполне устраивает 🙂

    Reply
  11. tormozit

    v0.85

    — исправлена ошибка, возникающая при выгрузке объектов по ссылкам

    Reply
  12. yalex9

    За отбор спасибо!

    Reply
  13. tormozit

    (12) За отбор спасибо разработчикам КД. А мне надо говорить спасибо за скорость анализа метаданных.

    Reply
  14. tormozit

    В КД 2.0.20.1 входит обновленная версия обработки «Выгрузка и загрузка данных XML (2.0.20)», которая оптимизирована по мотивам данной модификации обработки. Так что советую пользоваться новой родной версией обработки из КД, а плюс поставить мне можно за то, что я подтолкнул разработчиков КД наконец то оптимизировать данную обработку =)

    Reply
  15. tormozit

    0.9

    — исравлена ошибка при выгрузке последовательностей

    Reply
  16. sdkard

    я конечно не самый большой профессионал… но «Ошибка формата файла обмена»

    Reply
  17. tormozit

    (16) И что прикажете делать?

    Кури XML-обмен. 99% что у тебя отличается структура данных (в том числе может быть порядок реквизитов).

    Reply
  18. spaler

    Большое спасибо за обработку!!! 1С до сих пор на диске ИТС выкладывают ВыгрузкаЗагрузкаДанныхXML.epf(от 14.12.2007) , которая вываливается при выгрузке последовательности(может только у меня?). А если я последовательность не выгружаю, то валится в конце при записи. Эта обработка идеально выгрузила и загрузила мою «Управление торговлей», редакция 10.3 (10.3.1.17) с наработками!!!

    Reply
  19. tormozit

    (18) Пожалуйста. Но 1С не сидит на месте. И последняя версия от родного проивоздителя уже далеко ушла вперед по отношению к моей во всяком случае местами. Говорят даже ошибку с последовательностями там наконец исправили. Но на ИТС она еще кажется не выходила.

    Reply
  20. Sol

    spaler, обработка сейчас выходи в составе Конвертации данных

    Reply
  21. m0sk_mx

    Большое спасибо за обработку!!!

    Родная с диска ИТС международный (1кв 08) не выгружала из УПП, твоя выгрузила

    Reply
  22. slonond

    {ВнешняяОбработка.ВыгрузкаЗагрузкаДанныхXMLТурбо(103)}: Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XML: [file://C:/перенос.xml][22,24]

    ЗаписанноеЗначение = ПрочитатьXML(ЧтениеXML);

    по причине:

    Ошибка преобразования данных XML: [file://C:/перенос.xml][22,24]

    Reply
  23. slonond

    вот такая вот ошибка при загрузке. подскажите как исправить.

    Reply
  24. tormozit

    Смотри (17)

    Reply
  25. alex9999

    кто знает как исправить Ошибка формата файла обмена

    Reply
  26. paulpit

    накати Cf из основной базы

    Reply
  27. buy_sale

    Вывалилась при выгрузке здесь :

    {ВнешняяОбработка.ВыгрузкаЗагрузкаДанныхXMLТурбо(502)}: Ошибка при вызове метода контекста (Выполнить): {(1, 23)}: Таблица не найдена «РегистрСведений.»

    ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ <<?>>РегистрСведений. КАК ТаблицаОбъекта_АрхивДанныхРегламентированнойОтчетности

    РезультатЗапросаПоСоставу = Запрос.Выполнить();

    БП 23.2 Типовая

    Reply
  28. artbear

    (0) Сергей, опиши, плиз, свои изменения «значительно ускорена работа с метаданными (особенно при большом количестве объектов метаданных)»!

    что именно и как ускорено?

    хочу перенести эти изменения в последний вариант КД 2

    Reply
  29. tormozit

    (28) Ускорено за счет отключения индикатора (Состояние()) и еще чего то (уже не помню).

    Reply
  30. kootik

    спасибр все перенес

    Reply
  31. Ivan_82

    Удобная штука, пригодилась когда заводил новую базу.

    Reply
  32. lag001

    Данная обработка мне помогла при работе с двумя немного разными базами, когда понадобилось свести в одной базе документы по приходу и расходу материалов и, соответственно, саму номенклатуру. Имеет много общего с Универсальным обменом данными, но в этом случае не надо «заморачиваться» на лишние нюансы (особенно, когда в них не особо-то разбираешься 🙂 ).

    Reply
  33. Cbr

    Очень удобно. Регулярно ей пользуюсь у одного клиента. Никаких нареканий, все работает быстро, спасибо.

    Reply
  34. aksy_a

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

    Reply
  35. gorchiha

    Не заметила увеличения скорости.

    Reply
  36. arthur2003

    спасибо! очень помогла ваша обработка. Буду пользоваться ей. Ставлю вам с удовольствием 1 плюс+

    Reply
  37. zels

    Хорошая весчь, НО

    жалко, нет режима выгрузки регистров накопления «по ссылкам»,

    т.е. чтобы выгружались движения по полностью выгруженными документам.

    Reply
  38. zhleonid8

    просать выборочно документы можно?

    Reply
  39. ifarkhetdinov

    работает «+»

    Reply
  40. _Тома

    Возникли проблемы с обменом данными между конфигурациями. С Универсальным обменом данными что-то не выходит.

    Очень рассчитываю на Вашу обработку.

    Спасибо!

    Reply
  41. SV911

    Я правильно понимаю, что эта обработка сможет перенести из одной базы в другую… скажем справочник тмц?

    Reply
  42. SV911

    Спасибо за ответ. )))

    Оперативность еще та.

    Reply
  43. musatov1c.ru

    Есть срочная задача на перенос между одинаковыми базами. Попробую «быстрым» путем 🙂

    Reply
  44. Ionmuerto

    Искал перенос документов и справочников для 1с 8.2 БП 2.0.32. Данная выгрузка подойдет для моей кофигурации?

    Reply
  45. Nickon

    (22) Такая же проблема…была. Никак не мог понять в чем проблема и помог мне в этом (17). Оказалось обе БД разного релиза и как правило:

    99% что у тебя отличается структура данных (в том числе может быть порядок реквизитов).

    Так и получилось.

    Reply
  46. IrinaVP

    При загрузке возникли проблемы с операциями (бухгалтерский и налоговый учет).

    Табличная часть пустая. Я что-то не так делаю?

    Reply
  47. cpo-it

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

    Reply
  48. нОлька

    а под 8.2 она работает??? есть смысл скачивать???

    Reply
  49. Sanario

    1. Будет ли работать под платформой 8.2?

    2. Не вылетит ли с ошибкой «Недостаточно памяти!»?

    Reply
  50. itriot11

    8.3 УПП. Добавил в составное измерение еще один тип регистра сведений КонтактнаяИнформация, как следствие отвалились все записи. Из около дюжины обработок помогла только эта, те из архивной БД перенес в новую. Всего свыше 17 тыс записей, примерно за 5 мин. Правда тачка с 48 Гб и 16 ядрами)) Спасибо, результатом очень доволен!

    Reply
  51. Xershi

    В документе есть таблица с колонкой Конец

    Ошибка при получении значения атрибута контекста (Результат)

    РезультатЗапроса = ПостроительОтчета.Результат;

    по причине:

    {(153, 3)}: Синтаксическая ошибка «Конец»

    <<?>>Конец КАК Конец,

    Пришлось использовать КД2, что оказалось очень просто.

    Reply
  52. igor_35

    Спасибо.

    Reply
  53. tormozit

    В подсистеме «Инструменты разработчика» есть инструменты «Редактор изменений по плану обмена», «Выгрузка/Загрузка данных через файл», «Подбор и обработка объектов». Вместе они дают намного более широкие возможности, чем эта обработка.

    Reply
  54. Alever

    Спасибо большое!

    Reply

Leave a Comment

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