В процессе разработки распределенных систем или интеграции различных конфигураций 1С часто возникает задача получения файла, хранящегося в другой информационной базе. Ситуация упрощается, если у нас есть прямая веб-ссылка на этот файл, по которой он открывается в браузере. Однако для автоматизации процессов нам необходимо реализовать получение этого файла программно, чтобы сохранить его на диск или загрузить в виде двоичных данных в текущую базу. В этой статье мы подробно разберем несколько способов реализации этой задачи, начиная от использования стандартных подсистем и заканчивая низкоуровневой работой с протоколом HTTP.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то наиболее правильным и надежным способом будет использование встроенного модуля ПолучениеФайловИзИнтернета. Этот механизм берет на себя обработку множества технических нюансов: работу через прокси-сервер, установку таймаутов, обработку ошибок соединения и поддержку различных протоколов.
Рассмотрим по шагам, как воспользоваться этим методом. Основная функция, которая нам понадобится, — СкачатьДанныеВоВременноеХранилище или СкачатьФайлНаДиск. Использование БСП позволяет избежать написания громоздкого кода для аутентификации, если настройки доступа уже заданы в системе.
Проанализируем пример кода для получения файла:
ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("Логин", "ИмяПользователяВторойБазы");
ПараметрыПолучения.Вставить("Пароль", "ПарольПользователяВторойБазы");
Результат = ПолучениеФайловИзИнтернета.СкачатьДанныеВоВременноеХранилище(URLФайла, ПараметрыПолучения);
Если Результат.Статус Тогда
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(Результат.ПутьКФайлуВоВременномХранилище);
// Далее сохраняем на диск или записываем в реквизит
Иначе
Сообщить("Ошибка при получении файла: " + Результат.СообщениеОбОшибке);
КонецЕсли;
Использование этого метода является предпочтительным, так как он обеспечивает максимальную совместимость с сетевой инфраструктурой предприятия.
В случаях, когда БСП не используется или требуется более тонкая настройка процесса загрузки, мы можем прибегнуть к использованию встроенных объектов платформы 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).
Если во второй базе включен стандартный интерфейс OData, то получение файла можно организовать еще более элегантно. Каждому файлу в системе соответствует запись в справочнике (например, Справочник_Файлы). Платформа 1С позволяет обращаться к реквизиту типа ХранилищеЗначения напрямую через URL.
Выясним структуру такого запроса. Ссылка будет выглядеть примерно так:
http://server/base/odata/standard.odata/Catalog_Files(guid'ИдентификаторФайла')/FileData/$value
Преимущество этого метода заключается в том, что нам не нужно создавать кастомные веб-сервисы в базе-источнике — мы используем возможности платформы "из коробки". Работа с OData также реализуется через HTTPСоединение, но формат запроса строго регламентирован стандартом 1С.
Часто программисты путают веб-ссылки (URL) с внутренними ссылками 1С, которые начинаются с e1cib/data/.... Важно понимать: ссылку e1cib нельзя напрямую использовать в HTTP-запросе. Она предназначена исключительно для работы внутри клиентского приложения 1С. Если у вас есть только такая ссылка, вам сначала нужно программно получить объект, к которому она относится, внутри базы-источника, либо преобразовать её в URL через публикацию веб-клиента.
При получении файлов размером в несколько сотен мегабайт или гигабайт мы можем столкнуться с ошибкой нехватки оперативной памяти на сервере 1С. Чтобы избежать этого, не рекомендуется считывать весь ответ в переменную. Вместо этого следует использовать возможность сохранения ответа сразу в файл на диске.
Посмотрим, как изменить метод Получить объекта HTTPСоединение для оптимизации памяти:
ИмяФайлаНаДиске = "C:\Files\LargeFile.zip";
// Указываем путь к файлу вторым параметром метода Получить
РезультатЗапроса = Соединение.Получить(Запрос, ИмяФайлаНаДиске);
В этом случае данные будут записываться в поток непосредственно на жесткий диск, минуя оперативную память сервера, что значительно повышает стабильность системы при работе с тяжелыми данными.
Подведем итог: для решения задачи получения файла из другой базы в первую очередь стоит проверить наличие БСП и использовать её методы. Если же требуется автономность, стандартные объекты HTTPСоединение обеспечивают полный контроль над процессом передачи данных. Всегда помните о безопасности: передавайте учетные данные через заголовки или параметры соединения и используйте защищенные протоколы связи.