Как настроить обмен файлами XML через Яндекс Диск в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Обмен данными между различными информационными базами — одна из самых частых задач в экосистеме 1С. Использование облачных хранилищ, таких как Яндекс Диск, является отличной альтернативой созданию собственных FTP-серверов или сложных веб-сервисов. В этой статье мы подробно разберем, как автоматизировать выгрузку и загрузку XML-файлов по расписанию, рассмотрим различные методы подключения и решим типичные проблемы, возникающие при работе на сервере.

Вариант 1: Использование WebDAV через подключение сетевого диска

Один из самых простых способов взаимодействия с облаком — это эмуляция сетевого диска в операционной системе. Мы можем подключить Яндекс Диск как обычный диск (например, Z: или Y:) и работать с ним через стандартные средства 1С для работы с файловой системой. Для этого используются командные файлы (bat-файлы) и объект WScript.Shell.

Разберем создание bat-файла для подключения диска. Содержимое файла start.cmd может выглядеть следующим образом:


net use Y: https://webdav.yandex.ru /user:имя_почты@yandex.ru Пароль /persistent:yes

Чтобы выполнить эту команду непосредственно из кода 1С, воспользуемся следующим алгоритмом:


&НаКлиенте
Процедура ПодключитьДиск(Команда)
    Попытка
        WshShell = Новый COMОбъект("WScript.Shell");
        // Параметр 2 означает запуск в свернутом окне, 1 — ждать завершения
        WshShell.Run("C:\TEST\start.cmd", 2, 1);
        Сообщить("Яндекс Диск успешно подключен как диск Y:");
    Исключение
        Сообщить("Ошибка при подключении: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Запись файла
    ТекстС = Новый ТекстовыйДокумент;
    ИмяФайлаС = "Y:\Обмен_Данными.xml";
    ТекстС.ДобавитьСтроку("Данные для обмена...");
    ТекстС.Записать(ИмяФайлаС, КодировкаТекста.UTF8);
    
    // Отключение диска
    WshShell.Run("net use Y: /delete /yes", 2, 1);
КонецПроцедуры

Важное примечание: При работе в клиент-серверном режиме (на стороне сервера) использование WScript.Shell может быть ограничено правами пользователя, под которым запущена служба 1CV8. Часто это системная учетная запись USR1CV8, у которой нет доступа к сетевым ресурсам или права на запуск интерактивных приложений.

Вариант 2: Прямая работа через WebDAV без подключения диска

Если мы не хотим занимать букву диска в системе, мы можем обращаться к хранилищу напрямую через протокол WebDAV, используя встроенную функцию 1С КопироватьФайл. Это более элегантный метод, который избавляет от необходимости манипуляций с командной строкой Windows.

Проанализируем пример формирования пути:


Процедура ВыгрузитьФайлНаДиск()
    Логин = "myuser@yandex.ru";
    Пароль = "mypassword"; // Рекомендуется использовать пароль приложения
    
    // Кодируем пароль для URL, чтобы избежать проблем со спецсимволами
    ЗащищенныйПароль = КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);
    
    ПутьКЯндексу = "https://" + Логин + ":" + ЗащищенныйПароль + "@webdav.yandex.ru/";
    ЛокальныйФайл = "C:\Temp\Exchange.xml";
    ЦелевойФайл = ПутьКЯндексу + "Exchange.xml";
    
    Попытка
        КопироватьФайл(ЛокальныйФайл, ЦелевойФайл);
        Сообщить("Файл успешно скопирован в облако.");
    Исключение
        Сообщить("Ошибка копирования: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Для загрузки файлов из облака в другую базу используем аналогичный подход. Если названия файлов заранее неизвестны, мы можем использовать метод НайтиФайлы, указав маску в пути WebDAV, однако этот метод не всегда стабильно работает с сетевыми ресурсами. В таких случаях лучше использовать полноценный REST API.

Вариант 3: Использование Yandex Disk REST API (Рекомендуемый)

Работа через REST API — это наиболее надежный и современный способ, особенно для регламентных заданий, выполняющихся на сервере. Он позволяет не только передавать файлы, но и получать список файлов в папке, удалять их или перемещать в архив.

Для реализации нам потребуется объект HTTPСоединение. Рассмотрим, как получить список файлов в папке обмена, чтобы решить проблему неизвестных имен файлов:


&НаСервере
Функция ПолучитьСписокФайловНаДиске()
    Токен = "ВАШ_OAUTH_TOKEN"; // Получается в Яндекс ID
    Соединение = Новый HTTPСоединение("cloud-api.yandex.net", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
    
    Запрос = Новый HTTPЗапрос("/v1/disk/resources?path=app:/Обмен&limit=100");
    Запрос.Заголовки.Вставить("Authorization", "OAuth " + Токен);
    
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
        Данные = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        // Массив структур с информацией о файлах
        Возврат Данные._embedded.items; 
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

В данном примере мы используем путь app:/, что соответствует папке приложения на диске. Это повышает безопасность, так как приложение 1С будет иметь доступ только к своей папке, а не ко всему диску пользователя.

При обработке файлов в принимающей базе крайне важно удалять их после успешной загрузки, чтобы избежать повторного импорта. При использовании метода DELETE через API рекомендуем добавлять параметр permanently=true, чтобы файлы удалялись сразу, минуя корзину, иначе облако быстро переполнится.

Типичные ошибки и их решение

  1. Проблема авторизации: Яндекс часто блокирует доступ по обычному паролю почты. Решение — создайте "Пароль приложения" в настройках безопасности Яндекс ID. Это отдельный 16-значный код, предназначенный специально для внешних программ.
  2. Ошибка "Опасное действие": При запуске скриптов или COM-объектов 1С может выдавать предупреждение безопасности. Чтобы отключить его для конкретного пользователя или всей базы, необходимо отредактировать файл conf.cfg или снять флаг "Защита от опасных действий" в карточке пользователя информационной базы.
  3. Ограничение размера в WebDAV: Через стандартный WebDAV в Windows часто нельзя передать файлы больше 50 Мб. При использовании REST API через HTTPСоединение это ограничение отсутствует.
  4. Тайм-ауты: При передаче больших XML-файлов обязательно устанавливайте увеличенный тайм-аут в объекте HTTPСоединение (например, 60 или 120 секунд).

Организация архитектуры обмена

Для построения надежной системы рекомендуем придерживаться следующей логики:

В базе-источнике (выгрузка):

  1. Сформируйте XML-файл во временном хранилище или локальной папке.
  2. Проверьте наличие интернета и доступность API Яндекса.
  3. Отправьте файл методом PUT.
  4. В случае успеха переместите локальный файл в подпапку "Отправлено" для истории.

В базе-приемнике (загрузка):

  1. Запросите список всех файлов в папке обмена через GET запрос.
  2. Для каждого файла из списка:
    • Скачайте его во временный каталог.
    • Запустите процедуру загрузки данных в 1С.
    • После успешного завершения отправьте запрос DELETE с параметром permanently=true.

Такой подход гарантирует, что данные не потеряются при обрыве связи и не будут загружены дважды. Выбор конкретного метода (WebDAV или API) зависит от ваших навыков и требований безопасности, но для промышленной эксплуатации REST API является безусловным лидером.

← На главную