Как организовать надежную передачу файлов между базами 1С

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

Передача файлов между различными конфигурациями 1С — задача, которая встречается практически в любом крупном проекте автоматизации. Особенно часто возникает необходимость подружить современные базы на базе Библиотеки стандартных подсистем (БСП) и проверенные временем системы, такие как Управление производственным предприятием (УПП). Рассмотрим основные стратегии и технические решения этой задачи, проанализируем их плюсы и минусы, а также разберем примеры реализации.

Метод 1: Сетевой каталог (Shared Folder) — «железобетонный» способ

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

Проанализируем важный нюанс: при передаче больших файлов база-приемник может начать чтение файла до того, как база-источник закончит его запись. Чтобы этого избежать, используем стратегию «файла-флага».

Рассмотрим алгоритм реализации:

  1. База-источник записывает основной файл (например, data.zip).
  2. После успешного завершения записи источником создается пустой файл-маркер (например, data.zip.ready).
  3. База-приемник ищет файлы с расширением .ready.
  4. Если маркер найден, приемник считывает основной файл и после обработки удаляет оба файла.

Пример кода для записи файла в 1С:


// Запись основного файла
ДвоичныеДанные = ПолучитьДвоичныеДанныеФайла();
ПутьКФайлу = "\\Server\Exchange\data.zip";
ДвоичныеДанные.Записать(ПутьКФайлу);

// Создание файла-флага
ТекстовыйДок = Новый ТекстовыйДокумент();
ТекстовыйДок.Записать(ПутьКФайлу + ".ready");

Метод 2: Использование HTTP-сервисов — современный стандарт

Если базы находятся в разных сетях или вы стремитесь к сервисно-ориентированной архитектуре, HTTP-сервисы — ваш выбор. Этот метод позволяет передавать данные «на лету» без использования промежуточных файловых хранилищ.

Разберем, как это работает. В базе-приемнике (например, на БСП) создается объект HTTPСервис с методом POST. База-источник отправляет запрос, в теле которого передаются двоичные данные файла.

Проанализируем код отправки файла из УПП в современную базу:


// Настройка соединения
Сервер = "192.168.1.100";
Порт = 8080;
Соединение = Новый HTTPСоединение(Сервер, Порт, "Логин", "Пароль");

// Подготовка запроса
Запрос = Новый HTTPЗапрос("/base_name/hs/FileExchange/v1/upload");
Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");
Запрос.Заголовки.Вставить("X-File-Name", "report.pdf");

// Чтение файла в двоичные данные и установка тела запроса
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Temp\report.pdf");
Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);

// Отправка
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
    Сообщить("Ошибка передачи: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

На стороне приемника (БСП) в обработчике метода POST мы просто считываем данные:


Функция uploadPOST(Запрос)
    ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();
    ИмяФайла = Запрос.Заголовки.Получить("X-File-Name");
    
    // Сохраняем в справочник "ПрисоединенныеФайлы" или на диск
    ДанныеФайла.Записать("D:\Storage\" + ИмяФайла);
    
    Возврат Новый HTTPСервисОтвет(200);
КонецФункции

Метод 3: Передача файлов по частям (Chunked Upload)

Выясним причину, по которой обычный HTTP-запрос может не подойти. Если файл весит несколько гигабайт, оперативная память сервера 1С может переполниться, либо произойдет таймаут соединения. В таких случаях мы используем передачу частями (чанками).

Рассмотрим шаги реализации:

  1. Источник разбивает файл на блоки (например, по 5 МБ).
  2. Каждая часть отправляется отдельным HTTP-запросом с указанием порядкового номера и общего идентификатора файла.
  3. Приемник записывает части во временное хранилище или сразу дописывает в итоговый файл на диске, используя объект ЗаписьДанных.

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

Метод 4: Объектные хранилища (S3)

Для высоконагруженных систем хорошей практикой является вынос файлов за пределы базы данных 1С. Мы можем использовать S3-совместимые хранилища (например, MinIO).

Схема взаимодействия выглядит так: База А загружает файл в хранилище S3 через API и получает уникальный ключ (ID). Затем База А передает только этот текстовый ключ Базе Б (например, через тот же HTTP-запрос или через сообщение в очереди). База Б, когда ей удобно, скачивает файл из S3 по ключу.

Преимущества этого подхода:

Метод 5: Брокеры сообщений (RabbitMQ) и 1С:Шина

Если важна гарантированная доставка в условиях нестабильной связи, проанализируем вариант с брокерами сообщений. При использовании RabbitMQ или 1С:Шина, файл (или ссылка на него) помещается в очередь.

Если база-приемник выключена или на ней проводятся регламентные работы, сообщение с файлом будет дожидаться своей очереди. Как только база станет доступна, она автоматически «вычитает» файл. Это обеспечивает максимальную отказоустойчивость интеграции.

Метод 6: Стандартный интерфейс OData

Мало кто помнит, что в 1С есть встроенный механизм OData, который позволяет получить доступ к данным без написания кода HTTP-сервисов. Если файл хранится в справочнике как реквизит с типом ХранилищеЗначения, его можно прочитать стандартным GET-запросом к интерфейсу OData базы-источника.

Однако, проанализируем ограничения: OData не всегда эффективна при передаче очень больших объемов данных и требует тщательной настройки прав доступа.

Выводы и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от условий эксплуатации:

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

← На главную