forum.bitel.ru http://forum.bitel.ru/ |
|
Изменение статуса договора из 1с http://forum.bitel.ru/viewtopic.php?f=19&t=9323 |
Страница 1 из 1 |
Автор: | SeGa [ 04 июн 2014, 09:38 ] | ||
Заголовок сообщения: | Изменение статуса договора из 1с | ||
Есть задача менять статус договора из 1с (Bgbilling v 6.0). Статусы договоров меняются через WSDL. Пробую реализовать на 1с 8.3 но возникла проблема. Добавил в объекты Ws-ссылку: http://127.0.0.1:8080/bgbilling/execute ... rvice?wsdl И пробую выполнить запрос таким образом: Код: ПространствоИмен = "http://service.common.status.contract.kernel.bgbilling.bitel.ru/"; Прокси = WsСсылки.BgStatus.СоздатьWSПрокси(ПространствоИмен, "ContractStatusMonitorService", "ContractStatusMonitorService" ); ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить(ПространствоИмен).Получить("changeContractStatus"); WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра); ТипИнт = Прокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "int"); ТипСтрока = Прокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"); ТипДата = Прокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); ЗначениеСИД = Прокси.ФабрикаXDTO.Создать(ТипИНТ, 45700); ЗначениеСтатус = Прокси.ФабрикаXDTO.Создать(ТипИНТ, 3); ЗначениеДата1 = Прокси.ФабрикаXDTO.Создать(ТипДата, "2014-06-04T00:00:00+11:00"); ЗначениеДата2 = Прокси.ФабрикаXDTO.Создать(ТипДата, "2014-06-08T00:00:00+11:00"); ЗначениеКоммент = Прокси.ФабрикаXDTO.Создать(ТипСтрока, "hello"); WSПараметр.cid.Добавить(ЗначениеСИД); WSПараметр.statusId = ЗначениеСтатус; WSПараметр.dateFrom = ЗначениеДата1; WSПараметр.dateTo = ЗначениеДата2; WSПараметр.comment = ЗначениеКоммент ; Прокси.Пользователь = "user"; Прокси.Пароль = "123"; Прокси.changeContractStatus(WSПараметр); Но при выполнеии возникает ошибка: Код: {Обработка.Обработка1.Форма.Форма.Форма(62)}: Ошибка при вызове метода контекста (changeContractStatus) Прокси.changeContractStatus(WSПараметр); по причине: Ошибка вызова операции сервиса: {http://service.common.status.contract.kernel.bgbilling.bitel.ru/}:ContractStatusMonitorService:changeContractStatus() по причине: Ошибка SOAP сервера: Ошибка параметров запроса. Не могу разобраться, что неверно в параметрах запроса или я вообще неверным путем иду, сталкивался кто с подобной проблемой ?
|
Автор: | stark [ 04 июн 2014, 10:56 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
Это штатное сообщение нашего сервера, когда ему не хватает каких-то данных. В данном случае там стоит такая проверка Код: @Override public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment ) throws BGException { if ( cids.length <= 0 || statusId < 0 || dateFrom == null ) { throw new BGIllegalArgumentException(); //ошибка параметров запроса } .... Он читает либо cids пустой, либо statusId меньше нуля либо dateFrom равно null. Я не разбираюсь в 1с , но первый cids должен быть массивом, у вас это как-то отдельно указывается ? Хорошо посмотреть какая xml уходит от 1с на сервер. |
Автор: | SeGa [ 04 июн 2014, 11:42 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
Я как раз и думаю что ошибка в параметре cid, он в отличии от остальных параметров передается как СписокXDTO, а не просто значением и в дебаге 1с я не вижу передаваемого значения, там какая-то муть. Но если смотреть в журнале запросов то вижу, что на сервер приходит следующее Код: #text => cid => 45700 #text => statusId => 3 #text => dateFrom => 2014-06-04T00:00:00 #text => dateTo => 2014-06-08T00:00:00 #text => comment => hello #text => Т.е. данные до сервера доходят. Но если смотреть рабочий запрос по смене группы то вывод несколько иной: Код: #text => contractId => <contractId xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="">45700</contractId> #text => contractGroupId => <contractGroupId xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="">3</contractGroupId> #text => , правда в запросе на смену группы все проще т.к. в методе contractGroupAdd порта ContractService передаются два раздельных параметра, а при смене статуса все записывается в один. Как посмотреть отправляемый xml я, к сожалению, не знаю. C web сервисами столкнулся недавно, так что могу неправильно что-то понимать/реализовывать в 1с механизмах XDTO, надеялся что есть люди с опытом создания подобного в 1с. |
Автор: | stark [ 04 июн 2014, 12:01 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
В 6.0 при нормальном запросе из клиента я вижу такое в журнале запросов: Код: cid => 355141
statusId => 6 dateFrom => 2014-06-04T00:00:00+06:00 comment => <comment xmlns=""/> |
Автор: | SeGa [ 04 июн 2014, 12:09 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
При запросе из php такой же вывод, вероятно ошибка в неправильном определении типа передаваемого параметра если он является массивом, поэтому массив неправильно обрабатывается и биллинг не видит данные так как должен, буду углубляться в доки по 1с. |
Автор: | stark [ 04 июн 2014, 12:10 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
SeGa писал(а): Я как раз и думаю что ошибка в параметре cid, он в отличии от остальных параметров передается как СписокXDTO Я не понял чем он у вас отличается от поля статус Код: ЗначениеСИД = Прокси.ФабрикаXDTO.Создать(ТипИНТ, 45700); ЗначениеСтатус = Прокси.ФабрикаXDTO.Создать(ТипИНТ, 3); Вроде оба одинаково создаются как int-вое значение. |
Автор: | stark [ 04 июн 2014, 12:24 ] |
Заголовок сообщения: | Re: Изменение статуса договора из 1с |
Возможно вот это у вас неправильно Код: ТипИнт = Прокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "int"); Там не тип int. На вскидку нашел что для массива String-ов, например, используют такую конструкцию : Код: ТипМассив = Фабрика.Тип("http://tempuri.org/", "ArrayOfString"); http://www.forum.mista.ru/topic.php?id=637402 Может для массива int тоже надо как-то отдельно указывать. Это мои предположения, 1с не изучал. |
Автор: | SeGa [ 05 июн 2014, 06:35 ] | |||
Заголовок сообщения: | Re: Изменение статуса договора из 1с | |||
stark писал(а): Там не тип int. Тип "changeContractStatus" пространства имен "http://service.common.status.contract.kernel.bgbilling.bitel.ru/" Смотрю как 1с воспринимает структуру в пакете XDTO Тип "int" с неограниченным количеством элементов пространства имен "http://www.w3.org/2001/XMLSchema" "statusId" - int (http://www.w3.org/2001/XMLSchema) dateFrom - dateTime (http://www.w3.org/2001/XMLSchema) dateTo - dateTime (http://www.w3.org/2001/XMLSchema) comment - string (http://www.w3.org/2001/XMLSchema) Соответственно я присваиваю переменной "ЗначениеСИД" тип "Int" и так как в дебаггере вижу, что присвоить значение напрямую не могу, так как "WSПараметр.cid" имеет тип "СписокXDTO", то использую метод Добавить в отличии от остальных параметов. Т.е. в итоге туда передается массив Int. Цитата: На вскидку нашел что для массива String-ов, например, используют такую конструкцию : Пробовал и с другими базовыми типами типами из http://www.w3.org/2001/XMLSchema не заработало ни с какими. По найденной Вами ссылке код у меня не выполняется, не получается создать фабрику с таким типом.
|
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |