Капитально об программе 1С 8.0-8.3-8.4, 7.7

Ошибка разбора XML: Приложение 1С:Заказы

Ситуация:

конфигурация ут 11.1.6, актуальная версия ут 11.1.10, версия приложения последняя с маркета при начальной синхронизации происходит ошибка

Поиск причины по шагам

Шаг 1. Проверка access.log апача .

Приходят два запроса:

x.x.x.30 — — [30/Jun/2015:09:00:04 +0400] «GET /trade/ws/CustomerOrdersExchange.1cws?wsdl HTTP/1.1» 200 67058
x.x.x.30 — — [30/Jun/2015:09:00:06 +0400] «POST /trade/ws/CustomerOrdersExchange.1cws HTTP/1.1» 500 757

Первый успешно считывает описание сервиса

Второй приходит с ошибкой на стороне сервера.

Предположение: несовместимость форматов различных версий, что-то передается не в том формате, или с ошибочными данными

Шаг 2: частичное обновление конфигурации (полное пока нельзя, поскольку она с доработками и идет интеграция с сайтом, чтобы не вызывать возможных срывов в работе)

сохраняю конфигурацию

обновляю конфигурацию в режиме объединения/замещения

Тестирую, синхронизацию. проходит далее, но возникает ошибка «Не найден узел обмена для пользователя».

Шаг3:

Тут ошибка случайная, но тем, не менее, она возникла.(«Не найден узел обмена для пользователя»)

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

Создав новый узел (или программно изменив код в старом), эта ошибка уходит.

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

Шаг 4:

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

Предположение:  не совместимость запросов объединенных модулей

Надо отлаживать, но подключения к вэбсервисам почему-то не отлаживается, возможно проблема в платформе 8.3.5.1186.

Танцы с бубном, создание файлов «comcntrcfg.xml и webservicecfg.xml», добавление строки в «default.vrd», перезапуски, не дают результаты. Откладываем на потом.

Шаг 5

В процессе работы вызываются функции вэбсервиса, которые вызывают экспортные функции общих моделей, т.е. есть возможность отладить их напрямую.

Накидываем форму обработки «Выполнятель» (для управляемой формы у меня не было).

Получается вот такой код-скрипт для начального тестирования:

MobileApplicationVersion  = "не 1";//Иначе потребует обновления
MobileDeviceID  = "1";
MobileDeviceID  = "18c07362-bdeb-439d-9f8b-59b19cefd670";//Уникальный идентификатор пользователя, вот тут проблема, что в функциях используется текущий пользователь
Ответ = МобильноеПриложениеЗаказыКлиентов.НачалоОбмена(MobileApplicationVersion, MobileDeviceID);

Сообщить(Ответ);
Попытка 
	Сообщить(Ответ.ResultMessage);
	Сообщить("Успешно "+Ответ.Success);
Исключение
КонецПопытки;

Пришлось опять менять/создать пользователя в узле,  текущего пользователя. т.к. хотя передается уид любого пользователя, но сравнивается он с текущим  (для сеанса соединения все пройдет нормально).

Теперь у меня код проходит на «Успешно=Истина».

Выполняем вторую часть кода:

Ответ2 = МобильноеПриложениеЗаказыКлиентов.ВыгрузитьСправочники(MobileDeviceID);
Попытка 
	Сообщить(Ответ2.ResultMessage);
	Сообщить("Успешно "+Ответ2.Success);
Исключение
КонецПопытки;

Вот тут и вывелась мне ошибка: оказалось, что при объединении плана обмена я не объединил макеты узла, из которых берутся схемы ответа, и в частности в ответе отсутствовали данные по странам.

Объединяем, обнаруживаем попутно, что еще добавились реквизиты плана, обновляем без них, но предполагаем что придется вернуться к ним в нерабочее время.

Шаг 6 

Фокус не прошел, т.к. запросы в схемах ссылаются на отсутствующие регистры.

Исходим из того что пока мы полное обновление производить не можем.

Оказалось выполняется соединение с РегистрСведений.УчетнаяПолитикаОрганизаций, причем в случае  отсутствия записи передается пустая строка(для этапа тестировани должно подойти). Все остальные схемы ошибок не показывают.

Модифицируем запрос, проверяем дальше.

Тестирование справочников проходит успешно, в ответ выводится xml.

Но приложение все еще вылетает с ошибкой разбора.

Тестируем остальные методы сервиса…

Шаг 7

Ответ3 = МобильноеПриложениеЗаказыКлиентов.ВыгрузитьКлиентов(MobileDeviceID, Истина,"","");
Попытка 
	Сообщить(Ответ3.ResultMessage);
	Сообщить("Успешно "+Ответ3.Success);
Исключение
КонецПопытки;

Успешно!

Ответ4 = МобильноеПриложениеЗаказыКлиентов.ВыгрузитьНастройки(MobileDeviceID);
Попытка 
	Сообщить(Ответ4.ResultMessage);
	Сообщить("Успешно "+Ответ4.Success);
Исключение
КонецПопытки;

Ошибка:

Поле не найдено «РегистрироватьНаличные» <<?>>РегистрироватьНаличные КАК РегистрироватьНаличные,

Это как раз из отсутствующих реквизитов плана обмена, подправляю заполнение структуры реквизитов.

Далее, отсутствует константа «ИспользоватьРасширенныеВозможностиЗаказаКлиента».

Попутно вызвал тестирование выгрузки прайса:

Ответ5 = МобильноеПриложениеЗаказыКлиентов.ВыгрузитьПрайсЛист(MobileDeviceID, Ложь, "")
Попытка 
	Сообщить(Ответ5.ResultMessage);
	Сообщить("Успешно "+Ответ5.Success);
Исключение
КонецПопытки;

Заключение

Тут медлительный сервер впал в ступор, на полчаса и сколько будет еще не известно (индикатора нет).

Ошибкой было: задание второго параметра Истина(Все цены/Измененные), но думаю при первом обмене это бы не помогло).

В базе не меньше 1000 номенклатурных позиций, примерно 10 характеристик к каждой, видимо, это много, и с учетом нехватки памяти, ограничения на уровне записей, надо запастись большим интервалом времени на начальную синхронизацию, может быть есть возможность это ускорить, постараюсь вернуть к этому позже.

В узле обмена наложу условия на отбор номенклатуры, когда буду тестировать на телефоне (как оказалось отбор только по видам цен,). через соглашение еще можно, но косвенно через сегмент номенклатуры….

Тупик?

Оставил «на ночь», через час (по дате последней синхронизации) обмен успешно прошел.

 

Приложение

<config xmlns="http://v8.1c.ru/v8/comcntrcfg"> 
    <debugconfig debug="true" debuggerURL="tcp://localhost:1562"/> 
    <debugports range="1540:1690"/>
</config>