Ошибка при вызове метода контекста прочитатьxdto

   PsyTech

20.07.15 — 11:46

Всем привет!

При обращении к методу сервиса 1с из 1с ошибка:

«Ошибка SOAP сервера:  Неизвестная ошибка. {WebСервис.NumerationSF.Модуль(7)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)

по причине:

{WebСервис.NumerationSF.Модуль(7)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)

по причине:

Несоответствие типов (параметр номер ‘1’)»

Обращаюсь вот так:

    Определения = Новый WSОпределения(«ссылка на сервис»);

    Прокси = Новый WSПрокси(Определения, «http://www.w3.org/2001/XMLSchema»;, «NumerationSF», «NumerationSFSoap»);

    
    WSПараметр = СериализаторXDTO.ЗаписатьXDTO(СтрокаXML);

    
    Ответ = Прокси.GetNumberSF(WSПараметр);

из SOAPUI тот-же запрос работает. В чем ошибка?

   PsyTech

1 — 20.07.15 — 11:47

Прокси тут лишний

   PsyTech

2 — 20.07.15 — 11:50

тип параметра anyType

   Остап Сулейманович

3 — 20.07.15 — 11:51

(0) Нужно смотреть в модуле вот этого вот : «NumerationSF» в строке (7).

Скорее всего неправильно с точки зрения сервиса выглядит содержимое вот этого вот : «СтрокаXML».

   PsyTech

4 — 20.07.15 — 11:57

(3) А при запросе из soapui этот же запрос срабатывает…

   Остап Сулейманович

5 — 20.07.15 — 11:58

(4) Ну так сравни «СтрокаXML» в 1С и тоже самое в soapui.

   PsyTech

6 — 20.07.15 — 12:05

(5) в soapui обертка только есть стандартно. Не мешала никогда.

почему-то на тип ругается: «Несоответствие типов (параметр номер ‘1’)»

   Остап Сулейманович

7 — 20.07.15 — 12:08

(6) «в soapui обертка только есть стандартно.» Это как понять? Метод вызывается вообще без параметра?

   Serginio1

8 — 20.07.15 — 12:12

Сразу несколько вопросов

NumerationSF и пространство имен http://www.w3.org/2001/XMLSchema

Если хочешь получить объект XDTO из строки то

ЧтениеXML= новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(СтрокаXML);

    ЧтениеXML.ПерейтиКСодержимому();

    WSПараметр =Прокси.Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));

   Serginio1

9 — 20.07.15 — 12:13

Фабрика=Прокси.ФабрикаXDTO;

WSПараметр =Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));

   PsyTech

10 — 20.07.15 — 12:23

(8) Ошибка преобразования данных XDTO:

НачалоСвойства: {http://www.w3.org/2001/XMLSchema}anyType    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

   PsyTech

11 — 20.07.15 — 12:25

В базе сервиса тип параметра «string», а при создании ws-ссылки «anyType»

   Serginio1

12 — 20.07.15 — 12:27

(0)

используй динамическое подключение если не знаешь какое пространство имен используешь

ОпределениеТ=Новый WSОпределения(«http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl»;);

    WSСервис=ОпределениеТ.Сервисы[0];

    ПроксиWS=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);

    
    
    ПроксиWS.Пользователь = «ХХХ»;

    ПроксиWS.Пароль = «УУУУ»;

    ПроксиWS.ВызватьКакойтоМетод();

   PsyTech

13 — 20.07.15 — 12:34

Ошибка преобразования данных XDTO:

   PsyTech

14 — 20.07.15 — 12:36

в браузере string.

Не понимаю, почему anyType у меня

   PsyTech

15 — 20.07.15 — 12:45

(8)Ошибка преобразования данных XDTO:

НачалоСвойства: {http://www.w3.org/2001/XMLSchema}anyType    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: Body    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

   PsyTech

16 — 20.07.15 — 13:02

Определения = Новый WSОпределения(«»);

    Прокси = Новый WSПрокси(Определения, «http://www.w3.org/2001/XMLSchema»;, «NumerationSF», «NumerationSFSoap»);

    Фабрика=Прокси.ФабрикаXDTO;

    
    ЧтениеXML= новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(СтрокаXML);

    ЧтениеXML.ПерейтиКСодержимому();

    ТипWSПараметра = Прокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»;, «string»);

    
    WSПараметр =Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипWSПараметра);        

    
    Ответ = Прокси.GetNumberSF(WSПараметр);

{Форма.Форма.Форма(67)}: Ошибка при вызове метода контекста (ПрочитатьXML)

    WSПараметр =Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипWSПараметра);        

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: Body    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

   PsyTech

17 — 20.07.15 — 13:04

откуда anyType, если в браузере и в конфе сервиса string?

И что с этим делать?

   cw014

18 — 20.07.15 — 13:13

Если string, тогда зачем ты туда пихаешь ОбъектXDTO? Пихай стринг

   cw014

19 — 20.07.15 — 13:14

Определения = Новый WSОпределения(«ссылка на сервис»);

    Прокси = Новый WSПрокси(Определения, «http://www.w3.org/2001/XMLSchema»;;, «NumerationSF», «NumerationSFSoap»);

    
    //Это тут не нужно

    //WSПараметр = СериализаторXDTO.ЗаписатьXDTO(СтрокаXML);

    
    //Ответ = Прокси.GetNumberSF(WSПараметр);

    Ответ = Прокси.GetNumberSF(СтрокаXML);

    //Если взлетит — с тебя 500 р

   Serginio1

20 — 20.07.15 — 13:42

(17) Внимательно посмотри на 12. И посмотри какое пространство имен у WSСервис.URIПространстваИмен

   PsyTech

21 — 20.07.15 — 14:13

(20) WSСервис.URIПространстваИмен = «http://www.w3.org/2001/XMLSchema»;

   efim16rus

22 — 20.07.15 — 14:17

«СтрокаXML» у тебя какой тип имеет?

   PsyTech

23 — 20.07.15 — 14:18

(19)

{Форма.Форма.Форма(103)}: Ошибка при вызове метода контекста (GetNumberSF)

    Ответ = Прокси.GetNumberSF(СтрокаXML);    

по причине:

Несоответствие типов (параметр номер ‘1’)

   PsyTech

24 — 20.07.15 — 14:19

(22) Строка

   efim16rus

25 — 20.07.15 — 14:22

ТипWSПараметра = Прокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»;;, «string»);    

Парам                    = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);

    ВидДокумента.Key                = «Название_параметра»;

    ВидДокумента.Value                = СтрокаXML;

    ВидДокумента.ValueType            = «string»;

   efim16rus

26 — 20.07.15 — 14:22

ТипWSПараметра = Прокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»;;;, «string»);    

Парам                    = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);

    Парам.Key                = «Название_параметра»;

    Парам.Value                = СтрокаXML;

    Парам.ValueType            = «string»;

   efim16rus

27 — 20.07.15 — 14:23

Ответ = Прокси.GetNumberSF(Парам);

   efim16rus

28 — 20.07.15 — 14:23

Попробуй так

   Serginio1

29 — 20.07.15 — 14:41

Вообще то http://www.w3.org/2001/XMLSchema это стандартное пространство имен уже зашитое.

А кто задал такое имя пространства имен? Если это сервис 1С

   Serginio1

30 — 20.07.15 — 14:46

Ты бы хоть показал описание WSDL и типы используемые GetNumberSF

   Serginio1

31 — 20.07.15 — 14:46

Или выложи WSDL

   PsyTech

32 — 20.07.15 — 14:49

(28) Параметр = неопределено

   PsyTech

33 — 20.07.15 — 14:50

(30) тип 1 — string

   PsyTech

34 — 20.07.15 — 14:52

(30) вот фрагмент описания:

<definitions xmlns=»http://schemas.xmlsoap.org/wsdl/»; xmlns:soap12bind=»http://schemas.xmlsoap.org/wsdl/soap12/»; xmlns:soapbind=»http://schemas.xmlsoap.org/wsdl/soap/»; xmlns:tns=»http://www.w3.org/2001/XMLSchema»; xmlns:xsd=»http://www.w3.org/2001/XMLSchema»; xmlns:xsd1=»http://www.w3.org/2001/XMLSchema»; name=»NumerationSF» targetNamespace=»http://www.w3.org/2001/XMLSchema»>;

<types>

<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»; xmlns:xs1=»http://www.w3.org/2001/XMLSchema»; targetNamespace=»http://www.w3.org/2001/XMLSchema»; elementFormDefault=»qualified»>

<xs:element name=»GetNumberSF»>

<xs:complexType>

<xs:sequence>

<xs:element name=»RequestXML» type=»xs:string»/>

</xs:sequence>

</xs:complexType>

</xs:element>

   PsyTech

35 — 20.07.15 — 14:54

Если в 1с создать ws-ссылку —  тип у параметра будет: anyType (http://www.w3.org/2001/XMLSchema)

   efim16rus

36 — 20.07.15 — 14:57

Скинь wsdl целиком

   PsyTech

37 — 20.07.15 — 15:00

Вариант (0) работает, но на вход в процедуру сервиса приходит почему-то Строка, а не ОбъектXDTO. Из SOAPUI приходит ОбъектXDTO.

Как сделать, чтоб приходил ОбъектXDTO?

   cw014

38 — 20.07.15 — 15:04

Web-Service самописный? Где находится? Есть доступ к исходникам?

   efim16rus

39 — 20.07.15 — 15:09

СтрокаТип = WSПрокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»,»string»;);

СтрокаЗначение = WSПрокси.ФабрикаXDTO.Создать(СтрокаТип,СтрокаXML);

Ответ = WSПрокси.GetNumberSF(СтрокаЗначение);

   efim16rus

40 — 20.07.15 — 15:13

Выдернул из обработки клиент банка. Если не поможет, скидывай wsdl целиком

   Serginio1

41 — 20.07.15 — 15:29

Измените пространство имен у Веб сервиса

Неправильно.

targetNamespace=»http://www.w3.org/2001/XMLSchema»>;;

Замените на какойнибудь

http://www.ИмяВашейКомпании.ru

Ну и раз параметр строка

Ответ = Прокси.GetNumberSF(СтрокаXML);

   PsyTech

42 — 20.07.15 — 15:34

(39) не, на входе получается Строка, а не ОбъектXDTO

   PsyTech

43 — 20.07.15 — 15:47

(8) на входе в сервисе все равно Строка получается

   Serginio1

44 — 20.07.15 — 15:54

(43) Еще раз задай нормальное пространство имен

Судя по описанию у тебя параметр строка.

   Serginio1

45 — 20.07.15 — 15:55

(42) С с чем сравниваешь?

Скачай Fiddler2 и смотри им какие запросы кто отправляет

   Serginio1

46 — 20.07.15 — 15:56

   PsyTech

47 — 20.07.15 — 16:14

(44) а какое нормальное?

   PsyTech

48 — 20.07.15 — 16:34

(45) В отладке сервиса — если из 1с запрос приходит — на входе Строка, из других систем — ОбъектXDTO

   Serginio1

49 — 20.07.15 — 16:49

(47) Ну ты читай, что я тебе пишу в 41

Например http://www.ИмяВашейКомпании.ru

(48) Так, а что у тебя реально представляет параметр в сервисе?

Фабрика=Прокси.ФабрикаXDTO;

Тип=Фабрика.Тип(ПространствоИмен,НазваниеТипа);

Парам=Фабрика.Создать(Тип);

   PsyTech

50 — 21.07.15 — 09:19

(49) Прошу прощения, немного напутал.

Если отправляю запрос из SOAPUI — на входе сервиса ОбъектXDTO и все отрабатывает без ошибки.

Если отправляю из 1С — на входе тоже ОбъектXDTO, но видимо другой и ошибка появляется при попытке прочитать ОбъектXDTO:

    Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);

    СтрокаХМЛ = Сериализатор.ПрочитатьXDTO(RequestXML);

Разница в объектах:

от SOAPUI в отладке вижу просто ОбъектXDTO;

от 1с в отладке видны еще его поля, т.е. тэги xml, которую я передаю.

Видимо как-то не так отправляю?

   PsyTech

51 — 21.07.15 — 09:20

А отправляю вот так:

    ЧтениеXML= новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(СтрокаXML);

    ЧтениеXML.ПерейтиКСодержимому();

    Определения = Новый WSОпределения(«http://10.6.0.47/b83Services/ws/NumerationSF.1cws?wsdl»;);

    WSПрокси    = Новый WSПрокси(Определения, «http://www.w3.org/2001/XMLSchema»;, «NumerationSF», «NumerationSFSoap»);    

    WSПараметр  = WSПрокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, WSПрокси.ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));    

    
    Ответ = WSПрокси.GetNumberSF(WSПараметр);

   PsyTech

52 — 21.07.15 — 09:35

Ваще не пойму — почему туда приходит ОбъектXDTO, а не строка?

В моей конфе в сервисы на вход приходит строка всегда, но тут платформа 8.3 (8.3.5.1186), а там 8.3 (8.3.6.1977). Может в платформе дело?

   PsyTech

53 — 21.07.15 — 09:39

(52) Нет не в платформа, а в способе отправки.

Вопрос — почему разные ОбъектXDTO приходят от SOAPUI и от 1с?

   efim16rus

54 — 21.07.15 — 09:48

Скорее всего у тебя URIПространстваИменСервиса не http://www.w3.org/2001/XMLSchema, а собственные. Посмотри в wsdl какие используются пространства имен.

   PsyTech

55 — 21.07.15 — 09:57

   efim16rus

56 — 21.07.15 — 10:09

Фидлером не смотрел какой запрос 1с формирует?

   efim16rus

57 — 21.07.15 — 10:11

Сделай как в(45)

  

Serginio1

58 — 21.07.15 — 11:18

(51) Так пространство имен и не стал переименовывать?

Грабли метода ПрочитатьXML() объекта ФабрикаXDTO

Что таит в себе окно редактирования XDTO-пакета

Фабрика XDTO — это библиотека типов, которая описывает определенные структуры XML. В языке программирования платформы 1С имеется объект ФабрикаXDTO, который содержит все пакеты XDTO, имеющиеся в конфигурации, а также предопределенные пакеты (например, пакет типов XML схемы). У данного объекта метод ПрочитатьXML(), позволяет читать элементы данных XDTO указанного типа из объекта чтения XML:


ФайлXML = Новый ЧтениеXML;
ФайлXML.УстановитьСтроку(СтрокаXML);

Пока ФайлXML.Прочитать() Цикл

Если ФайлXML.ЛокальноеИмя = "Message" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML);
КонецЕсли;

КонецЦикла;

ФайлXML.Закрыть();

Первый параметр метода является обязательным, в который передается объект чтения XML. Второй параметр метода необязательный, в который передается тип элемента данных XDTO. Если тип не указан, то будет сделана попытка определить тип данных по текущему состоянию объекта ЧтениеXML.

Допустим, создадим тип в пакете XDTO  с пространством имен http://lk.1cps.ru, который будет описывать некую структуру XML:

1. Тип «Документы»

Кусок структуры XML:
...
<Документы>
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Прочитаем эту структуру:

Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.ЛокальноеИмя = "Документы" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
Прервать;
КонецЕсли;
КонецЦикла;

Приведенный код будет завершать ошибкой чтения XML, примерно такой:

Ошибка при вызове метода контекста (ПрочитатьXML)
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://lk.1cps.ru}ДокументыТип - [126,19]
Проверка дополнительного свойства:
форма: Элемент
имя: {http://lk.1cps.ru}Культура
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://lk.1cps.ru}ДокументыТип

ПРОШЛО 4 ЧАСА :(

Так как выше приведенный кусок структуры XML не относится к пространству имен http://lk.1cps.ru, то и метод ПрочитатьXML() выкидывал ошибку, несмотря на то, что тип правильно описывает структуру XML! Поэтому XML должен выглядеть так:
...
<Документы xmlns="http://lk.1cps.ru">
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Вот такие пироги.

description

2.4.4.40

Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка разбораXML

Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка разбораXML

Если при обмене возникает ошибка такого вида (чаще всего, это случается со статистикой запросов по артикулам), то нужно выполнить обмен с дополнительным экранированием служебных символов XML.

Настройка доступна в справочнике «Настройки обмена →Служебные параметры →»Удалять некорректные символы:
— эту настройку нужно включить, если при обмене не удается прочитать файл обмена
— затем выключить, после того, как обмен пройдет без ошибок (включенная настройка замедляет чтение файлов обмена).

{% hint style=»info» %}
Самым правильным будет остановить регламентное задание текущего обмена, включить флаг «Удалять некорректные символы» и через контекстное меню сделать полный обмен проблемной таблицей (в 99% случаев это таблица «Статистика поиска по строке»).
{% endhint %}

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Если кратко – то не получается загрузить файл обмена в базу, в которой есть разделители данных.

Исходные данные:

База Тест1, в ней Справочник1, Справочик2, Документ1. Также ПланОбмена.Типовой.
В базе созданы узлы: с кодом 1 (этот узел) и с кодом 2 (куда будут выгружаться изменения).
В базе в режиме предприятия создано два элемента справочника и два документа.

База Тест2, в ней Справочник1, Справочик2, Документ1. Также ПланОбмена.Типовой.
В базе созданы узлы: с кодом 2 (этот узел) и с кодом 1 (откуда будут загружаться изменения).

Данные из базы Тест1 выгружаются следующим кодом:

    ИмяФайла = «C:1.xml»;

   
    Узел = ПланыОбмена.Типовой.НайтиПоКоду(«2»);
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла);
    ЗаписьXML.ЗаписатьОбъявлениеXML();

   
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Узел);

   
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель,ЗаписьСообщения.НомерСообщения);

   
    Пока ВыборкаИзменений.Следующий() Цикл

       
        ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());

       
    КонецЦикла;

   
    ЗаписьСообщения.ЗакончитьЗапись();

   
    ЗаписьXML.Закрыть();

Данные в базу Тест2 загружаются следующим кодом:

    ИмяФайла = «C:1.xml»;

   
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерСообщения);

   
    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

       
        Данные = ПрочитатьXML(ЧтениеXML);
        Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
        Данные.ОбменДанными.Загрузка = Истина;
        Данные.Записать();

       
    КонецЦикла;

   
    ЧтениеСообщения.ЗакончитьЧтение();

Все отлично загружается.

[B]Теперь в базу Тест2 добавляем разделитель и “все пропало”.[/B]

В базу Тест2 добавлено следующее:
– Справочник Пользователи (в плане обмена не участвует)
– ПараметрыСеанса.ОбластьДанныхЗначение с типом справочник.Пользователи
– ПараметрыСеанса.ОбластьДанныхИспользование с типом Булево
– Общий реквизит ОбластьДанных, с типом Справочник.Пользователи и ссылкой на предыдущие параметры сеанса. В состав общего реквизита включен Справочник1, Справочник2, Документ1, ПланОбмена.Типовой
– Добавлены пользователи Информационой Базы – Администратор и Пользователь (оба с полными правами).

в модуле сеанса прописан следующий код:

    ТекущийПользователь = РаботаСПользователями.ПолучитьПользователяПоУИД();

   
    Если СокрЛП(ТекущийПользователь) = «Администратор» Тогда

       
        ПараметрыСеанса.ОбластьДанныхЗначение = ТекущийПользователь;
        ПараметрыСеанса.ОбластьДанныхИспользование = Ложь;

       
    Иначе

       
        ПараметрыСеанса.ОбластьДанныхЗначение = ТекущийПользователь;
        ПараметрыСеанса.ОбластьДанныхИспользование = Истина;

       
    КонецЕсли;

   
    ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;

В базе Тест2 под пользователем Пользователь созданы узлы: с кодом 2 (этот узел) и с кодом 1 (откуда будут загружаться изменения).

При попытке выполнить загрузку получаю ошибку в коде:

 ИмяФайла = «C:1.xml»;

   
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерСообщения);

   
    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

       
        Данные = ПрочитатьXML(ЧтениеXML);  // ОШИБКА ВОТ ТУТ
        Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
        Данные.ОбменДанными.Загрузка = Истина;
        Данные.Записать();

       
    КонецЦикла;

   
    ЧтениеСообщения.ЗакончитьЧтение();

Текст ошибки:

{ОбщаяКоманда.ОбщаяКоманда1.МодульКоманды(23)}: Ошибка при вызове метода контекста (ПрочитатьXML)
        Данные = ПрочитатьXML(ЧтениеXML);
по причине:
Ошибка преобразования данных XML: [sfile://C:/1.xml][28,10][/CODE]

Файл обмена который загружается:

   
        Типовой
        2
        1
        3
        0

   
   
       
            1c27a038-55d0-11e4-984d-d81952c74e82
            false
            <Code>000000001

1111

1c27a039-55d0-11e4-984d-d81952c74e82
false

22222

1c27a03a-55d0-11e4-984d-d81952c74e82
false
2014-10-17T11:37:36
000000001
true
1c27a038-55d0-11e4-984d-d81952c74e82

1c27a039-55d0-11e4-984d-d81952c74e82

1c27a03b-55d0-11e4-984d-d81952c74e82
false
2014-10-17T11:37:34
000000002
true
00000000-0000-0000-0000-000000000000

сообщение об ошибке ссылается на строку ” 2014-10-17T11:37:36″ на начало даты 2014, однако если удалить строку из файла обмена начинает ссылаться на другие места файла…

Вообщем вот. Как мог описал проблему. Проблема выявляется на двух тестовых базах, созданных специально для отлавливания этого бага (изначально баг выявился на двух других базах, в которых ведется разработка проекта).

Подскажите, есть какие-нибудь особенности или нюансы в платформе, которые мешают загрузке данных? Какие как можно выявить причину ошибки?

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста получитьобщуюформу
  • Ошибка при вызове метода контекста прочитатьjson недопустимое имя свойства
  • Ошибка при вызове метода контекста получитьмакет нарушение прав доступа
  • Ошибка при вызове метода контекста прочитать конфликт блокировок
  • Ошибка при вызове метода контекста получитьcomобъект