В современной практике автоматизации часто возникает задача интеграции 1С с веб-ресурсами. Одной из типовых задач является передача файла (например, изображения товара, PDF-счета или текстового лога) непосредственно из интерфейса 1С на хостинг сайта с последующим получением публичной ссылки. В этой статье мы подробно разберем несколько способов реализации данной задачи, проанализируем вопросы безопасности и выберем наиболее эффективные инструменты платформы 1С:Предприятие 8.3.
Самым очевидным и простым в реализации способом является использование встроенного в платформу объекта FTPСоединение. Этот метод позволяет работать с файловой системой сервера так же, как если бы это была локальная папка, но через сетевой протокол. Рассмотрим по шагам, как настроить этот процесс.
Во-первых, проанализируем необходимые параметры для подключения: адрес сервера, порт (по умолчанию 21), логин и пароль. Для работы с файлами мы будем использовать метод Записать() или КопироватьФайл().
Рассмотрим пример кода для отправки файла на сервер:
&НаСервере
Процедура ОтправитьФайлПоFTP(ПутьКФайлуИсточник, ИмяФайлаНаСервере)
Сервер = "ftp.mysite.ru";
Порт = 21;
Логин = "admin_ftp";
Пароль = "StrongPassword123";
// Создаем объект соединения
Соединение = Новый FTPСоединение(Сервер, Порт, Логин, Пароль);
// Определяем путь в каталоге хостинга
КаталогНаСервере = "/public_html/uploads/";
Попытка
// Устанавливаем текущий каталог
Соединение.УстановитьТекущийКаталог(КаталогНаСервере);
// Отправляем файл
Соединение.Записать(ПутьКФайлуИсточник, ИмяФайлаНаСервере);
// Формируем ссылку для возврата пользователю
ПрямаяСсылка = "https://mysite.ru/uploads/" + ИмяФайлаНаСервере;
Сообщить("Файл успешно загружен. Ссылка: " + ПрямаяСсылка);
Исключение
Сообщить("Ошибка при передаче файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важно помнить, что объект FTPСоединение поддерживает работу в пассивном режиме, что критично при работе через брандмауэры. Однако у этого метода есть существенный недостаток, упомянутый в обсуждении: если злоумышленник получит доступ к коду 1С или настройкам, он сможет использовать данные FTP для управления файлами на сайте.
Более современным и безопасным способом является использование протокола 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
КонецЕсли;
КонецФункции
Этот подход значительно надежнее. Скрипт на стороне сайта может проверять расширение файла, его размер и авторизационный токен в заголовках запроса, что исключает несанкционированный доступ к другим папкам хостинга.
Если проект масштабируемый, проанализируем вариант использования S3-совместимых хранилищ (Yandex Cloud, AWS). Вместо того чтобы нагружать основной хостинг сайта файлами, 1С может отправлять их напрямую в "облако".
Преимущества данного подхода:
Для реализации в 1С можно использовать как прямое HTTPСоединение с формированием подписи запроса (AWS Signature V4), так и готовые библиотеки и внешние компоненты, упрощающие этот процесс.
Выясним причину возможных проблем при подборе имен файлов. Если мы загружаем файл с оригинальным именем order.pdf, велика вероятность, что его перепишет другой пользователь или злоумышленник сможет его "угадать".
Рекомендация: Всегда генерируйте уникальное имя файла на стороне 1С, используя УникальныйИдентификатор. Например:
НовоеИмя = Строка(Новый УникальныйИдентификатор()) + ".pdf";
Также стоит обратить внимание на отзывчивость интерфейса. Если файл большой, выполнение кода в основном потоке приведет к "зависанию" программы. Чтобы этого избежать, рассмотрим использование фоновых заданий. Процедуру отправки следует вызывать следующим образом:
ПараметрыЗадания = Новый Структура("ПутьКФайлу", ВыбранныйПуть);
ФоновыеЗадания.Выполнить("МодульИнтеграции.ОтправитьФайлНаСайт", ПараметрыЗадания);
Таким образом, пользователь сможет продолжать работу в 1С, а программа сообщит об успешной загрузке через систему оповещений после завершения фонового процесса.
Мы проанализировали три основных способа организации файлового обмена между 1С и сайтом. Для простых задач внутри защищенного контура допустимо использование FTP. Однако для публичных веб-ресурсов наиболее правильным решением будет использование HTTP POST запросов с обработкой на стороне сайта или переход на специализированные S3-хранилища. Выбор конкретного метода зависит от требований к безопасности и архитектуры вашего проекта.