Добрый день коллеги.
Возникла вот такая потребность, вернуть ошибку от веб сервиса средствами 1с. Объясню на примере.
Допустим есть веб сервис который возвращает договор контрагента в формате .DOC, т.е. возвращает бинарные данные вордового документа. На входе эта функция ждет номер договора.
Т.е. Отправляем номер договора, на выходе получаем Word файл. Тут нужно обратить внимание именно на тип возвращаемого значения, он имеет тип base64binary. На выходе всегда ожидаем бинарные данные.
И вот теперь ситуация, мы передаем пустой код или код договора который не присутствует в базе и тут необходимо вернуть ошибку с текстом "Вы не можете передавать пустой код", или "Код договора отсутствует в системе".
В веб сервисах(не 1с) есть возможность отправить SoapFault в таком случае. А как поступить в случае с 1с?
(1) maguga, соапфаулт отправляется с помощью ВызватьИсключение, правда, к сожалению, текст будет немного более длинный - включать модуль и строку. К сожалению, 1с пока не реализовала полное управление этими данными.
(2) Я в таких случаях делал структуру где кроме результата были поля Об ошибке - флаг ошибки и описание ошибки или просто необязательное поле описание ошибки которое и анализировалось
(9) Serginio, можно не менять результат (его тип), можно использовать ВЫХОДНОЙ параметр. тогда часть, которая парсит результат (тег return) вообще не меняется, просто добавляется кусок, который будет парсить другой тег (тег выходного параметра)
(14) Было бы хорошо если бы в 1С была такая возможность, так как Вэб сервисом пользуются не только из 1С, а там такое исключение обрабатывается стандартно и можно получить значительно больше информации об ошибке. Я просто привел пример использования такого исключения на примере C#
(1) maguga, также можно сделать опциональный выходной параметр, его заполнять текстом/кодом/иным описанием ошибки, а сами двоичные данные передавать пустые
(3) Fragster, Понятно что можно, но когда функций пот три, пять десятков функции, и помимо необходимого функционала делать еще дополнительные параметры... Гонять лишние байты по сети, усложнять структуры, ради сообщения об ошибке я считаю лишним.
(5) maguga, ок, делаем универсально - на выходе base64Binary, где первый байт - код. грубо 0 - дальше идет файл, 1 - дальше идет текст ошибки. На получателе - смотришь что пришло в первом байте. 0 - отбрасываешь его и последующий массив байт обрабатываешь как файл, 1 - выводишь "Код договора отсутствует в системе" или что там еще.
Все решения имеют право на жизнь, но вот в нескольких языках сложновато будет получить побайтно бинарные данные(думаю к 1с это так же относится). Но все же чтоб не огородить огороды проще(да ИМХО правильнее) вызвать исключение и в нем указать ошибку.
А все же, как в 1с использовать "soap fault"?
У меня метод должен возвращать True или False, в случае False еще и описание ошибки, предложено сделать через soap fault ...
Так и не смог догадаться, как это реализовать... Если кто делал, подскажите пжста.
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.