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 тот-же запрос работает. В чем ошибка?
1 — 20.07.15 — 11:47
Прокси тут лишний
2 — 20.07.15 — 11:50
тип параметра anyType
3 — 20.07.15 — 11:51
(0) Нужно смотреть в модуле вот этого вот : «NumerationSF» в строке (7).
Скорее всего неправильно с точки зрения сервиса выглядит содержимое вот этого вот : «СтрокаXML».
4 — 20.07.15 — 11:57
(3) А при запросе из soapui этот же запрос срабатывает…
5 — 20.07.15 — 11:58
(4) Ну так сравни «СтрокаXML» в 1С и тоже самое в soapui.
6 — 20.07.15 — 12:05
(5) в soapui обертка только есть стандартно. Не мешала никогда.
почему-то на тип ругается: «Несоответствие типов (параметр номер ‘1’)»
7 — 20.07.15 — 12:08
(6) «в soapui обертка только есть стандартно.» Это как понять? Метод вызывается вообще без параметра?
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.Имя));
9 — 20.07.15 — 12:13
Фабрика=Прокси.ФабрикаXDTO;
WSПараметр =Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
10 — 20.07.15 — 12:23
(8) Ошибка преобразования данных XDTO:
НачалоСвойства: {http://www.w3.org/2001/XMLSchema}anyType Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
11 — 20.07.15 — 12:25
В базе сервиса тип параметра «string», а при создании ws-ссылки «anyType»
12 — 20.07.15 — 12:27
(0)
используй динамическое подключение если не знаешь какое пространство имен используешь
ОпределениеТ=Новый WSОпределения(«http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl»;);
WSСервис=ОпределениеТ.Сервисы[0];
ПроксиWS=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);
ПроксиWS.Пользователь = «ХХХ»;
ПроксиWS.Пароль = «УУУУ»;
ПроксиWS.ВызватьКакойтоМетод();
13 — 20.07.15 — 12:34
Ошибка преобразования данных XDTO:
14 — 20.07.15 — 12:36
в браузере string.
Не понимаю, почему anyType у меня
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
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
17 — 20.07.15 — 13:04
откуда anyType, если в браузере и в конфе сервиса string?
И что с этим делать?
18 — 20.07.15 — 13:13
Если string, тогда зачем ты туда пихаешь ОбъектXDTO? Пихай стринг
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 р
20 — 20.07.15 — 13:42
(17) Внимательно посмотри на 12. И посмотри какое пространство имен у WSСервис.URIПространстваИмен
21 — 20.07.15 — 14:13
(20) WSСервис.URIПространстваИмен = «http://www.w3.org/2001/XMLSchema»;
22 — 20.07.15 — 14:17
«СтрокаXML» у тебя какой тип имеет?
23 — 20.07.15 — 14:18
(19)
{Форма.Форма.Форма(103)}: Ошибка при вызове метода контекста (GetNumberSF)
Ответ = Прокси.GetNumberSF(СтрокаXML);
по причине:
Несоответствие типов (параметр номер ‘1’)
24 — 20.07.15 — 14:19
(22) Строка
25 — 20.07.15 — 14:22
ТипWSПараметра = Прокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»;;, «string»);
Парам = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
ВидДокумента.Key = «Название_параметра»;
ВидДокумента.Value = СтрокаXML;
ВидДокумента.ValueType = «string»;
26 — 20.07.15 — 14:22
ТипWSПараметра = Прокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»;;;, «string»);
Парам = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
Парам.Key = «Название_параметра»;
Парам.Value = СтрокаXML;
Парам.ValueType = «string»;
27 — 20.07.15 — 14:23
Ответ = Прокси.GetNumberSF(Парам);
28 — 20.07.15 — 14:23
Попробуй так
29 — 20.07.15 — 14:41
Вообще то http://www.w3.org/2001/XMLSchema это стандартное пространство имен уже зашитое.
А кто задал такое имя пространства имен? Если это сервис 1С
30 — 20.07.15 — 14:46
Ты бы хоть показал описание WSDL и типы используемые GetNumberSF
31 — 20.07.15 — 14:46
Или выложи WSDL
32 — 20.07.15 — 14:49
(28) Параметр = неопределено
33 — 20.07.15 — 14:50
(30) тип 1 — string
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>
35 — 20.07.15 — 14:54
Если в 1с создать ws-ссылку — тип у параметра будет: anyType (http://www.w3.org/2001/XMLSchema)
36 — 20.07.15 — 14:57
Скинь wsdl целиком
37 — 20.07.15 — 15:00
Вариант (0) работает, но на вход в процедуру сервиса приходит почему-то Строка, а не ОбъектXDTO. Из SOAPUI приходит ОбъектXDTO.
Как сделать, чтоб приходил ОбъектXDTO?
38 — 20.07.15 — 15:04
Web-Service самописный? Где находится? Есть доступ к исходникам?
39 — 20.07.15 — 15:09
СтрокаТип = WSПрокси.ФабрикаXDTO.Тип(«http://www.w3.org/2001/XMLSchema»,»string»;);
СтрокаЗначение = WSПрокси.ФабрикаXDTO.Создать(СтрокаТип,СтрокаXML);
Ответ = WSПрокси.GetNumberSF(СтрокаЗначение);
40 — 20.07.15 — 15:13
Выдернул из обработки клиент банка. Если не поможет, скидывай wsdl целиком
41 — 20.07.15 — 15:29
Измените пространство имен у Веб сервиса
Неправильно.
targetNamespace=»http://www.w3.org/2001/XMLSchema»>;;
Замените на какойнибудь
http://www.ИмяВашейКомпании.ru
Ну и раз параметр строка
Ответ = Прокси.GetNumberSF(СтрокаXML);
42 — 20.07.15 — 15:34
(39) не, на входе получается Строка, а не ОбъектXDTO
43 — 20.07.15 — 15:47
(8) на входе в сервисе все равно Строка получается
44 — 20.07.15 — 15:54
(43) Еще раз задай нормальное пространство имен
Судя по описанию у тебя параметр строка.
45 — 20.07.15 — 15:55
(42) С с чем сравниваешь?
Скачай Fiddler2 и смотри им какие запросы кто отправляет
46 — 20.07.15 — 15:56
47 — 20.07.15 — 16:14
(44) а какое нормальное?
48 — 20.07.15 — 16:34
(45) В отладке сервиса — если из 1с запрос приходит — на входе Строка, из других систем — ОбъектXDTO
49 — 20.07.15 — 16:49
(47) Ну ты читай, что я тебе пишу в 41
Например http://www.ИмяВашейКомпании.ru
(48) Так, а что у тебя реально представляет параметр в сервисе?
Фабрика=Прокси.ФабрикаXDTO;
Тип=Фабрика.Тип(ПространствоИмен,НазваниеТипа);
Парам=Фабрика.Создать(Тип);
50 — 21.07.15 — 09:19
(49) Прошу прощения, немного напутал.
Если отправляю запрос из SOAPUI — на входе сервиса ОбъектXDTO и все отрабатывает без ошибки.
Если отправляю из 1С — на входе тоже ОбъектXDTO, но видимо другой и ошибка появляется при попытке прочитать ОбъектXDTO:
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
СтрокаХМЛ = Сериализатор.ПрочитатьXDTO(RequestXML);
Разница в объектах:
от SOAPUI в отладке вижу просто ОбъектXDTO;
от 1с в отладке видны еще его поля, т.е. тэги xml, которую я передаю.
Видимо как-то не так отправляю?
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Параметр);
52 — 21.07.15 — 09:35
Ваще не пойму — почему туда приходит ОбъектXDTO, а не строка?
В моей конфе в сервисы на вход приходит строка всегда, но тут платформа 8.3 (8.3.5.1186), а там 8.3 (8.3.6.1977). Может в платформе дело?
53 — 21.07.15 — 09:39
(52) Нет не в платформа, а в способе отправки.
Вопрос — почему разные ОбъектXDTO приходят от SOAPUI и от 1с?
54 — 21.07.15 — 09:48
Скорее всего у тебя URIПространстваИменСервиса не http://www.w3.org/2001/XMLSchema, а собственные. Посмотри в wsdl какие используются пространства имен.
55 — 21.07.15 — 09:57
56 — 21.07.15 — 10:09
Фидлером не смотрел какой запрос 1с формирует?
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С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 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, однако если удалить строку из файла обмена начинает ссылаться на другие места файла…
Вообщем вот. Как мог описал проблему. Проблема выявляется на двух тестовых базах, созданных специально для отлавливания этого бага (изначально баг выявился на двух других базах, в которых ведется разработка проекта).
Подскажите, есть какие-нибудь особенности или нюансы в платформе, которые мешают загрузке данных? Какие как можно выявить причину ошибки?