Иногда случается так, что в базу встроен готовый внешний отчет, и бизнесу требуется результаты работы данного внешнего отчета передавать посредством веб-сервиса во внешние системы по запросу. В этом случае можно реализовать выгрузку отчета в формате PDF при запросе через HTTP-сервис.
- В данной статье не будет рассматриваться вопрос развертывания веб-сервера под веб-сервисы 1С. Считаем, что он уже существует и настроен.
- В данной статье не будет рассматриваться вопрос написания отчета на СКД. Считаем, что он уже существует.
- В приведенной реализации HTTP-сервиса используется метод GET.
Функция ВебСервис(Запрос)
//здесь могут быть получены параметры
ЗначениеПараметраЗапроса = Запрос.ПараметрыURL.Получить("ИмяПараметра");
//здесь могут быть выполнены предварительные процедуры обработки данных
//получаем ссылку на отчет
ОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("НаименованиеОтчетаВСправочнике",Истина);
//сохраняем файл отчета на диск для дальнейшего использования
ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = ОтчетСсылка.ХранилищеОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
//создаем объект отчета из сохраненного файла
ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяФайла,Ложь);
//получаем схему компоновки данных и компоновщик настроек для дальнейшей работы
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
//загрузим настройки в компоновщик по названию варианта
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Найти("ИмяВариантаНастроек").Настройки);
//получаем настройки компоновки данных для дальнейшей работы
Настройки = КомпоновщикНастроек.Настройки;
//установим значение параметра(ов) ИмяПараметра
ЗначениеПараметра = Неопределено;
ПараметрСКД = Настройки.ПараметрыДанных.Элементы.Найти("ИмяПараметра");
ПараметрСКД.Значение = ЗначениеПараметра;
ПараметрСКД.Использование = Истина;
//установим значение отбора(ов) ИмяДоступногоЭлементаОтбора
ЗначениеОтбора = Неопределено;
ОтборСКД = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСКД.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборСКД.ЛевоеЗначение = Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("ИмяДоступногоЭлементаОтбора ").Поле;
ОтборСКД.ПравоеЗначение = ЗначениеОтбора;
ОтборСКД.Использование = Истина;
ТабДокумент = Новый ТабличныйДокумент;
//используем метод СкомпоноватьРезультат, чтобы во внешнем отчете могла быть вызвана процедура ПриКомпоновкеРезультата, если в ней производятся дополнительные действия
ОтчетОбъект.СкомпоноватьРезультат(ТабДокумент,Новый ДанныеРасшифровкиКомпоновкиДанных);
//если в результате не сформирован ТабличныйДокумент, то веб-сервис возвращает ошибку
Если НЕ ТипЗнч(ТабДокумент)=Тип("ТабличныйДокумент") Тогда
Возврат ПолучитьОтветОбОшибке("Не удалось сформировать документ");
КонецЕсли;
//записываем документ на диск и получаем двоичные данные для отправки
ЦелевоеИмяФайла = "Документ "+(Новый УникальныйИдентификатор)+".pdf";
ПутьКФайлу = КаталогВременныхФайлов()+ЦелевоеИмяФайла;
ТабДокумент.Записать(ПутьКФайлу,ТипФайлаТабличногоДокумента.PDF);
ДвДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
Ответ.Заголовки.Вставить("Content-Length", ДвДанные.Размер());
Ответ.Заголовки.Вставить("Content-Disposition", "inline; filename=""" + ЦелевоеИмяФайла+"""");
Ответ.УстановитьТелоИзДвоичныхДанных(ДвДанные);
Возврат Ответ;
КонецФункции
Отдельно указываю код функции ПолучитьОтветОбОшибке
Функция ПолучитьОтветОбОшибке (ТекстОшибки)
Ответ = Новый HTTPСервисОтвет(400);
Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ТекстОшибки);
Возврат Ответ;
КонецФункции