Имя: Пароль:
1C
1С v8
Ошибка при вызове 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
Называется справка. Плюс Желтые книги форумы и накопленный опыт
Ошибка? Это не ошибка, это системная функция.