XDTO-пакеты для чтения ответов от сервиса Dadata




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

21 Comments

  1. anig99

    (1) Удобство работы через ПрочитатьJSON и ПрочитатьXML примерно одинакова. Как минимум результат они возвращают одинаковый. Но ПрочитатьJSON появилась только на 8.3.6.1977. А с xdto можно работать и на 8.2

    Reply
  2. androgin

    (2) 8.3.6.1977??)))

    уже 8.3.11 в релизе.

    Практически никто не сидит в такой старой платформе

    Reply
  3. anig99

    (3) готовы говорить за 100% пользователей 1с? Я вот только на этих выходных перевел УПП с 8.2 на 8.3. И если не моё желании получить плюшки подсказок конфигуратора, то сидели бы ещё 2 года. «Работает — не трогай». И переходом не очень доволен — пару проблем ушло, чуть больше добавилось. Непонятных тормозов тонкого клиента прибавилось…

    Reply
  4. androgin

    (4) цитирую: «Практически никто».

    Далее: никто не мешает сидеть в новой платформе в режиме совместимости.

    И говоря о 8.3 -> 8.3 вы сильно лукавите. Тут вопрос не версии платформы, а в версии УПП. 8.3.6.1977 работает со старыми упп (которых тоже мало, и те сильно переделанные!)

    Reply
  5. anig99

    (5) Но тем не менее. XDTO пакетов нет. Сформировать их оказалось несложно и недолго. Мало ли они кому пригодятся. Я же не пишу, что JSON — плох. Просто если есть несколько равнозначных метода, то всегда найдутся за и против их применения в конкретные моменты.

    Как я уже написал, мог сидеть на 8.2 ещё года два. Кстати, УПП обновлено до последней версии всегда. Если бы 1с считали, что 8.2 уже ни у кого не стоит, то каким-либо способом убрала поддержку 8.2 в новых версия.

    Reply
  6. anig99

    (7) Изначально писалось для отображения на форме в поле, которое и так уже содержит информацию.

    Reply
  7. androgin

    (6) эти пакеты и не нужны! файл прекрасно возвращается в нужном и обрабатываем формате без всяких XDTO.

    И вы нагло врете, заявляя «УПП обновлено до последней версии всегда». В сопровождении к обновлению указана минимальная платформа. На текущий день — это не 8.2

    Reply
  8. d4rkmesa

    (9) Линк

    Управление производственным предприятием, редакция 1.3, версия 1.3.97.5

    Внимание! Текущий релиз конфигурации «Управление производственным предприятием»

    предназначен для использования с версией системы 1С:Предприятие 8 не ниже

    8.2.19.130

    Ну-ну, надо все же спокойней быть, отстаивая свою точку зрения, к чему эти сентенции? Каждому свое. На мой взгляд, XML(XDTO) удобнее JSON, по крайней мере, в 1С, однако это сугубо субъективно.

    Reply
  9. anig99

    (9) что-то Вас очень сильно лично задело (: Такое внимание и азарт по поводу пустяковой темы… Я думаю, что мы высказали всё, что хотели. Ваши аргументы не убедительны, тем более, что сейчас Вы скатываетесь в простую ругань и переход на личности.

    Reply
  10. androgin

    (2) 8.3.6..????

    Уже 8.3.11!

    Никто практически уже не сидит в такой старой платформе!

    (10) НЕ НИЖЕ!

    Это значит, что вам никто не мешает поставить 8.3.

    Reply
  11. anig99

    (12) еще раз. Мой основной аргумент заключается в том, что нет необходимости ставить платформу 8.3 ради одной команды для работы с JSON. Всё прекрасно работало и на 8.2. Я поддался уговорам и перешел на 8.3. Пока мои впечатления от боевого применения 8.3 на основной базе — 50 на 50. Есть новые возможности, то стабильность работы клиентских машин уменьшилась. Ещё можно назвать вариант, когда существует база, большинство пользователей которой работают удаленно через тонкие клиенты. Когда этих пользователей больше 100, то обновление платформы ради одной команды — необоснованно. Своё решение «велосипедом» не считаю, т.к. не «велосипед» — это повторение уже существующего. Я ничего не повторял. Я взял файлы, предоставляемые сервисом и привел их в вид, который можно использовать для 1с 8. XML и JSON — это разные пути к одному и тому же. В данном случае, существование XDTO пакетов делает их почти равнозначными.

    Reply
  12. anig99

    (12) И ещё. Я вполне допускаю, что Ваш опыт говорит Вам, что никто уже не сидит на 8.3. Слышал я о таких 1сниках, которые не имеют дело с таким «говном» как УТ 10, например. Только вот многолетний опыт множества системных администраторов, программистов, родил одну присказку: «Работает? Не трогай!». Не секрет, что основной двигатель прогресса в области учетных систем российского рынка (я не говорю, что это хорошо, это просто факт) — это работа государственного бюрократического аппарата, цель которого собрать как можно больше денег. Зачем нужно обновлять 1с Бухгалтерию и 1с Зарплату? В многих компаниях только с одной целью — сдавать отчетность, как это требует налоговая. Зачем нужно обновлять 1с УТ? ЕГАИС. А ведь существует же бессчетное множество специализированных отраслевых решений или решений для складского учета, которые просто не требуют обновления. Я знаю компании, где сидят не то что на 8.2, но и на 7.7. И переход на 8.3 для них просто экономически нецелесообразен. Почему 1с поддерживает кучу старых конфигураций в режиме совместимости? Из-за ностальгии? Я не агитирую за полный отказ от обновлений, но и выбор альтернативных решений программисту и конечному потребителю тоже нужно предоставлять.

    Reply
  13. d4rkmesa

    (12) У вас плохо с логикой, еще раз: » В сопровождении к обновлению указана минимальная платформа. На текущий день — это не 8.2″

    — Это утверждение ложно. Конфигурация вообще в режиме совместимости 8.2.13 — т. е. именно это и есть «нативная» версия платформы.

    Reply
  14. androgin

    (15) отмазка «работает — не трогай» — вот это, кажется, именно ваш подход к работе.

    При своевременном обновлении платформы и конфигурации (даже нетиповой!), отпадает необходимость изобретать очередные «велосипеды». Суть лишь в этом.

    Ваше упорное «работают на 8.2» — это прямой показатель, что вы не особо стремитесь обновляться. Либо просто не в состоянии. Вот вам и приходится под свои нужды изобретать то, что уже реализовано в последних платформах

    Reply
  15. androgin

    (16) Вот с логикой плохо у вас. Это именно МИНИМАЛЬНАЯ. А не единственная возможная, с которой будет все работать! Попробуйте переключать этот режим — удивитесь! Повторю, для одаренных — никто не мешает вам обновляться и переходить на улучшенные версии конфигураций.

    Reply
  16. d4rkmesa

    (19) Опять 25. Так зачем устраивать истерику и писать малограмотные комменты?

    «А не единственная возможная, с которой будет все работать! «

    А кто-то это опровергал?

    «Попробуйте переключать этот режим — удивитесь!»

    А зачем? Вы же в курсе, что чтобы УПП работала на 8.3, этого не нужно? Или нет?

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

    Это что-то новое, есть какие-то секретные релизы УПП, с режимом совместимости 8.3.10? Пишите еще, посмеюсь.

    Reply
  17. androgin

    (20) то есть ни одного сообщения по сути, кроме цитат))))

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

    Reply
  18. d4rkmesa

    (21) У вас не в порядке с головой, перечитайте все от начала до конца. Будете продолжать упорствовать, что УПП не работает на 8.2? Погуглите «патология спорщика», может задумаетесь.

    Reply
  19. androgin

    (22) непорядок в голове — у вас!

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

    Я не говорю, что упп не работает в 8.2. Я говорю, что она работает в 8.3

    Какой вы программист после этого

    Reply
  20. d4rkmesa

    (23) Вы не следите за тем что пишите?

    » В сопровождении к обновлению указана минимальная платформа. На текущий день — это не 8.2″

    С точностью наборот, минимальная платформа — 8.2..

    Reply
  21. z-alexey

    При попытке открыть CF в 8.3.10 получаем фиг.вам. О как 8.2 тут идет речь? :))

    Неклассифицированная ошибка документа.

    по причине:

    Для работы с конфигурацией необходима версия платформы не меньше, чем 8.3.11.

    Текущая версия 8.3.10.2699.

    Reply

Leave a Comment

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