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

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

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

Способ 1: Использование типовых механизмов БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то наиболее правильным и надежным способом будет использование встроенного модуля ПолучениеФайловИзИнтернета. Этот механизм берет на себя обработку множества технических нюансов: работу через прокси-сервер, установку таймаутов, обработку ошибок соединения и поддержку различных протоколов.

Рассмотрим по шагам, как воспользоваться этим методом. Основная функция, которая нам понадобится, — СкачатьДанныеВоВременноеХранилище или СкачатьФайлНаДиск. Использование БСП позволяет избежать написания громоздкого кода для аутентификации, если настройки доступа уже заданы в системе.

Проанализируем пример кода для получения файла:


ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("Логин", "ИмяПользователяВторойБазы");
ПараметрыПолучения.Вставить("Пароль", "ПарольПользователяВторойБазы");

Результат = ПолучениеФайловИзИнтернета.СкачатьДанныеВоВременноеХранилище(URLФайла, ПараметрыПолучения);

Если Результат.Статус Тогда
    ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(Результат.ПутьКФайлуВоВременномХранилище);
    // Далее сохраняем на диск или записываем в реквизит
Иначе
    Сообщить("Ошибка при получении файла: " + Результат.СообщениеОбОшибке);
КонецЕсли;

Использование этого метода является предпочтительным, так как он обеспечивает максимальную совместимость с сетевой инфраструктурой предприятия.

Способ 2: Программная реализация через HTTPСоединение

В случаях, когда БСП не используется или требуется более тонкая настройка процесса загрузки, мы можем прибегнуть к использованию встроенных объектов платформы 1С:Предприятие 8.3 — HTTPСоединение и HTTPЗапрос. Этот метод универсален и позволяет взаимодействовать с любым веб-сервером.

Разберем ситуацию, когда база-источник требует авторизации. Большинство публикаций баз 1С используют Basic Authentication. Рассмотрим пример реализации:


// Разделим URL на составляющие: сервер и путь к ресурсу
// Например, из ссылки "https://myserver.ru/base/hs/getfile?id=1"
Сервер = "myserver.ru";
ПутьНаСервере = "/base/hs/getfile?id=1";

// Если используется HTTPS, обязательно инициализируем защищенное соединение
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение с указанием логина и пароля
Соединение = Новый HTTPСоединение(Сервер, , "Логин", "Пароль", , , Защита);

// Формируем запрос
Запрос = Новый HTTPЗапрос(ПутьНаСервере);

Попытка
    Ответ = Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
        ДвоичныеДанные.Записать("C:\Temp\downloaded_file.pdf");
        Сообщить("Файл успешно получен и сохранен.");
    Иначе
        Сообщить("Ошибка сервера. Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;

Важный момент: Если вы работаете с протоколом HTTPS, объект ЗащищенноеСоединениеOpenSSL критически важен. Без него платформа выдаст ошибку при попытке подключения к защищенному порту (обычно 443).

Способ 3: Получение данных через REST API (OData)

Если во второй базе включен стандартный интерфейс OData, то получение файла можно организовать еще более элегантно. Каждому файлу в системе соответствует запись в справочнике (например, Справочник_Файлы). Платформа 1С позволяет обращаться к реквизиту типа ХранилищеЗначения напрямую через URL.

Выясним структуру такого запроса. Ссылка будет выглядеть примерно так:
http://server/base/odata/standard.odata/Catalog_Files(guid'ИдентификаторФайла')/FileData/$value

Преимущество этого метода заключается в том, что нам не нужно создавать кастомные веб-сервисы в базе-источнике — мы используем возможности платформы "из коробки". Работа с OData также реализуется через HTTPСоединение, но формат запроса строго регламентирован стандартом 1С.

Особенности работы с навигационными ссылками e1cib

Часто программисты путают веб-ссылки (URL) с внутренними ссылками 1С, которые начинаются с e1cib/data/.... Важно понимать: ссылку e1cib нельзя напрямую использовать в HTTP-запросе. Она предназначена исключительно для работы внутри клиентского приложения 1С. Если у вас есть только такая ссылка, вам сначала нужно программно получить объект, к которому она относится, внутри базы-источника, либо преобразовать её в URL через публикацию веб-клиента.

Работа с файлами большого объема

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

Посмотрим, как изменить метод Получить объекта HTTPСоединение для оптимизации памяти:


ИмяФайлаНаДиске = "C:\Files\LargeFile.zip";
// Указываем путь к файлу вторым параметром метода Получить
РезультатЗапроса = Соединение.Получить(Запрос, ИмяФайлаНаДиске);

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

Подведем итог: для решения задачи получения файла из другой базы в первую очередь стоит проверить наличие БСП и использовать её методы. Если же требуется автономность, стандартные объекты HTTPСоединение обеспечивают полный контроль над процессом передачи данных. Всегда помните о безопасности: передавайте учетные данные через заголовки или параметры соединения и используйте защищенные протоколы связи.

← На главную