Работа с Яндекс.Диском (обычная и управляемая форма)




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

55 Comments

  1. json

    Правильно ли я понимаю, что данная обработка умеет работать с файлами в облаке исключительно средствами http без необходимости установки приложения Яндекс.Диск?

    Reply ↓
  2. Xershi

    (1) yurii_host, все верно! Для работы нужен только логин, пароль и доступ в интернет!

    Reply ↓
  3. apatyukov

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

    Reply ↓
  4. Xershi

    (3) apatyukov, а вы тестировали этот метод? А чем отличается загрузка 2гб+ не в курсе?

    Reply ↓
  5. apatyukov

    (4) yandex принудительно прерывает коннект.

    https://yandex.ru/support/disk/uploading.html

    Reply ↓
  6. Xershi

    (5) apatyukov, так у меня же и используется WebDAV.

    Для загрузки файлов размером больше 2 ГБ используйте программу «Яндекс.Диск» (в версии для Windows, для Mac OS или для Linux) или WebDAV-клиент. Браузеры не смогут обработать такие большие файлы.
    Reply ↓
  7. apatyukov

    (6) ну так попробуй выгрузить 3гб.

    Reply ↓
  8. Xershi

    (7) apatyukov, протестировал обработку — загрузка файла 1.1 Гб прошла, а вот 2.2 ГБ через 30 секунд отваливается:

    Ошибка копирования файлов: Ошибка доступа к файлу ‘https://Логин:xxxxxxx@webdav.yandex.ru/ПапкаИз1С/Видео.rar’: Ошибка работы с Интернет:   Failed sending data to the peer

    На хакере описали как заставить висеть коннект бесконечно:

    request.ReadWriteTimeout = -1;

    Но как это применить к моей разработке, пока не знаю.

    Если есть идеи велком!

    Поэтому пока добавлю в описание, ограничение до 2 Гб.

    Reply ↓
  9. apatyukov

    (8) собственно что и требовалось доказать.

    Reply ↓
  10. sikuda
  11. Xershi

    (12) sikuda, да там ссылка на https://tech.yandex.ru/disk/api/concepts/about-docpage/, а я пока не сильно писал HTTP-запросы. Но я думаю дело за малым. Но смущает регистрация https://tech.yandex.ru/oauth/.

    Reply ↓
  12. DoctorRoza

    + на дальнейшее развитие!

    Reply ↓
  13. sikuda

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

    https://yandex.ru/support/disk/webdav/webdav-win.xml

    И он вообще будет мало отличаться от реального. Только скоростью.

    Если Вы не хотите передавать пароль в открытом виде или Вам на вашей фирме серьезно относятся к безопасности. То лучше немного напрячься — получить token на год

    Причем token можно получить как на чтение так и на полный доступ. Здесь уже открываются другие перспективы…

    Вот насчет файлов в 3 гб. надо попробовать.

    Reply ↓
  14. Xershi

    (15) sikuda, вчера потестировал сервис, ничего не вышло с запросами, Так что отложим до лучших времен. У меня задача выгружать фото на ядиск, а их размер с текущими камерами на телефонах намного ниже 2 гб, так что задачу я решил.

    Reply ↓
  15. shakmaev

    1С прекрасно работает с Webdav. К чему делать обработку? Простите, немного не понял.

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

    (17) shakmaev, вы сами и ответили на свой вопрос. Обработку пишут для пользователя.

    Reply ↓
  17. kuntashov

    Реализация REST API Я.Диска с OAuth-авторизацией в виде библиотеки для 1Script https://github.com/kuntashov/oscript-yadisk

    Пример использования — скрипт для публикации файлов на Я.Диске: https://github.com/kuntashov/oscript-yadisk-uploader

    p.s.

    1Script: http://oscript.io

    Подробнее об 1Script на ИС: http://infostart.ru/public/327581/

    Reply ↓
  18. Xershi

    (19) kuntashov, реализация в виде библиотеки это самое просто решение, но интересно будет написать все кодом 1С. Конечно тогда будет ограничение на версию 1С: 8.3.

    Reply ↓
  19. kuntashov
    но интересно будет написать все кодом 1С

    Там и написано все «кодом 1С». По ссылке поленились, видимо, пройти?

    Reply ↓
  20. Xershi

    (21) kuntashov, использование скрипта это лишнее звено, вот о чем речь была.

    Reply ↓
  21. kuntashov

    (22) вообще-то код будет работать и, например, в модуле обработки практически «как есть» (копированием-вставкой с небольшими доработками, связанными с необходимостью замены использования библиотеки json на штатные методы 1С для парсинга json).

    Плюс там описана процедура авторизации oauth и получения токена, с чем у вас возникли трудности, судя по вашему же комментарию выше.

    Reply ↓
  22. Xershi

    (23) kuntashov, а вот это уже интересно. Много кода портировать придется?

    Reply ↓
  23. kuntashov

    (24) явные отличия есть только в методах работы с json (но на самом деле они взяты из разработки http://infostart.ru/public/119601/, т.е. можно использовать его же вместо штатных методов платформы) + используется модуль логирования. Но вызовы методов этих библиотек локализованы и могут быть заменены.

    Reply ↓
  24. alem

    Здравствуйте, скачал файл — не работает. Может подскажите в чем причина? При входе в почту диск — файлы добавляются удаляются.

    При копировании строки подключения в браузер система даже запрашивает пароль, но дальше ничего не происходит

    При чтении

    Файл не обнаружен ‘https://imsb1c:xxxxxxx@webdav.yandex.ru/imsb/СКД.jpg’

    по причине:

    Ошибка работы с Интернет: ресурс не найден (404).

    При записи

    Ошибка при выполнении файловой операции ‘https://imsb1c:xxxxxxx@webdav.yandex.ru/imsb/СКД.jpg’

    по причине:

    Ошибка работы с Интернет: запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса (409).

    Reply ↓
  25. Xershi

    (26) alem, проверяйте настройки вашего ПК. Скорее всего антивирус блокирует.

    Reply ↓
  26. alem

    (27) отключил, тоже самое.

    у меня win 10, это может влиять?

    + «При копировании строки подключения в браузер система даже запрашивает пароль, но дальше ничего не происходит «

    Reply ↓
  27. Xershi

    (28) alem, на 10 я не тестировал.

    xxxxxxx это у вас такой пароль?

    Введите туда реальные данные!

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

    Reply ↓
  28. alem

    там данные реальные, при ошибки система меняет пароль на хххххх, код полностью ваш, убрал только «попытку», чтобы видеть ошибку

    в яндексе настраивать что то нужно?

    Reply ↓
  29. alem

    попробовал с сервера 2008 r2 — не работает

    Reply ↓
  30. Xershi

    (30) alem, настраивать ничего не нужно. Нужно ввести логин и пароль. Если эта строка в браузере не работает, то я вам уже сказал, проверяйте настройки винды.

    Reply ↓
  31. Xershi

    (31) alem, значит у вас проблемы в настройках сети или ваш провайдер ограничил доступ. Спросите админа сети, какие есть ограничения. Можете также написать запрос в яндекс, чтобы они сообщили вам что нужно для работы сервиса!

    Сейчас проверил работу обработки: проблем нет!

    Решите технические вопросы, которые не связаны с работой обработки и у вас все тоже заработает!

    Reply ↓
  32. alem

    Работает, но только если на компе не установлено приложение диска (если диск установлен, но отключен — не работает)

    Reply ↓
  33. Xershi

    (34) alem, скорее всего он работает как служба и перехватывает запросы. Попробуйте найти его в службах?

    Приложение позволяет же отправлять файлы более 2 ГБ, поэтому они так сделали.

    Reply ↓
  34. o.nikolaev

    На 8.2 падает платформа, было бы неплохо предупреждать о том что на 8.2, как минимум, такой подход не работает.

    Reply ↓
  35. Xershi

    (36) o.nikolaev, а какой у вас релиз? Несовместимости с 8.2 в коде нет. Скорее всего у вас длл сбоит.

    Reply ↓
  36. o.nikolaev

    (37) 8.2.19.130

    Какая именно dll «сбоит»?

    Reply ↓
  37. Xershi

    (38) o.nikolaev, открывайте лог винды и дамп спец утилитой.

    Переустановка платформы не помогает?

    Reply ↓
  38. botman4

    на клюшка заведется ?

    Reply ↓
  39. Xershi

    (40) botman4, если переписать синтаксис, то скорее всего да.

    Но нужно тестировать.

    Reply ↓
  40. ZhakeKZ

    Здравствуйте?

    Выдал ошибку:

    {ВнешняяОбработка.ОбменЯндексДиск.МодульОбъекта(257,11)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Индекс = <<?>>СтрНайти(URL, «/»);

    {ВнешняяОбработка.ОбменЯндексДиск.МодульОбъекта(263,11)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Индекс = <<?>>СтрНайти(ИмяСервера, «:»);

    Reply ↓
  41. Stan

    Выгрузка на яндекс диск работает, загрузка с я.диска — нет. Что может быть не так?

    Reply ↓
  42. Xershi

    (42) добрый день! Если у вас конфигурация без совместимости 8.3.5, то «СтрНайти» нужно заменить на «Найти».

    Доработаю алгоритм позже, для тех кто выше платформу использует.

    Reply ↓
  43. Xershi

    (43) проверить фаервол!

    Reply ↓
  44. Xershi

    (42) проверил свою разработку! Такой строки кода там нет!

    Но судя по вашему тексту, кто-то вам сделал доработку!

    И в вашей версии конфигурации включен решим совместимости ниже 8.3.6.

    В моей версии есть строка:

    ЭтоОбъект = Найти(ТипЗначенияСтрокой, «Object.») > 0;

    Так вот до 8.3.6 есть метод «Найти», а вот с 8.3.6 нужно использовать метод «СтрНайти».

    Обращайтесь к тому кто вам делал доработку или пишите в ЛС!

    Reply ↓
  45. leks88

    Заметил на практике, что ошибка «ресурс не найден (404)» появляется даже без установленного приложения яндекс-диска, а по банальной причине не соответствия регистра имени файла. В моем примере файл «discount.txt» не читался, если указывал название «Discount.txt»

    Reply ↓
  46. dimasts

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

    Reply ↓
  47. Xershi

    (48) все верно! Данная разработка не предполагает такой функционал!

    Reply ↓
  48. greenLiss

    Интересно, а возможно посмотреть список файлов на яндекс диске, так же просто?

    Reply ↓
  49. Xershi

    (50) для этого требуется использовать сервис яндекса. На ИС есть уже публикация, в которой этот алгоритм реализован.

    Reply ↓
  50. Sashares

    (8)

    Но как это применить к моей разработке, пока не знаю.

    Если есть идеи велком!

    Обработку не скачивал.

    Если вы используете http соединение, то добавить в заголовки ReadWriteTimeout со значением -1.

    Reply ↓
  51. Xershi

    (52) там другой принцип. Если переписать на запросы думаю и подойдет, но на текущий момент это уже не требуется.

    Reply ↓
  52. IsiKosta

    А как получить ссылку на загруженный файл?

    Reply ↓
  53. Xershi

    (54) работа обработки не предполагает создание публичной ссылки, только прямой доступ.

    Reply ↓
  54. Sergafan10

    5.5 Гб через webdav грузится. Думаю, что это не потолок.

    Reply ↓
  55. Xershi

    (56) ранее было ограничение, возможно его убрали. Не проверял.

    Reply ↓

Leave a Comment

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