Наткнулся на публикацию Табличный документ через HTTP сервис и решил поделиться своим опытом.
У организации есть сайт, на этом сайте у клиентов есть личный кабинет. В нём отображаются данные из 1С об их заказах. Необходимо было добавить ссылку (URL), нажав на которую пользователь смог бы скачать печатную форму своих заказов в формате PDF. Для опытного разработчика 1С, в принципе, задача не представляет особой сложности, но, может, эта статья поможет начинающим программистам или тем, кто только осваивает HTTP-сервисы.
Итак, приступим к реализации. В качестве примера будем использовать конфигурацию "Управление торговлей 11" и возвращать печатную форму документа "Заказ клиента".
Нам необходим HTTP-сервис, который отдаст клиенту печатную форму документа. Назовём этот сервис, например, ПередачаДокументов, в качестве корневого URL используем значение GetDocuments. Также потребуется шаблон URL, назовём его Download. Входящим параметром будет являться уникальный идентификатор документа, печатную форму которого необходимо получить. Итоговый URL для скачивания будет иметь следующий вид: http://<адрес_базы_1с>/hs/GetDocuments/Download/<УникальныйИдентификатор>.
Создадим HTTP-сервис:
Добавим шаблон URL:
В созданный шаблон добавим HTTP-метод GET:
И реализуем обработчик этого метода:
Функция ПолучитьПечатнуюФормуGET(Запрос)
Попытка
// Получим переданный в HTTP-запросе идентификатор документа.
Идентификатор = Новый УникальныйИдентификатор(Запрос.ПараметрыURL["Идентификатор"]);
Исключение
// Полученный параметр не смогли преобразовать в тип "УникальныйИдентификатор".
HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - Bad Request
HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Передан неверный идентификатор'"));
Возврат HTTPОтвет;
КонецПопытки;
// Найдём документ по полученному идентификатору.
ДокументСсылка = Документы.ЗаказКлиента.ПолучитьСсылку(Идентификатор);
Если ДокументСсылка.ПолучитьОбъект() = Неопределено Тогда
// Документ с таким уникальным идентификатором не существует.
HTTPОтвет = Новый HTTPСервисОтвет(404); // 404 - Not Found
HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Документ не найден'"));
Возврат HTTPОтвет;
КонецЕсли;
#Область ФормированиеПечатнойФормыДокумента
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ДокументСсылка);
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
ОбъектыПечати = Новый Структура;
ПараметрыПечати = Неопределено;
// Вызов типовой процедуры печати документа.
ТабличныйДокумент = Обработки.ПечатьЗаказовНаТоварыУслуги.СформироватьПечатнуюФормуЗаказаКлиента(
СтруктураТипов, ОбъектыПечати, ПараметрыПечати);
// Запишем табличный документ в поток в памяти в формате PDF.
Поток = Новый ПотокВПамяти;
ТабличныйДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
// Получим двоичные данные для отправки клиенту
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
#КонецОбласти
#Область ОтправкаОтветаКлиенту
// Сформируем имя файла, с которым печатная форма будет загружена у клиента.
ИмяФайла = Строка(ДокументСсылка) + ".pdf";
// Кодируем строку URL, чтобы избежать проблем с русскими буквами и другими символами (например, пробел).
ИмяФайла = КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.КодировкаURL);
// Создадим ответ.
HTTPОтвет = Новый HTTPСервисОтвет(200); // 200 - OK
// Установим заголовки.
HTTPОтвет.Заголовки.Вставить("Content-Type", "application/pdf"); // Чтобы браузер знал, что это PDF
HTTPОтвет.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + ИмяФайла + """");
// Телом ответа являются двоичные данные печатной формы.
HTTPОтвет.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
// И, наконец, вернём ответ клиенту.
Возврат HTTPОтвет;
#КонецОбласти
КонецФункции
В коде постарался максимально доступно описать выполняемые действия комментариями. Резюмируем, что делает данный обработчик:
- производится поиск документа по переданному уникальному идентификатору;
- вызывается стандартная процедура печати документа (аналогично тому, как если бы пользователь нажал кнопку "Печать" в 1С), результатом является табличный документ;
- табличный документ записывается в нужном формате (при этом используется поток в памяти, чтобы избежать операций с временными файлами);
- формируется ответ.
Таким образом, когда клиент в личном кабинете нажимает на ссылку для скачивания печатной формы, его браузер производит загрузку файла из 1С. В каталоге загрузок у клиента появится файл вида "Заказ клиента №00001 от 03.08.2019.pdf".