Обмен данными между различными информационными базами — одна из самых частых задач в экосистеме 1С. Использование облачных хранилищ, таких как Яндекс Диск, является отличной альтернативой созданию собственных FTP-серверов или сложных веб-сервисов. В этой статье мы подробно разберем, как автоматизировать выгрузку и загрузку XML-файлов по расписанию, рассмотрим различные методы подключения и решим типичные проблемы, возникающие при работе на сервере.
Один из самых простых способов взаимодействия с облаком — это эмуляция сетевого диска в операционной системе. Мы можем подключить Яндекс Диск как обычный диск (например, 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, у которой нет доступа к сетевым ресурсам или права на запуск интерактивных приложений.
Если мы не хотим занимать букву диска в системе, мы можем обращаться к хранилищу напрямую через протокол WebDAV, используя встроенную функцию 1С КопироватьФайл. Это более элегантный метод, который избавляет от необходимости манипуляций с командной строкой Windows.
Проанализируем пример формирования пути:
Процедура ВыгрузитьФайлНаДиск()
Логин = "myuser@yandex.ru";
Пароль = "mypassword"; // Рекомендуется использовать пароль приложения
// Кодируем пароль для URL, чтобы избежать проблем со спецсимволами
ЗащищенныйПароль = КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);
ПутьКЯндексу = "https://" + Логин + ":" + ЗащищенныйПароль + "@webdav.yandex.ru/";
ЛокальныйФайл = "C:\Temp\Exchange.xml";
ЦелевойФайл = ПутьКЯндексу + "Exchange.xml";
Попытка
КопироватьФайл(ЛокальныйФайл, ЦелевойФайл);
Сообщить("Файл успешно скопирован в облако.");
Исключение
Сообщить("Ошибка копирования: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для загрузки файлов из облака в другую базу используем аналогичный подход. Если названия файлов заранее неизвестны, мы можем использовать метод НайтиФайлы, указав маску в пути WebDAV, однако этот метод не всегда стабильно работает с сетевыми ресурсами. В таких случаях лучше использовать полноценный 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, чтобы файлы удалялись сразу, минуя корзину, иначе облако быстро переполнится.
conf.cfg или снять флаг "Защита от опасных действий" в карточке пользователя информационной базы.HTTPСоединение это ограничение отсутствует.HTTPСоединение (например, 60 или 120 секунд).Для построения надежной системы рекомендуем придерживаться следующей логики:
В базе-источнике (выгрузка):
PUT.В базе-приемнике (загрузка):
GET запрос.DELETE с параметром permanently=true.Такой подход гарантирует, что данные не потеряются при обрыве связи и не будут загружены дважды. Выбор конкретного метода (WebDAV или API) зависит от ваших навыков и требований безопасности, но для промышленной эксплуатации REST API является безусловным лидером.