|
Ошибка при вызове web-сервиса 1C 8.3 (Внутренняя ошибка. Ошибка инициализации б) | ☑ | ||
---|---|---|---|---|
0
badbob
31.05.13
✎
16:42
|
Всем привет. Пытаюсь сделать вэб-сервис на базе 1С, который возвращал бы заказ пользователя по идентификатору заказа. Это нужно для интеграции с сайтом, написанным на java.На свой запрос получаю вот такой ответ:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <soap:Fault> <faultcode>soap:Client</faultcode> <faultstring>Внутренняя ошибка. Ошибка инициализации библиотеки модулей</faultstring> <detail/> </soap:Fault> </soap:Body> </soap:Envelope> Где можно посмотреть, какая именно библиотека модулей не может быть инициализирована? Есть в 1С какие-нибудь журналы/логи, куда может попасть такая ошибка? Гугление почему-то не дало никаких результатов. |
|||
1
Asmody
31.05.13
✎
16:43
|
wsdl отдается?
|
|||
2
badbob
31.05.13
✎
17:40
|
Да, wsdl с сервера отдаётся. Кстати, тело модуля, который должен обрабатывать этот запрос, выглядит так:
Функция Получить(Код) Экспорт Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код) Тип = ФабрикаXDTO.Тип("http://v8.1c.ru/edi/edi_stnd", "ЗаказКлиента"); xdtoЗаказ = ФабрикаXDTO.Создать(Тип) # xdtoЗаказ = Заказ Возврат xdtoЗаказ КонецФункции Если переписать этот модуль так: Функция Получить(Код) Экспорт Возврат Документы.ЗаказПокупателя.НайтиПоНомеру(Код) КонецФункции то web-сервис сообщит, что обязательный выходной параметр не задан. (Или что-то вроде того...) |
|||
3
Jaap Vduul
31.05.13
✎
17:59
|
(2)
# xdtoЗаказ = Заказ Это что такое? |
|||
4
Serginio1
31.05.13
✎
18:04
|
Так ты возвращаешь тип.
СериализаторXDTO.ЗаписатьXDTO(Заказ.ПолучитьОбъект()); |
|||
5
badbob
31.05.13
✎
18:32
|
# xdtoЗаказ = Заказ
- это комментарий. Не исполняемый код. Serginio1, твой вариант не работает, выдаёт такую же ошибку. Однако, если написать так: Функция Получить(Код) Экспорт Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код); Возврат Заказ.ПолучитьОбъект(); КонецФункции то результат будет такой: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header/> <soap:Body> <soap:Fault> <soap:Code> <soap:Value>soap:Sender</soap:Value> </soap:Code> <soap:Reason> <soap:Text xml:lang="ru_RU">Неизвестная ошибка. {WebСервис.ДанныеЗаказа.Модуль(5)}: Ошибка при вызове метода контекста (ПолучитьОбъект) по причине: {WebСервис.ДанныеЗаказа.Модуль(5)}: Ошибка при вызове метода контекста (ПолучитьОбъект) по причине: Элемент не выбран!</soap:Text> </soap:Reason> </soap:Fault> </soap:Body> </soap:Envelope> Похоже, что 1С не может найти объект с кодом, который я передаю. Попробовал создать примитивный пример: Функция Получить(Код) Экспорт Возврат Документы.ЗаказПокупателя.СоздатьДокумент(); КонецФункции В ответ получил то с чего начал: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header/> <soap:Body> <soap:Fault> <soap:Code> <soap:Value>soap:Sender</soap:Value> </soap:Code> <soap:Reason> <soap:Text xml:lang="ru_RU">Обязательное возвращаемое значение не задано: http://gunanza.ru}:ДанныеЗаказаSoap12Binding:Получить()</soap:Text> </soap:Reason> </soap:Fault> </soap:Body> </soap:Envelope> |
|||
6
voinvostoka
31.05.13
✎
18:36
|
Функция Получить(Код) Экспорт
Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код) Запись = Новый ЗаписьXML; Запись.УстановитьСтроку("UTF-8"); Возврат xdtoЗаказ КонецФункции |
|||
7
voinvostoka
31.05.13
✎
18:47
|
Функция Получить(Код) Экспорт
Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код) если не Заказ = Неопределено Тогда Запись = Новый ЗаписьXML; Запись.УстановитьСтроку("UTF-8"); Запись.ЗаписатьНачалоЭлемента("NomerDok"); Запись.ЗаписатьТекст(СокрЛП(Заказ.Номер)); Запись.ЗаписатьКонецЭлемента(); СтрокаХМЛ = Запись.Закрыть(); Иначе Запись = Новый ЗаписьXML; Запись.УстановитьСтроку("UTF-8"); Запись.ЗаписатьНачалоЭлемента("NomerDok"); Запись.ЗаписатьТекст("ERROR"); Запись.ЗаписатьКонецЭлемента(); СтрокаХМЛ = Запись.Закрыть(); КонецЕсли; Возврат СтрокаХМЛ; КонецФункции Попробуй получи просто код документа в виде строки |
|||
8
Asmody
31.05.13
✎
19:12
|
во-первых, сомневаюсь, что во внешнем приложении нужен заказ целиком. правильнее описать в пакете XDTO нужный XDTO-объект, и формировать и возвращать его.
во-вторых, необходимо предусмотреть что-то, что будет возвращать твой метод при отсутствии заказа. |
|||
9
voinvostoka
31.05.13
✎
19:18
|
XDTO-объект навряд ли поймет Java
|
|||
10
Serginio1
31.05.13
✎
21:17
|
На самом деле СериализаторXDTO.ЗаписатьXDTO(Заказ.ПолучитьОбъект());
Возвращает XDTO объект. Только в описании возврата функцией должен быть тип DocumentObject.ЗаказПокупателя (http://v8.1c.ru/8.1/data/enterprise/current-config) Правда нужно добовить в пакет сервиса http://v8.1c.ru/8.1/data/enterprise/current-config |
|||
11
Asmody
31.05.13
✎
21:38
|
(9) XDTO — это лишь одинесовская обертка XML Schema. Java поймет
|
|||
12
badbob
02.06.13
✎
11:22
|
Serginio1, ты абсолютно прав. После добавления http://v8.1c.ru/8.1/data/enterprise/current-config в список пакетов модуля код заработал:
Функция Получить(Код) Экспорт Возврат СериализаторXDTO.ЗаписатьXDTO(Документы.ЗаказПокупателя.СоздатьДокумент()); КонецФункции Возвращается, конечно, пустой заказ покупателя. Но это уже хоть что-то. Однако, добавив одну строчку: Функция Получить(Код) Экспорт Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код) Возврат СериализаторXDTO.ЗаписатьXDTO(Документы.ЗаказПокупателя.СоздатьДокумент()); КонецФункции получаем старую ошибку: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <soap:Fault> <faultcode>soap:Client</faultcode> <faultstring>Внутренняя ошибка. Ошибка инициализации библиотеки модулей</faultstring> <detail/> </soap:Fault> </soap:Body> </soap:Envelope> |
|||
13
Serginio1
02.06.13
✎
12:11
|
Кстати новую версию поставил?
Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру(Код) Возврат СериализаторXDTO.ЗаписатьXDTOЗаказ.ПолучитьОбъект()); при правильном коде. Уникальность номера непериодическая? |
|||
14
badbob
02.06.13
✎
14:37
|
Serginio1, не понял вопроса. Новую версию чего нужно было поставить? Код, который передаётся в функцию Получить() однозначно уникальный - другого заказа покупателя с таким идентификатором нет.
Есть ли где-нибудь у 1С возможность посмотреть, что это за "Внутренняя ошибка. Ошибка инициализации библиотеки модулей"? Какая-нибудь аналогия stacktrace? |
|||
15
badbob
02.06.13
✎
14:56
|
Вообще, я понял, что на самом деле использовал вместо кода "Номер". То есть, "Номер" однозначно уникальный в систем - на сколько я понимаю, это первичный ключ. Ещё интересная особенность - даже если поставить "#" перед вызовом Документы.ЗаказПокупателя.НайтиПоНомеру(Номер) - всё-равно возникает ошибка "Внутренняя ошибка...".
|
|||
16
Dethmont
02.06.13
✎
15:21
|
(15) # - это не комментарий!
|
|||
17
zmaximka
02.06.13
✎
15:24
|
Да не находит у тебя заказ по номеру
|
|||
18
Serginio1
02.06.13
✎
15:38
|
(14) Новая версия 8.3.3.
НайтиПоНомеру использует 2 параметра номер и дату документа. Бывают без периодичности в течении года итд. Уникальный это УникальныйИдентификатор() Заказ = Документы.ЗаказПокупателя.ПолучитьСсылку(УникальныйИдентификатор) |
|||
19
Serginio1
02.06.13
✎
15:43
|
Да и поставт проверку в параметры проверка на все клиенты и серверы
|
|||
20
Serginio1
02.06.13
✎
15:45
|
И прежде чем запускать сделай проверку из 1С.
Лучше все методы выносить в отдельный модуль, что бы тестировать из толстого клиента |
|||
21
badbob
02.06.13
✎
16:07
|
Serginio1, ёптить, а где можно прочитать вообще обо всех функциях/методах объектов 1С? Есть какая-то документация по API типа MSDN?
Проблема "Внутренняя ошибка. Ошибка инициализации библиотеки модулей" была связана с тем, что я не ставил точку с запятой в конце первой строки. Я не ожидал, что компилятор не сругнётся... Спасибо большое тебе за помощь. Уверен, что без твоих советов, я бы пропал. |
|||
22
Serginio1
02.06.13
✎
16:36
|
Называется справка. Плюс Желтые книги форумы и накопленный опыт
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |