Иногда случается так, что в базу встроен готовый внешний отчет, и бизнесу требуется результаты работы данного внешнего отчета передавать посредством веб-сервиса во внешние системы по запросу. В этом случае можно реализовать выгрузку отчета в формате 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");
                Ответ.УстановитьТелоИзСтроки(ТекстОшибки);
               
                Возврат Ответ;
КонецФункции



Вступайте в нашу телеграмм-группу Инфостарт
