"Однопальцевое" чтение XML для 8.2




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

67 Comments

  1. cool.vlad4

    😀 Это где же такие симпатичные девушки работают?

    Reply
  2. YVolohov

    Фотка с девушкой заслуживает отдельного плюса 😀

    Reply
  3. Ish_2

    Что есть «Tits» на майке ? Напрашивается вольный перевод.

    Reply
  4. marsohod

    (3) «tits» — синица (англ.)

    Почему-то сразу вспоминается народная поговорка: «Лучше синица (tits) в руках, чем …» 😀

    Reply
  5. anig99

    (5) Это даже на эротику не тянет… Какие-то проблемы с этим?

    Reply
  6. anig99

    (5)…. в догонку… O-Planet тогда Хью Хафнер Инфостарта (:

    Reply
  7. yku

    срочно менять на бородатого мужика!

    Reply
  8. cool.vlad4

    (4) но в данном контексте перевод однозначный…и на этот раз гуглопереводне ошибается 😀

    ЗЫ Вот какое влияние оказывают женщины…сколько комментов и ни один про обработку…

    Reply
  9. Ish_2

    Я тебя, Саша, решительно осуждаю.

    Но … девушка хорошая. Программистка 1с ?

    Reply
  10. anig99

    Мечты…мечты… Я бы такую поучил 1с (: Скорее всего она web-программист…

    Reply
  11. Шёпот теней

    … ну, ВЫ только посмотрите какие у (нас) программистов комплексы относительно крАсивых дЭвушЭк …

    … ужжжж …

    … открываем главную стрАницу ИС … идЁм вниз … смотрим «Лидеры продаж» … и … О!… боже… что МЫ тАмА видим-с … ??? …

    и на первой и на второй очень даже и секси и порно … ))) …

    … ВОТЧТОхотелосьПОДметить …

    Reply
  12. Altair777

    (2)

    YVolohov пишет:

    Фотка с девушкой заслуживает отдельного плюса

    А Вы Инфостарт с Контактом не перепутали?

    Reply
  13. cool.vlad4
  14. Ish_2

    Tits — на главную страницу !

    Reply
  15. 8c1.ru

    не читал, но фотку одобряю

    Reply
  16. Трактор

    Сиськи обрамлены тэгами. Поэтому перевод однозначный и синицЫ тут ни при чём.

    Кстати, наличие тэгов делает картинку уместной.

    Reply
  17. Andzhej

    За оформление публикации «+» АДНАЗНАЧНА…Жириновский 😀

    Reply
  18. anig99

    Весна, однако. Пока только один комментарий как-то связан с обработкой…

    Reply
  19. iov

    обработка заслуживает пристального внимания но девушка таки победила и внимание досталось ей 😀

    Reply
  20. anig99

    Мы попали на первую страницу!

    Reply
  21. Ish_2

    (22) Этого мало.

    Твоя обработка вполне претендует (скажу по секрету) на выбор экспертов.

    Они тоже люди.

    Reply
  22. anig99

    (23) надо будет цену за обработку установить (:

    Reply
  23. wolfsoft

    Так и знал, что здесь обсуждают фото девушки! 😀

    Reply
  24. CheBurator

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

    Reply
  25. anig99

    (26) аватар отражает суть обработки — простое, общедоступное и наглядное чтение XML файлов.

    Собственно здесь аватар не менее связан с сутью обработки.

    З.Ы. Мысленно поверните девушку в профиль и сравните со скриншотом результатов обработки…

    Reply
  26. bidond

    Весь день пялюсь в обработку 🙂

    Reply
  27. agat2008

    (27) кривые совпадают! фотка уместна! 😀

    Reply
  28. Altair777

    Согласен с Че. Скрыл все флудовые комментарии. Они оказались действительно почти ВСЕ 😀

    Reply
  29. cool.vlad4

    (0) Классная обработка 😉

    ЗЫ на всякий случай девушку продублировал http://forum.infostart.ru/forum1/topic39294/

    Reply
  30. sumixam

    спасибо пригодилась

    Reply
  31. Angry

    Спасибо, хороший пример для освоения ЧтенияXML

    И для того что бы понять что 1С так ни фига и не сделали для удобной работы с XML.

    Reply
  32. anig99

    (34) а что Вы считаете удобной работой?

    Reply
  33. Zoomby

    (35) Одна большая кнопка, которая все делает сама. :))

    Reply
  34. Angry

    (35) В данном случае удобно — это когда для работы с XML как с деревом, не приходится вставлять в код подобные куски кода с преобразованием текстового файла в дерево.

    Ведь XML фактически хранит древовидную структуру.

    Reply
  35. anig99

    (37) у меня вроде нет прямой работы с xml как с текстовым файлом… только методы xml. Хочется, чтобы 1с работала с xml также со своим деревом? Проблема в том, что такой подход потребует загружать весь xml файл сразу в память, а не читать его последовательно…

    Reply
  36. Angry

    (38) Вот в том и проблема получается, сначала читаем последовательно, строим дерево, а потом уже обрабатываем данные.

    Я не говорил, что тут работа как с текстом, тут на уровень выше, работа с элементами (тэгами). Но XML по сути объектная модель данных, с такой моделью и хочется работать.

    Reply
  37. cool.vlad4

    (39) Вобще-то в 1С-ке используется как раз таки объектная модель — DOM — которая и выполняет всю грязную работу, ну и память жрет. Был бы sax парсер — вот тогда бы вы делали бы все ручками;-) Не, то, что вы имеете ввиду, это просто отсутствие синтаксического сахара, упрощающего написание кода, — который есть в других языках.

    Reply
  38. cool.vlad4

    Создаем док в C# XDocument doc = new XDocument(

    new XElement(«Document»,

    new XElement(«Rekvizit»,

    new XAttribute(«Date», 34124234),

    new XAttribute(«Name», «fgergwertge»),

    и т.д.

    IEnumerable<XElement> docs = from t in doc.Root.Elements(«Document»)

    и тд.

    Reply
  39. anig99

    (41) идеальных языков нет. к С есть претензии по массивам и работе с БД.

    Reply
  40. cool.vlad4

    (42) ну, это не совсем C — это C#, который вобщем-то разительно отличается от своего предка. Но у меня претензий не было;-) Чем старше становлюсь, тем больше убеждаюсь, что не в языке правда;-).

    Reply
  41. svs74

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

    Reply
  42. petrovaUL

    Для проверки файла ХМЛ пригодится

    Reply
  43. German

    комментарии не читает

    Reply
  44. arjuna

    Еслиб ни девка, прошел бы мимо. Рефлекс блин. Она особо ии чем не отличается, таких сотни на любом мусорном сайте, но на этом конкуренции нету. Главное чтоб в тенденцию не перешло.

    Reply
  45. Новенький_2209

    С изобретением велосипеда.

    Reply
  46. xzorkiix

    Я бы вдул. и «Инфостарт одобрил».

    Может кто поможет лень побороть? На входе xml-строка, на выходе — отформатированная строка xml.

    Reply
  47. kser87

    Очень полезная штука! Спасибо!

    Reply
  48. LanaSN

    Спасибо, удобная и полезная вещь!

    Reply
  49. Артано

    (47) arjuna, это КПВ

    Reply
  50. mehalyna

    Полезная штуковина. Спасибо автору!

    Reply
  51. dock

    работает! спасибо автору

    Reply
  52. Alfer

    теперь все через (ж) XML — а по сему полезная разработочка — тем более бесплатно — спасибо щедрый автор

    Reply
  53. anig99

    (55) спасибо. не забудьте плюс поставить

    Reply
  54. vevd

    Спасибо! большое! очень-очень в тему !

    Reply
  55. bursanb

    нормально работает, спасибо автору.

    Reply
  56. anig99

    (57)(58) а плюсики поставили?

    Reply
  57. bashirov.rs

    Обработка выдает ошибку

    {Форма.Форма.Форма(129)}: Ошибка при вызове метода контекста (Прочитать)

    Если ФайлXML.Прочитать() Тогда

    по причине:

    Ошибка разбора XML: — [36,16]

    Фатальная ошибка:

    Unescaped ‘<‘ not allowed in attributes values

    SystemId: file://D:/1.XML.

    Но после чего все выводит как надо. В чем может быть проблема? Не хотелось бы ковыряться в обработке.

    Reply
  58. anig99

    (60) bashirov.rs, судя по всему проблема в самом файле

    Reply
  59. bashirov.rs

    (61) Вы правы. Спасибо разобрался)

    Reply
  60. AllexSoft

    зачем это поделие когда есть AKXMLEdit ? если бы редактирование XML тогда согласен, а так не понял зачем оно..

    Reply
  61. anig99

    (63) AllexSoft, сама по себе обработка скорее всего не понадобится (кроме случаев, когда сидишь за компом пользователя, то быстрее запустить обработку из справочника, чем устанавливать сторонние программы). Во-вторых обработка содержить процедуры и функции, которые могут быть использованы в составе других обработок.

    Reply
  62. ice_nio

    Спасибо, помогла обработка!

    (Все-таки интересно почему при отладке, выскакивает ошибка, а при чтении в режиме предприятия НЕТ!? )

    Reply
  63. anig99

    (65) ice_nio, а что за ошибка?

    Reply
  64. ice_nio

    что — то там за границами массива, но именно при отладке, в предприятии работает как часы…

    Reply
  65. Serg O.

    хорошая «примочка»… спс

    одну мааленькую добавочку еще приделать надо бы (я себе уже сделал) — кнопку «Развернуть»

    при 1 нажатии — разворачивает всё… при 2-ом сворачивает

    текст для кнопки — тоже «бесплатно»

    Процедура РазвернутьНажатие(Элемент)

    ЭлементыФормы.Развернуть.КнопкаПоУмолчанию = не ЭлементыФормы.Развернуть.КнопкаПоУмолчанию;

    Свернуть = не ЭлементыФормы.Развернуть.КнопкаПоУмолчанию;

    для каждого стр1 из ДеревоXML.Строки цикл

    если Свернуть тогда

    ЭлементыФормы.ДеревоXML.Свернуть(стр1);

    Иначе // сразу всё дерево

    ЭлементыФормы.ДеревоXML.Развернуть(стр1, Истина);

    КонецЕсли;

    Если Свернуть тогда

    Для каждого стр2 из стр1.Строки цикл

    ЭлементыФормы.ДеревоXML.Свернуть(стр2);

    для каждого стр3 из стр2.Строки цикл

    ЭлементыФормы.ДеревоXML.Свернуть(стр3);

    для каждого стр4 из стр3.Строки цикл

    ЭлементыФормы.ДеревоXML.Свернуть(стр4);

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры

    Reply
  66. Serg O.

    ошибка иногда вываливается…страшная… (см. файл)

    если реальная ошибка в структуре XML есть — у меня недопустимые символы были…

    надо в «попытку» обернуть внутри Функция ЕстьЧтоЧитать()

    и предупреждать… ошибка в формате XML или что-то такое…

    Reply
  67. nico2

    Спасибо Вам большое, классная вещь. Давно искал нечто подобное универсальное

    Reply

Leave a Comment

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