Передача файлов между различными конфигурациями 1С — задача, которая встречается практически в любом крупном проекте автоматизации. Особенно часто возникает необходимость подружить современные базы на базе Библиотеки стандартных подсистем (БСП) и проверенные временем системы, такие как Управление производственным предприятием (УПП). Рассмотрим основные стратегии и технические решения этой задачи, проанализируем их плюсы и минусы, а также разберем примеры реализации.
Несмотря на кажущуюся простоту, использование общей сетевой папки остается одним из самых надежных способов в локальной сети. Суть проста: база-источник выгружает файл в каталог, а база-приемник забирает его по расписанию или событию.
Проанализируем важный нюанс: при передаче больших файлов база-приемник может начать чтение файла до того, как база-источник закончит его запись. Чтобы этого избежать, используем стратегию «файла-флага».
Рассмотрим алгоритм реализации:
data.zip).data.zip.ready)..ready.Пример кода для записи файла в 1С:
// Запись основного файла
ДвоичныеДанные = ПолучитьДвоичныеДанныеФайла();
ПутьКФайлу = "\\Server\Exchange\data.zip";
ДвоичныеДанные.Записать(ПутьКФайлу);
// Создание файла-флага
ТекстовыйДок = Новый ТекстовыйДокумент();
ТекстовыйДок.Записать(ПутьКФайлу + ".ready");
Если базы находятся в разных сетях или вы стремитесь к сервисно-ориентированной архитектуре, 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);
КонецФункции
Выясним причину, по которой обычный HTTP-запрос может не подойти. Если файл весит несколько гигабайт, оперативная память сервера 1С может переполниться, либо произойдет таймаут соединения. В таких случаях мы используем передачу частями (чанками).
Рассмотрим шаги реализации:
ЗаписьДанных.В 1С 8.3 для этого удобно использовать ЧтениеДанных и ЗаписьДанных, которые позволяют работать с потоками без полной загрузки файла в память.
Для высоконагруженных систем хорошей практикой является вынос файлов за пределы базы данных 1С. Мы можем использовать S3-совместимые хранилища (например, MinIO).
Схема взаимодействия выглядит так: База А загружает файл в хранилище S3 через API и получает уникальный ключ (ID). Затем База А передает только этот текстовый ключ Базе Б (например, через тот же HTTP-запрос или через сообщение в очереди). База Б, когда ей удобно, скачивает файл из S3 по ключу.
Преимущества этого подхода:
Если важна гарантированная доставка в условиях нестабильной связи, проанализируем вариант с брокерами сообщений. При использовании RabbitMQ или 1С:Шина, файл (или ссылка на него) помещается в очередь.
Если база-приемник выключена или на ней проводятся регламентные работы, сообщение с файлом будет дожидаться своей очереди. Как только база станет доступна, она автоматически «вычитает» файл. Это обеспечивает максимальную отказоустойчивость интеграции.
Мало кто помнит, что в 1С есть встроенный механизм OData, который позволяет получить доступ к данным без написания кода HTTP-сервисов. Если файл хранится в справочнике как реквизит с типом ХранилищеЗначения, его можно прочитать стандартным GET-запросом к интерфейсу OData базы-источника.
Однако, проанализируем ограничения: OData не всегда эффективна при передаче очень больших объемов данных и требует тщательной настройки прав доступа.
Подведем итоги нашего анализа. Выбор метода зависит от условий эксплуатации:
Рассмотренные подходы позволят вам создать надежную систему обмена данными между УПП и современными конфигурациями, обеспечив целостность и сохранность ваших файлов.