Синхронизация 1С через Яндекс Диск: папка обмена, API и регламентное задание

· 10 мин

Содержание

Синхронизацию 1С через Яндекс Диск настраивают двумя способами. Простой: штатная «Синхронизация данных» пишет пакеты обмена в папку, которую приложение Яндекс Диска держит одинаковой на двух компьютерах. Надёжный: 1С сама отправляет файлы в облако через REST API Диска по OAuth-токену, без клиента на компьютере.

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

Какой способ обмена с Яндекс Диском выбрать

СпособКогда подходитЧто нужноСлабые места
Папка Яндекс Диска + штатный обменДва-три офиса, файловые базы, обмен раз в час и режеПриложение Яндекс Диска на обоих концах, права администратора 1СЗадержка синхронизации, конфликты версий файлов, зависимость от включённого компьютера
REST API из кода 1ССерверная база, бэкапы, выгрузка отчётов и сканов, обмен по расписаниюOAuth-токен, расширение с общим модулем, доступ сервера 1С в интернет по 443Нужен разработчик, токен надо хранить и обновлять
WebDAV (https://webdav.yandex.ru)Подключить Диск как сетевой диск или ходить из скриптаПароль приложения Яндекс IDМедленнее на больших файлах, сетевой диск в Windows ведёт себя нестабильно

💡 Для обмена между базами (РИБ, БП ↔ УТ) берите папку. Для бэкапов и выгрузки файлов из 1С берите API: там видно, дошёл файл или нет.

Синхронизация данных 1С через папку на Яндекс Диске

Штатный механизм обмена в типовых конфигурациях умеет транспорт «локальный или сетевой каталог». Ему всё равно, кто наполняет каталог: сетевой ресурс или клиент облака. На этом и строится схема.

Подготовка папки

  1. Установите приложение Яндекс Диска на компьютерах обеих сторон обмена и войдите под одним аккаунтом. Либо под разными, но дайте второму аккаунту доступ к общей папке.
  2. Создайте папку, например Яндекс Диск\Обмен1С\Офис-Склад.
  3. Проверьте, что папка не включена в режим «только в облаке»: файлы должны лежать на диске физически, иначе 1С их не прочитает.
  4. Отключите для этой папки антивирусную проверку архивов, если обмен идёт сжатыми пакетами и антивирус их держит.

Настройка обмена в 1С

  1. В БП 3.0 и УТ 11 откройте Администрирование → Синхронизация данных.
  2. Включите флажок синхронизации и задайте префикс информационной базы (у каждой базы свой: БП, СК и т. п.).
  3. Создайте новую синхронизацию с нужной программой и на шаге выбора способа подключения укажите обмен через локальный или сетевой каталог.
  4. Укажите путь к папке из Яндекс Диска. У второй базы путь свой, но папка та же.
  5. Выполните первую синхронизацию и проверьте, что во второй базе появились сообщения обмена.
  6. Задайте расписание в карточке синхронизации.

Расписание ставьте реже, чем клиент Диска успевает загружать файлы. Если 1С на второй стороне читает пакет, который ещё не докачался, обмен падает с ошибкой чтения сообщения. Интервал 30–60 минут обычно снимает проблему.

Что ломает такую схему

  • 🔁 Конфликт версий. Если обе стороны пишут один файл почти одновременно, Диск создаёт копию с припиской в имени. 1С её не видит, и пакет теряется до следующего цикла.
  • 💤 Спящий компьютер. Пока клиент Диска выключен, обмена нет. Для серверной базы это главный аргумент в пользу API.
  • 🔐 Служба 1С не видит папку. Сервер 1С работает от служебной учётной записи, а клиент Диска синхронизирует профиль пользователя. Права на папку нужно выдать пользователю службы явно.

OAuth-токен Яндекса для доступа 1С к Диску

Для программной синхронизации 1С с Яндекс Диском нужен OAuth-токен. Логин и пароль аккаунта в коде не используются.

Регистрация приложения

  1. Войдите в аккаунт, который будет владельцем файлов. Лучше завести отдельный служебный аккаунт под обмен.
  2. Откройте https://oauth.yandex.ru и создайте приложение.
  3. В доступах отметьте права Яндекс Диска REST API: чтение и запись (cloud_api:disk.read, cloud_api:disk.write). Если 1С должна работать только в своей папке, достаточно права на папку приложения (cloud_api:disk.app_folder).
  4. Для платформы веб-сервисов укажите адрес отладочного токена, который предлагает сам сервис.
  5. Сохраните приложение и скопируйте его ClientID.

Получение токена

Откройте в браузере, под нужным аккаунтом:

https://oauth.yandex.ru/authorize?response_type=token&client_id=ВАШ_CLIENT_ID

После подтверждения доступа сервис покажет токен. Это длинная строка, её 1С передаёт в заголовке Authorization: OAuth <токен>.

💡 У токена есть срок жизни, обычно около года. Запишите дату получения в карточку настроек и поставьте напоминание: когда токен истечёт, все запросы начнут возвращать 401.

Где хранить токен в базе

  • ✅ В типовых конфигурациях на БСП есть безопасное хранилище данных (ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище). Данные оттуда читаются только привилегированно, обычный пользователь их не увидит.
  • ✅ Если хранилище не используете, заведите в расширении константу и закройте её ролью только для администратора.
  • ❌ Не вписывайте токен в код модуля. Он уедет в каждую копию конфигурации и в хранилище разработки.

HTTP-соединение 1С с REST API Яндекс Диска

API Диска живёт по адресу cloud-api.yandex.net, базовый путь /v1/disk/. Работает только по HTTPS, порт 443. Нужные методы:

ДействиеМетод HTTPРесурс
Информация о Диске, свободное местоGET/v1/disk/
Создать папкуPUT/v1/disk/resources?path=...
Список файлов в папкеGET/v1/disk/resources?path=...
Получить ссылку для загрузкиGET/v1/disk/resources/upload?path=...&overwrite=true
Получить ссылку для скачиванияGET/v1/disk/resources/download?path=...
Удалить файлDELETE/v1/disk/resources?path=...

Загрузка идёт в два шага. Сначала 1С просит у API ссылку, потом отправляет файл методом PUT на полученный адрес. Сервер загрузки — другой хост, поэтому для второго шага нужно новое соединение.

Создайте расширение конфигурации и в нём серверный общий модуль, например ЯндексДиск. Первая функция открывает соединение и возвращает разобранный ответ:

Функция СоединениеAPI()
	SSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
	Возврат Новый HTTPСоединение("cloud-api.yandex.net", 443, , , , 60, SSL);
КонецФункции

Функция Заголовки(Токен)
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", "OAuth " + Токен);
	Заголовки.Вставить("Accept", "application/json");
	Возврат Заголовки;
КонецФункции

Функция ПрочитатьОтвет(Ответ)
	Текст = Ответ.ПолучитьТелоКакСтроку();
	Если ПустаяСтрока(Текст) Тогда
		Возврат Новый Структура;
	КонецЕсли;
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(Текст);
	Результат = ПрочитатьJSON(Чтение);
	Чтение.Закрыть();
	Возврат Результат;
КонецФункции

СертификатыУдостоверяющихЦентровОС берёт корневые сертификаты из системы. На Windows Server с обновлениями корни Яндекса уже есть. На Linux-сервере 1С проверьте, что пакет корневых сертификатов установлен, иначе соединение упадёт на проверке TLS. Отключать проверку сертификата ради «чтобы заработало» не стоит.

Выгрузка файлов из 1С на Яндекс Диск: код

Функция ниже принимает полный путь к файлу на сервере 1С и путь назначения на Диске, например /1C/backup/base.zip. Файл не читается в память целиком: тело запроса берётся прямо из файла.

Функция ЗагрузитьФайл(Токен, ИмяФайла, ПутьНаДиске) Экспорт
	
	// Шаг 1. Ссылка для загрузки
	Ресурс = "/v1/disk/resources/upload?path="
		+ КодироватьСтроку(ПутьНаДиске, СпособКодированияСтроки.КодировкаURL)
		+ "&overwrite=true";
	Запрос = Новый HTTPЗапрос(Ресурс, Заголовки(Токен));
	Ответ = СоединениеAPI().Получить(Запрос);
	Данные = ПрочитатьОтвет(Ответ);
	
	Если Ответ.КодСостояния <> 200 Тогда
		ВызватьИсключение СтрШаблон("Диск вернул %1: %2",
			Формат(Ответ.КодСостояния, "ЧГ=0"),
			?(Данные.Свойство("message"), Данные.message, ""));
	КонецЕсли;
	
	// Шаг 2. PUT файла на адрес из href
	Адрес = Новый Структура("Хост, Путь");
	РазобратьАдрес(Данные.href, Адрес);
	SSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
	Загрузчик = Новый HTTPСоединение(Адрес.Хост, 443, , , , 1800, SSL);
	ЗапросФайла = Новый HTTPЗапрос(Адрес.Путь);
	ЗапросФайла.УстановитьИмяФайлаТела(ИмяФайла);
	ОтветФайла = Загрузчик.Записать(ЗапросФайла);
	
	Возврат ОтветФайла.КодСостояния = 201 Или ОтветФайла.КодСостояния = 202;
	
КонецФункции

Процедура РазобратьАдрес(URL, Адрес)
	Строка = Сред(URL, СтрНайти(URL, "://") + 3);
	Позиция = СтрНайти(Строка, "/");
	Хост = Лев(Строка, Позиция - 1);
	Двоеточие = СтрНайти(Хост, ":");
	Если Двоеточие > 0 Тогда
		Хост = Лев(Хост, Двоеточие - 1);
	КонецЕсли;
	Адрес.Хост = Хост;
	Адрес.Путь = Сред(Строка, Позиция);
КонецПроцедуры

Что важно в этом коде:

  • Записать() у HTTPСоединение отправляет запрос методом PUT, он и нужен серверу загрузки.
  • Таймаут второго соединения 1800 секунд: архив на несколько гигабайт по офисному каналу грузится долго.
  • Ссылка из href живёт ограниченное время (около 30 минут). Не сохраняйте её, запрашивайте новую на каждую загрузку.
  • Папка назначения должна существовать. Перед первой загрузкой создайте её запросом PUT на /v1/disk/resources?path=/1C/backup, иначе API ответит 409.

Скачивание устроено зеркально: GET на /v1/disk/resources/download, из ответа берётся href, затем обычный Получить() с указанием имени выходного файла вторым параметром.

Регламентное задание для автоматической выгрузки

Чтобы 1С отправляла файлы на Диск без участия пользователя, повесьте вызов на регламентное задание.

  1. В Конфигураторе откройте расширение и добавьте в ветку «Общие» новое регламентное задание.
  2. В поле метода укажите экспортную процедуру серверного общего модуля, например ЯндексДиск.ВыгрузитьАрхивы. Модуль должен иметь флажок «Сервер».
  3. Включите флажок «Использование» и задайте расписание, например ежедневно в 02:00.
  4. Обновите расширение в базе и проверьте задание в пользовательском режиме: Администрирование → Обслуживание → Регламентные и фоновые задания.

Внутри процедуры оберните загрузку в Попытка ... Исключение и пишите результат в журнал регистрации через ЗаписьЖурналаРегистрации. Так ошибку токена или переполнения Диска можно найти утром, а не через месяц.

В файловой базе регламентные задания выполняет один из запущенных клиентов. Если ночью базу никто не открыл, выгрузки не будет. Для файловых баз надёжнее внешний запуск по расписанию Windows или перевод выгрузки на скрипт.

Большие файлы и резервные копии базы на Яндекс Диске

Самый частый сценарий интеграции — ночной бэкап. Типовая цепочка такая: выгрузить базу в .dt, сжать, отправить на Диск, удалить старые копии.

Выгрузка .dt пакетным файлом

@echo off
set D=%date:~6,4%-%date:~3,2%-%date:~0,2%
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S"srv1c\buh" /N"Админ" /P"пароль" /DumpIB"D:\Backup\buh_%D%.dt" /Out"D:\Backup\dump.log"
"C:\Program Files\7-Zip\7z.exe" a -v2g "D:\Backup\buh_%D%.7z" "D:\Backup\buh_%D%.dt"

Номер платформы в пути замените на свой. Для файловой базы вместо /S"srv1c\buh" укажите /F"D:\Bases\Buh".

Выгрузка .dt большой базы идёт долго и нагружает сервер: запускайте её ночью, когда в базе никто не работает , и утром проверяйте dump.log.

Особенности больших файлов

  • 📦 Режьте архив на тома. Ключ -v2g у 7-Zip делит архив на части по 2 ГБ. Обрыв на одной части не заставит перекачивать всё.
  • 📏 Проверяйте место заранее. GET на /v1/disk/ возвращает total_space и used_space. Если свободного места меньше размера архива, лучше не начинать загрузку.
  • 🧹 Чистите старые копии. Получите список папки, отсортируйте по дате создания и удалите всё старше нужного срока. Удалённое через API попадает в корзину и продолжает занимать место; добавьте параметр permanently=true к запросу удаления, если корзина не нужна.
  • 🧾 Сверяйте размер. После загрузки запросите метаданные файла и сравните поле size с размером локального файла.

Облако — вторая копия, а не единственная. Держите хотя бы одну свежую копию локально: восстанавливать базу на 20 ГБ с Диска по медленному каналу долго.

Ошибки API Яндекс Диска и что с ними делать

Диагностика: выберите симптом

Если на сервере 1С интернет идёт через прокси, его нужно передать в соединение объектом ИнтернетПрокси. Без этого запрос уходит напрямую и падает по таймауту, хотя браузер на том же сервере открывает Диск без проблем: браузер берёт прокси из системы, а сеанс службы 1С нет.

Частые вопросы

Можно ли хранить на Яндекс Диске саму файловую базу и работать с ней с двух компьютеров?
Нет. Клиент Диска копирует файл 1Cv8.1CD целиком и не понимает блокировок 1С. При одновременной работе база повредится. Для двух мест нужен обмен или серверная база.
Подойдёт ли бесплатный аккаунт Яндекс Диска для обмена 1С?
Для пакетов обмена хватит: они весят мегабайты. Для ежедневных бэкапов крупной базы места быстро не останется, тут нужен платный объём.
Нужен ли сервер 1С с публикацией на веб-сервере, чтобы работать с API Диска?
Нет. 1С выступает клиентом и сама обращается к API. Публикация нужна, только если внешняя система должна вызывать HTTP-сервисы вашей базы.
Почему файл в папке Яндекс Диска есть, а 1С пишет, что сообщения обмена нет?
Чаще всего файл ещё не докачан или сохранён как конфликтная копия с другим именем. Проверьте имя файла и статус синхронизации в клиенте Диска.
Можно ли загружать файлы на Диск из клиентского модуля, без серверного?
Можно, но тогда запрос идёт с компьютера пользователя и токен попадает на клиент. Для обмена и бэкапов держите код на сервере.