Как реализовать загрузку файлов из 1С на сайт и получить прямую ссылку?

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

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

Метод 1. Использование встроенного протокола FTP

Самым очевидным и простым в реализации способом является использование встроенного в платформу объекта FTPСоединение. Этот метод позволяет работать с файловой системой сервера так же, как если бы это была локальная папка, но через сетевой протокол. Рассмотрим по шагам, как настроить этот процесс.

Во-первых, проанализируем необходимые параметры для подключения: адрес сервера, порт (по умолчанию 21), логин и пароль. Для работы с файлами мы будем использовать метод Записать() или КопироватьФайл().

Рассмотрим пример кода для отправки файла на сервер:


&НаСервере
Процедура ОтправитьФайлПоFTP(ПутьКФайлуИсточник, ИмяФайлаНаСервере)
    
    Сервер = "ftp.mysite.ru";
    Порт = 21;
    Логин = "admin_ftp";
    Пароль = "StrongPassword123";
    
    // Создаем объект соединения
    Соединение = Новый FTPСоединение(Сервер, Порт, Логин, Пароль);
    
    // Определяем путь в каталоге хостинга
    КаталогНаСервере = "/public_html/uploads/";
    
    Попытка
        // Устанавливаем текущий каталог
        Соединение.УстановитьТекущийКаталог(КаталогНаСервере);
        // Отправляем файл
        Соединение.Записать(ПутьКФайлуИсточник, ИмяФайлаНаСервере);
        
        // Формируем ссылку для возврата пользователю
        ПрямаяСсылка = "https://mysite.ru/uploads/" + ИмяФайлаНаСервере;
        Сообщить("Файл успешно загружен. Ссылка: " + ПрямаяСсылка);
    Исключение
        Сообщить("Ошибка при передаче файла: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

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

Метод 2. Использование HTTP POST запросов (Multipart/form-data)

Более современным и безопасным способом является использование протокола HTTP. Вместо того чтобы открывать прямой доступ к файловой системе через FTP, мы создаем на стороне сайта небольшой скрипт (например, на PHP), который принимает файл и сохраняет его. Это позволяет нам работать через стандартный порт 443 (HTTPS) и накладывать дополнительные проверки на стороне сервера.

Разберем алгоритм работы через HTTPСоединение. Основная сложность здесь заключается в том, что 1С не формирует тело запроса multipart/form-data автоматически. Нам необходимо вручную собрать структуру запроса, включая разделители (boundary).

Рассмотрим пример формирования такого запроса:


&НаСервере
Функция ОтправитьФайлЧерезHTTP(ПутьКФайлу)
    
    ИмяСервера = "mysite.ru";
    Ресурс = "/api/upload.php";
    Разделитель = "----" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    
    // Читаем файл в двоичные данные
    ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    ИмяФайла = Файл.Имя; // Предварительно получить через объект Файл
    
    // Формируем тело запроса
    ТелоЗапроса = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(ТелоЗапроса);
    
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайла + """");
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/octet-stream");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.Записать(ДанныеФайла);
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
    ЗаписьДанных.Закрыть();
    
    РезультатБинарный = ТелоЗапроса.ЗакрытьИПолучитьДвоичныеДанные();
    
    // Настраиваем соединение
    Соединение = Новый HTTPСоединение(ИмяСервера, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос(Ресурс);
    Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
    Запрос.УстановитьТелоИзДвоичныхДанных(РезультатБинарный);
    
    Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        Возврат Ответ.ПолучитьТелоКакСтроку(); // Предположим, скрипт возвращает URL
    КонецЕсли;
    
КонецФункции

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

Метод 3. Интеграция с облачными хранилищами (S3)

Если проект масштабируемый, проанализируем вариант использования S3-совместимых хранилищ (Yandex Cloud, AWS). Вместо того чтобы нагружать основной хостинг сайта файлами, 1С может отправлять их напрямую в "облако".

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

  1. Изоляция: Сайт не хранит файлы, а только ссылки на них.
  2. Производительность: Снятие нагрузки с веб-сервера при загрузке тяжелых файлов.
  3. Безопасность: Возможность генерации временных ссылок (Pre-signed URLs), которые работают ограниченное время.

Для реализации в 1С можно использовать как прямое HTTPСоединение с формированием подписи запроса (AWS Signature V4), так и готовые библиотеки и внешние компоненты, упрощающие этот процесс.

Оптимизация: Генерация уникальных имен и асинхронность

Выясним причину возможных проблем при подборе имен файлов. Если мы загружаем файл с оригинальным именем order.pdf, велика вероятность, что его перепишет другой пользователь или злоумышленник сможет его "угадать".

Рекомендация: Всегда генерируйте уникальное имя файла на стороне 1С, используя УникальныйИдентификатор. Например:

НовоеИмя = Строка(Новый УникальныйИдентификатор()) + ".pdf";

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


ПараметрыЗадания = Новый Структура("ПутьКФайлу", ВыбранныйПуть);
ФоновыеЗадания.Выполнить("МодульИнтеграции.ОтправитьФайлНаСайт", ПараметрыЗадания);

Таким образом, пользователь сможет продолжать работу в 1С, а программа сообщит об успешной загрузке через систему оповещений после завершения фонового процесса.

Заключение

Мы проанализировали три основных способа организации файлового обмена между 1С и сайтом. Для простых задач внутри защищенного контура допустимо использование FTP. Однако для публичных веб-ресурсов наиболее правильным решением будет использование HTTP POST запросов с обработкой на стороне сайта или переход на специализированные S3-хранилища. Выбор конкретного метода зависит от требований к безопасности и архитектуры вашего проекта.

← На главную