Веб сервисы в 1с. Как вернуть ошибку?

1. maguga 19 24.06.15 10:10 Сейчас в теме
Добрый день коллеги.
Возникла вот такая потребность, вернуть ошибку от веб сервиса средствами 1с. Объясню на примере.

Допустим есть веб сервис который возвращает договор контрагента в формате .DOC, т.е. возвращает бинарные данные вордового документа. На входе эта функция ждет номер договора.

Т.е. Отправляем номер договора, на выходе получаем Word файл. Тут нужно обратить внимание именно на тип возвращаемого значения, он имеет тип base64binary. На выходе всегда ожидаем бинарные данные.

И вот теперь ситуация, мы передаем пустой код или код договора который не присутствует в базе и тут необходимо вернуть ошибку с текстом "Вы не можете передавать пустой код", или "Код договора отсутствует в системе".

В веб сервисах(не 1с) есть возможность отправить SoapFault в таком случае. А как поступить в случае с 1с?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Fragster 1140 24.06.15 10:26 Сейчас в теме
(1) maguga, соапфаулт отправляется с помощью ВызватьИсключение, правда, к сожалению, текст будет немного более длинный - включать модуль и строку. К сожалению, 1с пока не реализовала полное управление этими данными.
9. Serginio 940 24.06.15 15:58 Сейчас в теме
(2) Я в таких случаях делал структуру где кроме результата были поля Об ошибке - флаг ошибки и описание ошибки или просто необязательное поле описание ошибки которое и анализировалось
12. Fragster 1140 24.06.15 19:27 Сейчас в теме
(9) Serginio, можно не менять результат (его тип), можно использовать ВЫХОДНОЙ параметр. тогда часть, которая парсит результат (тег return) вообще не меняется, просто добавляется кусок, который будет парсить другой тег (тег выходного параметра)
13. Serginio 940 24.06.15 22:52 Сейчас в теме
(12) Ну это уже дело вкуса. Все равно нужно описывать протокол. Лучше конечно ВызватьИсключение с параметрами ошибки. Например SoapException

https://msdn.microsoft.com/ru-ru/library/system.web.services.protocols.soapexception(v=vs.110).aspx
14. maguga 19 25.06.15 10:26 Сейчас в теме
(13) Serginio, SoapException=ВызватьИсключение ?
15. Serginio 940 25.06.15 12:05 Сейчас в теме
(14) Было бы хорошо если бы в 1С была такая возможность, так как Вэб сервисом пользуются не только из 1С, а там такое исключение обрабатывается стандартно и можно получить значительно больше информации об ошибке. Я просто привел пример использования такого исключения на примере C#
3. Fragster 1140 24.06.15 10:27 Сейчас в теме
(1) maguga, также можно сделать опциональный выходной параметр, его заполнять текстом/кодом/иным описанием ошибки, а сами двоичные данные передавать пустые
5. maguga 19 24.06.15 10:43 Сейчас в теме
(3) Fragster, Понятно что можно, но когда функций пот три, пять десятков функции, и помимо необходимого функционала делать еще дополнительные параметры... Гонять лишние байты по сети, усложнять структуры, ради сообщения об ошибке я считаю лишним.


(4) nihfalck, Это в корне не верно.

Функция получитьWord(кодДоговора) вернула бинарные данные. Это наверное ворд или текст ошибки?

Функция ПолучитьКартинкуТовара(Высота,Ширина) Вернула картинку или текст?
6. nihfalck 24.06.15 12:54 Сейчас в теме
(5) maguga, ок, делаем универсально - на выходе base64Binary, где первый байт - код. грубо 0 - дальше идет файл, 1 - дальше идет текст ошибки. На получателе - смотришь что пришло в первом байте. 0 - отбрасываешь его и последующий массив байт обрабатываешь как файл, 1 - выводишь "Код договора отсутствует в системе" или что там еще.
7. Fragster 1140 24.06.15 15:03 Сейчас в теме
(6) nihfalck, это еще хуже, чем сделать опциональный выходной параметр.
8. nihfalck 24.06.15 15:08 Сейчас в теме
(7) Fragster, не спорю, но человек же не хочет
Гонять лишние байты по сети, усложнять структуры, ради сообщения об ошибке


по задаче ему нужно:
Тут нужно обратить внимание именно на тип возвращаемого значения, он имеет тип base64binary. На выходе всегда ожидаем бинарные данные.

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

на нет и суда нет)
4. nihfalck 24.06.15 10:28 Сейчас в теме
что мешает завернуть полученную строку в base64Binary и на получателе анализировать?
10. maguga 19 24.06.15 16:23 Сейчас в теме
Спасибо всем за комментарии.

Все решения имеют право на жизнь, но вот в нескольких языках сложновато будет получить побайтно бинарные данные(думаю к 1с это так же относится). Но все же чтоб не огородить огороды проще(да ИМХО правильнее) вызвать исключение и в нем указать ошибку.
11. and_sk 14 24.06.15 16:27 Сейчас в теме
я делаю тхт-секцию <error></error> в xdto
и туда пихаю все подряд
получатель естественно должен ее обработать
16. olbu 10.08.17 09:26 Сейчас в теме
А все же, как в 1с использовать "soap fault"?
У меня метод должен возвращать True или False, в случае False еще и описание ошибки, предложено сделать через soap fault ...
Так и не смог догадаться, как это реализовать... Если кто делал, подскажите пжста.
17. dmpas 418 10.08.17 09:33 Сейчас в теме
(16)
alse еще и описание ошибки, предложено сделать через soap fault ...
Так и не смог догадаться, как это реализовать... Если кто делал, подскажите пжста.


Либо результат, либо SOAP Fault - по стандарту другого не должно быть.

https://www.w3.org/TR/soap12-part1/#soapfault

When generating a fault, SOAP senders MUST NOT include additional element information items in the SOAP Body . A message whose Body contains a Fault plus additional element information items has no SOAP-defined semantics.
18. olbu 10.08.17 09:36 Сейчас в теме
(17)Спасибо за ответ, но еще больше запутался, а как мне реализовать "SOAP Fault"? из 1с, что то не могу пока нагуглить, не подскажете?
19. dmpas 418 10.08.17 09:38 Сейчас в теме
(18)
з 1с, что то не могу пока нагуглить, не подскаж


ВызватьИсключение генерит SoapFault. Но указать можно только текст ошибки, код ошибки не указать.
21. olbu 10.08.17 09:40 Сейчас в теме
(19) Т.е. при отработке метода, вместо "СериализаторXDTO.ЗаписатьXDTO(Ложь);" необходимо "ВызватьИсключение ..."? я правильно понял?
22. dmpas 418 10.08.17 09:41 Сейчас в теме
23. olbu 10.08.17 09:42 Сейчас в теме
(22)Спасибо! Буду пробовать.
20. dmpas 418 10.08.17 09:38 Сейчас в теме
(18)
Если нужно вернуть и False, и пояснение, то это не SoapFault, а нужно делать соответствующий тип ответа.
24. Gaster 26.07.22 16:49 Сейчас в теме
Так что, можно каким-то образом вернуть определённый код ошибки?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот