Разберем актуальную задачу: как организовать облачный обмен файлами на базе 1С, чтобы пользователь мог просто нажать на ссылку в браузере и получить предложение «Сохранить файл как...». Часто стандартных веб-сервисов (SOAP) для этого недостаточно, так как они ориентированы на программное взаимодействие, а не на прямую работу с пользователем через адресную строку браузера.
Первоначальная идея использовать веб-сервисы (Web Services) для отдачи файлов в браузер не совсем удобна. Веб-сервисы 1С требуют формирования XML-конвертов и специфических заголовков, что делает невозможным простой ввод URL в браузере. Проанализируем более эффективный инструмент — HTTP-сервисы.
HTTP-сервисы позволяют нам гибко управлять заголовками HTTP-ответа и передавать данные напрямую. Для реализации задачи нам потребуется создать в конфигурации новый HTTP-сервис, определить для него Шаблон URL (например, /getfile/{ID}) и метод GET.
Рассмотрим пример кода, который позволяет найти файл в базе (например, в справочнике Файлы) и отдать его пользователю. Основной секрет здесь кроется в правильной установке HTTP-заголовков.
Функция ФайлыGetFile(Запрос)
// Получаем идентификатор из параметров URL
КодФайла = Запрос.ПараметрыURL.Получить("ID");
// Ищем ссылку на файл в справочнике
ФайлСсылка = Справочники.Файлы.НайтиПоКоду(КодФайла);
Если ФайлСсылка.Пустая() Тогда
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
// Создаем ответ с кодом 200 (ОК)
Ответ = Новый HTTPСервисОтвет(200);
// Устанавливаем заголовок Content-Disposition, чтобы браузер понял: это файл для скачивания
Ответ.Заголовки.Вставить("Content-Disposition", СтрШаблон("attachment; filename=""%1""", ФайлСсылка.Наименование));
// Указываем тип контента как поток данных
Ответ.Заголовки.Вставить("Content-Type", "application/octet-stream");
// Получаем двоичные данные файла и помещаем их в тело ответа
ДвоичныеДанные = РаботаСФайламиВызовСервера.ПолучитьДвоичныеДанныеФайла(ФайлСсылка);
Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
Возврат Ответ;
КонецФункции
Метод УстановитьТелоИзДвоичныхДанных, представленный выше, имеет существенный недостаток: 1С сначала полностью загружает файл в оперативную память сервера, а затем передает его HTTP-сервису. Если файл весит несколько гигабайт, это может привести к критической нехватке памяти (Memory Overflow) и падению рабочего процесса rphost.
Проанализируем более профессиональный подход. Вместо загрузки в память рекомендуется использовать метод УстановитьТелоИзФайла(). В этом случае платформа 1С передает данные потоком непосредственно с диска, что практически не нагружает RAM сервера. Это особенно важно для конфигураций типа 1С:Документооборот, где файлы могут быть очень объемными.
Использование простого ID или кода справочника в ссылке небезопасно. Злоумышленник может написать простой скрипт, который будет перебирать числа и скачивать все конфиденциальные файлы вашей организации. Выясним, как этого избежать:
УникальныйКлючДоступа (тип Строка) и заполняйте его длинным GUID или хешем при создании публичной ссылки.ДатаИстеченияСсылки. В коде HTTP-сервиса проверяйте текущую дату. Если срок вышел, возвращайте ошибку 410 Gone.В примере использован универсальный тип application/octet-stream. Он заставляет браузер всегда скачивать файл. Однако, если мы хотим, чтобы PDF или изображения открывались прямо в окне браузера для предварительного просмотра, нам нужно динамически определять Content-Type.
Рассмотрим ситуацию: если расширение файла ".pdf", установите заголовок application/pdf. Если это картинка — image/jpeg. В этом случае поведение браузера будет более предсказуемым и удобным для пользователя.
Проанализируем проблему именования файлов. При использовании русских букв в заголовке Content-Disposition некоторые браузеры могут отображать "кракозябры" вместо нормального имени файла. Для корректной работы рекомендуется использовать кодирование UTF-8 и формат filename*=UTF-8''.
Также важно помнить о нагрузке. Если ваш сервис станет популярным, передача файлов через rphost станет "бутылочным горлышком". В высоконагруженных системах программисты применяют технику X-Accel-Redirect (для Nginx) или X-Sendfile (для Apache). Суть в том, что 1С только проверяет права доступа, а саму "тяжелую" работу по передаче байтов делегирует веб-серверу. Это позволяет освободить лицензии и ресурсы 1С для работы пользователей.
Напоследок отметим, что если ваша цель — полноценная работа с файлами как в облачном хранилище, стоит рассмотреть встроенную поддержку WebDAV. В 1С:Документооборот этот механизм уже реализован. При публикации базы на веб-сервере можно включить поддержку WebDAV, и тогда файлы 1С можно будет подключать как обычный сетевой диск в Windows или macOS без написания дополнительного кода.