gifts2017

Выводим печатную форму документа в браузер

Опубликовал Андрей Данилюк (DanilaDru) в раздел Программирование - Практика программирования

Подход к выводу печатной формы документа в браузер без входа в 1с

В рамках поддержки API курьерской службы появилась необходимость открывать печатную форму 1с-документа в браузере без входа в саму конфигурацию. Данная функция понадобилась для возможности печати акта приема-передачи на стороне Контрагента. 

Ниже приведу общий подход реализации данной задачи.

Исходными данными будет признак, по которому мы будем искать документ для печати, например, номер документа (number).

На стороне 1с нам понадобится создать web-сервис, который на вход будет принимать номер документа и отдавать двоичные данные pdf-файла. Возвращаемый тип: string (http://www.w3.org/2001/XMLSchema)
На стороне web-сервера сознаём php-файл, который будет выводить данные файла, полученные из 1с.

Код в 1с:

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


Код в php:

<?php
    header("Content-type: application/pdf; charset=UTF-8");
    $client = new SoapClient("http://api.server.com/XMLPackage.1cws?wsdl", array('login'=> 'user', 'password'=> 'password', "cache_wsdl"=> WSDL_CACHE_MEMORY, "trace" => 1,"exceptions" => 1));
    $result = $client->Print(array("number" => $_REQUEST["number"]));
    try {
        echo base64_decode($result->return);
        }
    catch (Exception $e) 
      {echo $e->getMessage();
       return;
      }
?>

http://danila.org.ua/vyivodim-pechatnuyu-formu-dokumenta-v-brauzer-iz-1s/

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Leon (lnnd) (1.00 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Tindir Mindir (tindir) 29.10.14 07:24
С веб-сервисами всегда встает вопрос с количеством лицензий. идея хороша, НО есть вопрос где размещать php код? На лендинг пейдеже или в определенном разделе сайта организации или курьер таскает с собой на флешке веб страничку с явно указанными логинами и паролем (что не очень в плане безопасности)?
2. Ruslan (flyer) 29.10.14 08:09
на вашем сайте много полезного материала. добавил в избранное. спасибо вам!
3. Евгений ' (WanGoff) 29.10.14 09:30
Как по мне, немного банальный пост.
Но, может я ошибаюсь и она кому-то поможет. Лайки покажут.
igo1; EliasShy; qwinter; Трактор; +4 Ответить 1
4. Андрей Данилюк (DanilaDru) 29.10.14 11:07
(3) WanGoff, спасибо за отзыв.
Наверное если бы я завернул это в подсистему, то было бы не так банально.
5. Андрей Данилюк (DanilaDru) 29.10.14 11:08
(2) flyer, Спасибо. По мере решения задач пополняю блог постами :)
6. Андрей Данилюк (DanilaDru) 29.10.14 11:14
(1) tindir, Я размещал php-файл в директориях рядом с публикацией веб-клиента.
Доступ предоставляется по API-ключу, который так же указывается параметром в веб-сервисе. На основании API-ключа происходит сопоставление с пользователем и далее отбирается доступная информация.
7. Евгений К (John_d) 29.10.14 11:21
Интересно. Хорошая идея.
8. Евгений Аганин (AganinEvgeniy) 29.10.14 11:26
Статья не плохая ... но я бы наверное ещё и отбор по периоду прикрутил. Не думаю, что у клиента нужно распечатывать данные за уже прошедшие годы...да и наверное и месяцы.
9. lefthander (lefthander) 29.10.14 11:41
Огромное спасибо. Надеюсь это поможет мне решить аналогичное задание.
10. Андрей Данилюк (DanilaDru) 29.10.14 11:48
(8) AganinEvgeniy, Спасибо. Это пример для демонстрации подхода. На рабочем варианте веб-сервис получает большее количество входных параметров.
11. John Smith (PiccaHut001) 29.10.14 15:15
может, когда-нибуть, пригодится.
12. Антон Антонов (monkbest) 30.10.14 07:26
а где пишется код 1С, в модуле чего?
13. Андрей Данилюк (DanilaDru) 30.10.14 07:43
(12) monkbest, print() это метод операции веб-сервиса. Пишется в модуле веб-сервиса.
14. Антон Антонов (monkbest) 30.10.14 08:39
(13) DanilaDru, блин ни разу не делал еще веб сервисов, потребности не было. Все хочу для самообучения попробовать, но никак не получается. Не попадается свежей законченной статьи, либо старые про 8.1/8.2 либо вот как эта. Очень часто читаю про них свежие статьи в ленте ИС, но вот как-то они все обгрызанные что ли. Из серединки контекста вырванные. Нет пошаговой инструкции от открытия конфигуратора, до запуска в браузере
15. Марина Семёнова (SemenovaMarinaV) 30.10.14 09:37
Идея хороша, но утопична
16. Андрей Данилюк (DanilaDru) 30.10.14 09:51
(15) SemenovaMarinaV, В чём утопичность?
17. Андрей Данилюк (DanilaDru) 30.10.14 09:52
(14) monkbest, я не ставил целью научить читателя писать веб-сервисы, извините.
18. Антон Антонов (monkbest) 30.10.14 10:28
(17) DanilaDru, да я понимаю, просто мысли в слух. Грубо говоря, чтобы повторить Ваш опыт, надо еще пяток статей прочитать сначала :)
19. lefthander (lefthander) 30.10.14 12:43
(18) Это направление поиска и первый шаг. Конечно готового решения на все случаи жизни не существует.
20. Антон Антонов (monkbest) 30.10.14 13:33
(19) lefthander, да мне не на все случаи, просто для саморазвития, понять суть механизмов. Как-то так случилось, что у заказчиков веб - не востребован, хотя во франче уже давно тружусь.
21. Марина Семёнова (SemenovaMarinaV) 13.11.14 16:37
Наверное очень полезно, когда нибудь пригодится
22. Natali Yu (crazy.admin91119) 18.12.14 17:09
Для кого то может быть очень полезная статья :)
для меня была интересна часть про 1С :-)
23. Mafoni (Mafoni) 12.01.15 15:45
А как насчет безопастности сего решения ?
24. Андрей Данилюк (DanilaDru) 12.01.15 17:58
(23) Mafoni, ограничиваете ролями доступ для пользователя, который указывается в SoapClient
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа