Передача данных, упакованных в объект ХранилищеЗначения, через HTTP-сервис часто вызывает вопросы у разработчиков, так как этот тип данных является внутренним для платформы 1С. Рассмотрим, как правильно организовать передачу больших XML-файлов или иных двоичных данных, чтобы обеспечить высокую производительность и совместимость.
Важно помнить, что ХранилищеЗначения — это контейнер для хранения данных в СУБД. Напрямую передать его через HTTP невозможно, так как клиентское приложение (или внешний веб-сервис) не сможет интерпретировать этот внутренний формат 1С. Чтобы успешно передать данные, нам необходимо извлечь содержимое из хранилища и преобразовать его в поток двоичных данных или сериализовать в понятный формат.
Наиболее эффективным способом передачи больших объемов информации является работа с ДвоичныеДанные. Вместо того чтобы пытаться преобразовывать данные в строку Base64 (что увеличивает размер файла примерно на 30%), мы используем прямой поток данных. Это позволяет экономить оперативную память и снижает нагрузку на процессор при обработке запроса.
Для реализации отправки данных мы создаем метод HTTP-сервиса, который формирует ответ с телом, заполненным двоичными данными. Рассмотрим пример реализации:
Функция ОтдатьФайл(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
// Получаем двоичные данные из хранилища или файла
Данные = Новый ДвоичныеДанные(ПутьКФайлу);
Ответ.УстановитьТелоИзДвоичныхДанных(Данные);
// Устанавливаем заголовки для корректной обработки приемником
Ответ.Заголовки.Вставить(\"Content-Type\", \"application/octet-stream\");
Возврат Ответ;
КонецФункции
Если ваша задача — передать большой XML-файл, сжатый внутри ХранилищеЗначения, мы рекомендуем следовать алгоритму, обеспечивающему максимальную скорость:
Gzip). Использование метода УстановитьТелоИзДвоичныхДанных в связке с правильно настроенными HTTP-заголовками Content-Encoding: gzip позволит принимающей стороне автоматически распознать сжатый поток.Строка или ДвоичныеДанные целиком. Используйте методы потокового чтения.Если принимающей стороной является не 1С, а стороннее приложение (на PHP, Python, Java), следуйте этим правилам:
ХранилищеЗначения как есть. Извлекайте из него исходные двоичные данные.Base64 может быть удобен только для небольших текстовых XML-файлов. Для всего остального используйте сырой бинарный поток (application/octet-stream).Deflate или Gzip, обязательно проинформируйте об этом через заголовки HTTP-ответа.Подводя итог, можно сказать, что передача данных из хранилища через HTTP-сервис сводится к трем шагам: извлечение данных, их сжатие (если необходимо) и передача через УстановитьТелоИзДвоичныхДанных. Этот подход обеспечивает максимальную производительность платформы 1С и позволяет избежать проблем с кодированием символов и нехваткой оперативной памяти.