helpf.pro
Регистрация
 +2 
Распечатать

Отдаем PDF файл через Web-сервис

В инфраструктурах, активно использующих возможности web-сервисов 1С, нередко возникает потребность получения не только массивов данных из базы, но и различных файлов. Сам файл через веб-сервис так просто не передашь, но на его основе можно создать объект ДвоичныеДанные, который, в свою очередь, уже сериализуется в base64Binary. После такой операции наш веб-сервис без проблем передает данные и получателю остается только выполнить на своей стороне обратное преобразование и сохранить файл.

В качестве примера такого механизма я буду создавать в 1С счет на оплату на основании переданных через сервис ИНН контрагента и суммы, и возвращать PDF печатной формы. На этот раз, кроме примеров кода, дополнительно был записан скринкаст разработки.

Для начала создадим в пустой конфигурации справочник "Контрагенты" с реквизитом "ИНН" и документ "Счет" с реквизитами "Контрагент" и "СуммаДокумента".

Теперь добавим пакет XDTO "test_ws"с пространством имен "http://www.test-ws.org", в котором опишем тип объекта "File". Он будет содержать свойства:

binaryData - (base64Binary (http://www.w3.org/2001/XMLSchema));

ext - string (http://www.w3.org/2001/XMLSchema);

message - string (http://www.w3.org/2001/XMLSchema).

Создаем web-сервис "DocWork", пространство имен "http://www.test-ws.org", выбираем пакет "http://www.test-ws.org". Добавляем в сервис операцию "CreateBill", возвращаемый тип File (http://www.test-ws.org), входные параметры:

INN - string (http://www.w3.org/2001/XMLSchema);

Summ - decimal (http://www.w3.org/2001/XMLSchema).

Код web-сервиса:

Код 1C v 8.3
 Функция CreateBill(INN, Summ)

typeFile = ФабрикаXDTO.Тип("<a href="http://www.test-ws.org" ,"="">http://www.test-ws.org",</a> "File");

текФайл = ФабрикаXDTO.Создать(typeFile);
текФайл.binaryData = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("<a href="http://www.w3.org/2001/XMLSchema" ,"="">http://www.w3.org/2001/XMLSchema",</a> "base64Binary"));
текФайл.ext = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("<a href="http://www.w3.org/2001/XMLSchema" ,"="">http://www.w3.org/2001/XMLSchema",</a> "string"));

Если ПустаяСтрока(INN) ИЛИ Summ = 0 Тогда
текФайл.message = "empty data";
Возврат текФайл;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";


Запрос.УстановитьПараметр("ИНН", INN);


Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
текФайл.message = "client not found";
Возврат текФайл;
КонецЕсли;

СчетДок = Документы.Счет.СоздатьДокумент();
СчетДок.Дата = ТекущаяДата();
СчетДок.Контрагент = Результат[0].Ссылка;
СчетДок.СуммаДокумента = Summ;
СчетДок.Записать();

ТабДок = Новый ТабличныйДокумент;
Документы.Счет.Печать(ТабДок, СчетДок.Ссылка);

ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

текФайл.binaryData = ДанныеФайла;
текФайл.message = "ok";
текФайл.ext = "pdf";

Возврат текФайл;
КонецФункции<br>

Тестовая обработка

Код 1C v 8.3
 &НаСервере
Функция ПолучитьПДФ()


ОпределениеВС = Новый WSОпределения("<a href="http://localhost/testWS/ws/ws1.1cws?wsdl" )"="">http://localhost/testWS/ws/ws1.1cws?wsdl")</a>;
СсылкаВС = Новый WSПрокси(ОпределениеВС, "<a href="http://www.test-ws.org" ,"="">http://www.test-ws.org",</a> "DocWork", "DocWorkSoap");

ФайлСервис = СсылкаВС.CreateBill(ИНН, Сумма);

Возврат ФайлСервис.binaryData;


КонецФункции// ПолучитьПДФ()




&НаКлиенте
Процедура СоздатьСчет(Команда)

мДанные = ПолучитьПДФ();
Если мДанные = Неопределено Тогда
Возврат;
КонецЕсли;
мДанные.Записать("c:\temp_bil.pdf");

КонецПроцедуры<br>

А так же обещанное видео, как есть, без купюр )

Источник

Разместил:   Версии: | 8.2 УП | 8.3 | Видео |  Дата:   Прочитано: 34161
 +2 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 52
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
Посмотреть все результаты поиска похожих
Комментарии
alexkoso
02.11.2014 20:13Комментарий: 1
alexkoso

Спасибо за статью. Но все таки выгружать результат запроса в ТЗ, (к тому же еще и с результатом в 1 строку) не комильфо. Лучше бы сначала проверку на Пустой() и потом Выбрать() и Следующий()

Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.