Яндекс (Yandex) Диск. Обновляйте свои внешние обработки, обработки заполнения, печатные формы и отчеты.




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

35 Comments

  1. alex_4x

    А под 8.2 возможно запилить такое ? под жирненького клиента ?

    Reply
  2. Fox-trot

    (1) alex_4x, легко

    Reply
  3. Patriot1S

    (1) alex_4x, Работаю на этим. Но платформа 8.2 не поддерживает шифрование SSL, а поддержка включена с платформы 8.3.1, то для работы с SSL необходимо исользование платфомы не ниже 8.3.1. А по моим данным в корпоративном секторе мало кто еще перешел.

    Для JSON в 8.2 есть обработки.

    Reply
  4. echo77

    Совсем не понял на кой черт эта обработка?

    Приложение дли виндовс Яндекс.Диск не решает ли те же задачи?

    Reply
  5. eugeniezheludkov

    чет я совсем не вижу преимуществ такой разработки, читаю статью и чувствую, что автор не слышал про ГИТ и множество других систем контроля версий.

    GIT позволяет делать тоже самое плюс версионирование плюс командная разработка плюс история изменений видны сразу, версии можно откатывать и плюшка от гитхаба это issues считай трекер задач. Вот к примеру мой тестовый репо: https://github.com/znsoft/external1CProgs/tree/master/src

    , а закрытая разработка ведется на bitbucket.

    там уже реальные вещи делаем

    при помощи вот этой утилиты https://github.com/xDrivenDevelopment/precommit1c

    ПС: хотя любая программа имеет право на жизнь 🙂 извиняюсь если кого задел своим сообщением

    Reply
  6. Patriot1S

    (4) echo77, (5) eugeniezheludkov Предполагается что сама разработка, тестирование, контроль версий осуществляется на другом компьютере с локальной копией Яндекс.Диск.

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

    Reply
  7. kotlovD

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

    Reply
  8. Yashazz

    Меня всегда забавляла наивная уверенность некоторых специалистов в двух вещах — наличии устойчивого 4G в масштабах всея Земли, и сохранности-безопасности данных, хранимых где-то в сети. Эта уверенность обычно резко проходит после двух-трёх встреч с рукояткой жизненных граблей)

    Reply
  9. Patriot1S

    (7) kotlovD, Из статьи на Инфостарте http://infostart.ru/public/304373/

    «Чтобы получить access_token мы должны предварительно настроить веб-сервер и опубликовать на нем http-сервис ЯндексДеньги.»

    Reply
  10. Patriot1S

    (8) Yashazz,

    Ну по поводу безопасности в 1С я удержусь высказываться.

    А вот проверить работу обработки на 3G сети по телефона — проведу тест. И другим предлагаю предоставлять информацию.

    Reply
  11. Patriot1S

    (8) Yashazz, Не знаю, что Вы имеете ввиду,но по 3G телефону с задержкой все работает

    Reply
  12. gonzo111

    не понял какие проблемы с синхронизации через WebDav ,подождать в обработке на 5 сек дольше уже стало проблемой?

    заводим ящик расшариваем папку ему с доступом на чтение, сетевой диск подключаем и отключаем в обработке и без всяких страданий с токенами

    net use U: https:\webdav.yandex.ru /User:help@sss.net password /persistent:no

    Reply
  13. Patriot1S

    (12) gonzo111, Так первоначальная идея сделать аналог Yandex disk, переродилась в идею обновления в отдельной базе 1C своих внешних доработок.

    Reply
  14. Patriot1S

    Исправил ошибку если есть поддиректории в Yandex Disk. Их не берем в таблицу.

    Reply
  15. Patriot1S

    Заметил что одним запросом Yandex получает только 20 элементов. Это значение по умолчанию. Если у Вас больше файлов в директории это введет к ошибкам. Поставил 100. Думаю хватить. Или лучше сделать параметром?

    Reply
  16. Patriot1S

    Иногда для скачивания Yandex выдает 302 и перенаправляет на другой ресурс. Доделываем.

    Reply
  17. cool.vlad4

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

    и что там с безопасностью хранения обработок в яндекс диске? (я подозреваю насколько мне позволяют мои скромные знания, что в яндекс в плане безопасности куда лучше чем в 1с и тем не менее в конфах предусмотрен обмен по почте, которая кстати на том же яндекс может быть, и ничего)

    Reply
  18. shakmaev

    А что мешает делать вот так? Это ж WebDAV, 1С успешно справляется с этим.

    Путь1 = «https://login:pass@webdav.yandex.ru/path/to/file.txt»;
    Путь2 = «c:file.txt»;
    КопироватьФайл(Путь1, Путь2);
    УдалитьФайлы(Путь1);
    КопироватьФайл(Путь2, Путь1);

    Reply
  19. apostal86

    С самого начала не доверял облачным сервисам и не доверяю. Главным образом по тому, что пока есть Интернет, или они работают — все ОК. А как только нет сети или облако «полетело», так все, приехали. В этом плане нет ничего надежнее личной флешки или жесткого диска. Поэтому логичнее настроит обновление и проверку с них. К тому же об уровне безопасности всех этих облаков тоже пока не все известно. Крадут же фотки знаменитостей.

    Reply
  20. Brawler

    ЦЕННИКИ НЕ ГУМАННЫЕ!!!

    Нужно было бы мне лично, не качал бы вовсе!

    Reply
  21. surikateg

    (19) apostal86, облачные клиенты в папку на жестком диске файлы кладут. Отсутствие интернета повлияет только на оперативную синхронизацию.

    Reply
  22. hromovanton

    (19) apostal86, НЕ согласен. Если нет интернета, то все данные и так у вас на флешке. А вот если ваша флешка сгорит, то вот тут облачные данные спасут вас от «расстрела». Проверенно на личном опыте, правда на dropbox. День работы был спасен только благодаря облачному сервис !!!

    Reply
  23. Patriot1S

    Уменьшил стоимость скачивания.

    Reply
  24. pavel_pss

    Спасибо за статью, очень полезно.

    Reply
  25. pavel_pss

    Может подскажешь, я сделал все до твоей строки «И показывают пустое окошко с Вашим ключом (token). Он действителен в течение года.» и получил этот длинный токен, Но при вставке его в обработку пишет что не авторизован. Что я не сделал.

    Reply
  26. Patriot1S

    (25) pavel_pss, Сложно сказать удаленно, попробуй точно скопировать все знаки ключа и нажми кнопку обновить.

    Reply
  27. webester

    (0)Нет возможности хранить код, на гитхабе. Приходится страдать такой ерундой(вообще мысль хорошая, я уже думал в этом направлении, но как то не додумал).

    Reply
  28. AlX0id

    (27)

    См. 5-е сообщение.

    Reply
  29. Patriot1S

    (27) Еще раз по порядку — хранить разработку и версии большого пути можете где угодно. Github, SVN или все что Вам нравиться. Тем более что устанавливая Yandex диск на компьютере работает с ней как с локальным файлом.

    Но если Вам нужно постоянно обновлять свои обработки в рабочей базе, один раз настраиваем и обновляем одним нажатием все обработки.

    Теперь понятно?

    Reply
  30. webester

    (29)Просто синхронизация. Я понял. Я просто сейчас постоянно чешу репу на тему «где свежая версия обработки? у меня или у клиента? И если у клиента, то у какого?» Уже стали возникать всякие неприятные моменты. Для синхронизации есть целая куча решений и ваша проблема началась с того, что ваш любимый инструмент стал недоступен на работе. Повторюсь, сама по себе мысль отличная. Но чего то не хватает… пока не могу понять чего. Обработку скачаю на досуге обязательно, может придумаю чего нить. У нас с вами разные цели. Вы сидите на одном месте, у меня везде разные рабочие места, разное окружение, все и всегда разное. Гит отличная штука, и решил бы все вопросы, но не таскать же его на флешке… Или таскать?

    Reply
  31. azhilichev

    Зачем WinHttpRequest.5.1, если есть HTTPЗапрос и HTTPСоединение?

    Reply
  32. webester

    (31)Он же пишет:

    2. SSL. Так как платформа 8.2 не поддерживает шифрование SSL, а поддержка включена с платформы 8.3.1, то для работы с SSL необходимо исользование платфомы не ниже 8.3.1.

    Придется использовать ActiveX: ADODB.Stream, WinHttp.WinHttpRequest.5.1 и ограничиться только Windows решением. Решение получается тяжеловатым. Требует MDAC 2.5 и выше.

    Reply
  33. webester

    (0)Скачал обработку, получил токен, нажимаю «Синхронизировать», сервер отвечает 401, в чем может быть проблема? В отладчике видно, что в запросе передается указанный мной токен.

    Reply
  34. webester

    Нашел проблему, поле слишком короткое, токен не влазил целиком из-за того, что поле оформлено как пароль сразу не бросилось в глаза, что не хватает 4х символов.

    Reply
  35. webester
    Reply

Leave a Comment

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