Нет пророка в отечестве своем. Или любите СП — источник знаний




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

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

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

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

28 Comments

  1. StaticUnsafe

    Спасибо

    Reply
  2. so-quest

    Да не за что. Приходите еще 🙂

    Reply
  3. SirYozha

    Не хочу качать обработки, вот если бы в статью код вынесли…

    Reply
  4. so-quest

    все вынесено до нас. в синтаксис-помощник

    Reply
  5. headMade

    хотел задать пару вопросов :

    1. (не по существу). Зачем в обработках прописывается «//@version: Версия 3 (4 февраля 2014 г. 18:50:38)». Это как-то автоматически обрабатывается или это только для своего визуального контроля ????

    2. Как в обработке 1 была сделан макет «xsd_man»?

    3 Если приходят файлы с заголовком

    <?xml version=»1.0″ encoding=»windows-1251″?>

    <data xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»>

    то как принято вставлять строку xmlns=»http://пример1″ ???

    или как вообще обрабатывать такие файлы?

    Reply
  6. so-quest

    (1) Это скрипт к снегопату. Проставляет версию и дату последнего изменения. Автоматически не обрабатывается (зачем такое было нужно? обработка — это не только код, но и форма, но и макеты), Кстати, пользуясь случаем — Александру огромное человеческое спасибо за то что раздает бесплатные версии и отвечает на вопросы

    (2) Создан пакет в 1С потом экспортирован в файл. Затем содержимое файла сохранено в макете

    (3) В общем случае — такого быть не должно. Но жизнь несовершенна, поэтому сперва читаем хмл, затем вставляем строку, затем получившуюся строку снова скармливаем в ЧтениеХМЛ Такой изврат мне был нужен всего 1 раз за все время работы, но думаю что существуют и другие способы (но там надо уже DOM крутить, что лениво)

    Reply
  7. Yashazz

    Простите, автор, в статье описано именно создание xsd-схемы «на лету», или всего лишь создание фабрики и/или объекта XDTO с её помощью?

    Reply
  8. so-quest

    а вы точно всю статью прочли? какое из слов у вас вызвало непонимание?

    Reply
  9. Yashazz

    (8) Я никакой статьи не вижу. Я вижу 2 абзаца описания и обработку, которую предлагается скачать. Статья-то где?

    Reply
  10. so-quest

    Исходя из «в статье описано именно создание xsd-схемы «на лету», или всего лишь создание фабрики и/или объекта XDTO с её помощью? » я предположил что вы прочли статью. Какую — не знаю. Конкретно здесь — немного расширенный пример к синтаксис помощнику. Он находиться в обработке приложенной к заметке.

    Reply
  11. Yashazz

    (10) Автор, цитата из вашей публикации: «Построение XSD схемы на лету или любите СП источник знаний». Так? Так. Ниже сказано про создание фабрики. Поэтому подозреваю, что какая-то часть текста лишняя, или я чего-то сильно не понял. Кроме того, в СП нет и не было примеров построения xsd «на лету», по крайней мере в 8.2

    Reply
  12. so-quest

    И часть лишняя и, и примеров не было и фигня весь этот хмл, СП и 1С 🙂

    Дружище, по твоим комментам убедился — ты нереально крут и все эти пересказы СП — не для тебя. Так что если тебя что-то напрягает — ты скажи — исправлю все, переделаю, перепишу, посыплю голову пеплом и удалю обработку нафиг, а публикации новые обязательно буду согласовывать с тобой. Не надо держать в себе все — вредно для нервов 🙂

    И да — не моя вина, что 1С придумала свои обозначения для уже существующих терминов. Вот и путаюсь иногда.

    Reply
  13. KRJ

    Вот эта тема! Так можно назвать каждую вторую публикацию…

    Reply
  14. Yashazz

    (12) Автор, прошу не паясничать и не переходить на личности. Я задал вполне чёткий предметный вопрос, интересующий, по идее, каждого читателя — «о чём публикация»? Повторяю свой вопрос и прошу внятно ответить. Публикация про xsd или про фабрики XDTO?

    Reply
  15. so-quest

    Если бы вам был нужен ответ — вы бы уже посмотрели код. Раз этого не произошло — значит ответ вам не нужен. Но что бы не быть невежливым и не оставлять вопросов без ответов — «Четкий и предметный ответ — все в обработке — открываем и смотрим.»

    Reply
  16. Yashazz

    (16) Т.е., чтобы получить ответ, надо потратить sm и скачать публикацию? Т.е. вы предлагаете кота в мешке?

    Reply
  17. pumbaE

    (17) Yashazz,

    Вариант №1

    Используется СоздатьФабрикуXDTO. В архиве файл Вариант-1.epf

    Вариант 2

    Используется конструктор для ФабрикаXDTO В архиве файл Вариант-2.epf

    Есть еще вариант №3 – основан на построении схемы – но мне этот вариант никогда был не интересен, поэтому оставим его добровольцам.

    имхо ответ дан в описании.

    Reply
  18. so-quest

    Если для вас это единственный путь — то да. Если нет — то нет.

    HINT : иногда адрес зеркала указывается в личной карточке 🙂

    Reply
  19. Yashazz

    (18) Тогда фраза «Построение XSD схемы на лету или любите СП источник знаний» совершенно не в тему.

    (19) Мы сейчас конкретно на ИС и говорим о действиях средствами ИС. И стартмани за скачанное вслепую тоже окажутся на ИС. Считаю, за кота в мешке, т.е. за уход от ответа (то ли по незнанию, то ли по нежеланию ответить), можно лепить минус.

    Reply
  20. so-quest

    Да ты и так его поставил 🙂 Успокойся уже.

    Reply
  21. soap

    Прошу прощения! Это обработка или статья? Если статья то текст в студию !!!

    Reply
  22. so-quest

    Сверху написано —

    Тип: Внешний отчет (ert,erf)

    Вывод — это ни обработка ни статья, а отчет. причем внешний

    Виноват перед всеми пользователями ИС — неверно выбрал классификатор. Согласен понести справедливое, но заслуженное наказание. За то что всех ввел в заблуждение — приношу извинения.

    К сожалению желания исправлять конкретно эту публикацию — не имею. Поэтому — желающие 1. пофлудить,

    2. высказать свое фи и пхе,

    3. похвастаться «ежедневным тяжёлым освоением каждой детали личным опытом, пробами и ошибками, вдобавок вообще без какой-либо методической литературы от 1С, только общими сведениями про xml как таковой в сети»

    4. рассказать о своих професиональных 22 см —

    ВЕЛКАМ

    Reply
  23. Yashazz

    Таки скачал. Теперь стало ясно, почему мы друг друга не поняли. Да, формально в опубликованном epf действительно есть создание фабрики по схемам и работа со схемами, но совсем простая — схемы элементарно читаются из текстового макета. Понятно, что и макет можно «нагнать» текстовыми операциями, но меня интересовало настоящее динамическое создание xsd, работа с объектом СхемаXML. А фиксированную схему сунуть в макет — да, несложно, и воспользоваться СП для этого — тоже, и в ряде задач этого более чем достаточно.

    Reply
  24. so-quest

    Есть еще вариант №3 – основан на построении схемы – но мне этот вариант никогда был не интересен, поэтому оставим его добровольцам.

    а еще в файле Вариант-2.epf та же схема строиться программно

    Reply
  25. Serginio

    Нечто подобное делал

    http://www.forum.mista.ru/topic.php?id=669645

    Если нет предубеждения то для создания схемы можно воспользоваться более мощным инструментом

    https://msdn.microsoft.com/ru-ru/library/bs8hh90b(v=vs.110).aspx

    Reply
  26. so-quest

    Гляну. Спасибо.

    Reply
  27. Serginio

    Если знаешь Net, то проще сгенерить описание классов, перечислений и динамически скомпилировать

    http://infostart.ru/public/417830/

    Затем используя XsdDataContractExporter создать схему.

    https://msdn.microsoft.com/ru-ru/library/system.runtime.serialization.xsddatacontractexporter(v=vs.110).aspx

    Reply
  28. Serginio

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

    При этом если выгружать все в обработку используя схему проще отлаживать алгоритмы.

    Reply

Leave a Comment

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