Интеграция 1С:8.3 с MS Project

1. RailMen 828 03.04.15 13:51 Сейчас в теме
Есть MS Project server, опубликован web сервис.
Мы хотим из web сервиса получить список проектов на стороне 1С:8.3.
Делаем пустую файловую базу, в которой создаем обработку, создаем управляемую форму с кнопкой "Тест" и в модуле формы пишем:
&НаКлиенте
Процедура Тест(Команда)
                ТестНаСервере();
КонецПроцедуры

&НаСервере
Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	Определение = Новый WSОпределения("http://adrseservera/pwa1/_vti_bin/psi/Project.asmx?wsdl","domain\user","password!",,,);
	Прокси = Новый WSПрокси(Определение,"http://schemas.microsoft.com/office/project/server/webservices/Project/","Project","ProjectSoap",,,);	
	Прокси.Пользователь = "domain\user";
	Прокси.Пароль = "password!";	
	
	//Подготовка и заполнение параметра для передачи в метод ReadProject
    ТипПараметр = Прокси.ФабрикаXDTO.Пакеты.Получить("http://schemas.microsoft.com/office/project/server/webservices/Project/").Получить("ReadProject");
    Парам = Прокси.ФабрикаXDTO.Создать(ТипПараметр);
    
    Парам.projectUid = "00000000-0000-0000-0000-000000000000";
    Парам.dataStore = "PublishedStore";
    
    //Если передать пустой идентификатор проекта, то метод работает. Возвращает пустой объект XDTO "Ответ.ReadProjectResult = Неопределено"
    Ответ = Прокси.ReadProject(Парам);
    
    //Теперь заполним параметр существующим значением идентификатора проекта
    Парам.projectUid = "75FC7297-3F9D-E311-BEF0-00155D000801"; 
	Парам.dataStore = "PublishedStore";
        
    //В следующей строке при выполнении метода возникает ошибка
    Ответ = Прокси.ReadProject(Парам);
	
КонецПроцедуры
Показать


Когда мы хотим получить проект по пустому айдишнику - ответ получаем корректный.
Но когда мы хотим получить проект по определенному айдишнику получаем ошибку:

{Форма.Форма.Форма(29)}: Ошибка при вызове метода контекста (ReadProject)
Ответ = Прокси.ReadProject(Парам);
по причине:
Ошибка вызова операции сервиса:  {http://schemas.microsoft.com/office/project/server/webservices/Project/}:Project:ReadProject()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.w3.org/2001/XMLSchema}anyType - [1,375]
Проверка дополнительного свойства:
            форма: Элемент
            имя: {http://www.w3.org/2001/XMLSchema}element
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.w3.org/2001/XMLSchema}anyType - [1,375]
Проверка дополнительного свойства:
            форма: Элемент
            имя: {http://www.w3.org/2001/XMLSchema}element
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://www.w3.org/2001/XMLSchema}anyType

по причине:
Несоответствие типов XDTO:
Тип '{http://www.w3.org/2001/XMLSchema}anyType' не соответствует типу '{http://www.w3.org/2001/XMLSchema}topLevelElement'
Тип свойства не соответствует типу значения
Показать


Web-сервис на Си Шарп с использованием похожих методов отработал без ошибок.

Почему обработка из пустой базы 1С 8.3 с приведенным кодом вызывает ошибки? Можно ли однозначно говорить об ошибках в самой платформе 8.3?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
21. N!ghtmare 14.05.15 19:17 Сейчас в теме
Для того чтобы удостоверится что проблема точно на стороне 1С, чтобы не наводить зря напраслину :)
Предлагаю проверить полученный ответ от веб-сервиса на валидность - строгое соответствие схеме.

Например с помощью SOAP UI. Кстати тем всем кто занимается отладкой взаимодействия из 1С с сторонними веб сервисами обязательный must have, так как
в платформе нет возможности перехватить сообщение до валидатора и его изменить.

Как проверить вот: http://www.soapui.org/soap-and-wsdl/validating-soap-services.html
С помощью же SOAP UI можно привести сообщение к такому виду, который будет устраивать валидатор 1С.
Для этого в SOAP UI поднять веб-сервис эммулирующий сервис проджекта и запросы из 1С слать на него.

Потом как было сказано в 14 берем готовый WS-SOAP прокси (к слову это одна из функций сервисной шины ESB) или если есть возможность и средства пишем свой, который умеет преобразовать входящие сообщения в удобоворимый вид для валидатора 1С, с помощью XSLT преобразований например.

В свое время подобным образом решал задачу интеграции 1с-ных веб сервисов с саповской шиной PI.

Если возможно, опубликуйте судя WSDL(поинты можно обезличить) и сообщение полученное от MS Project-а.Посмотрю на досуге.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. HitGroove 50 03.04.15 14:13 Сейчас в теме
(1) RailMen, Попробуйте использовать WS-ссылку. На примере http://kb.mista.ru/article.php?id=473& или http://programmist1s.ru/ws-ssyilki-v-1s/
5. RailMen 828 03.04.15 14:25 Сейчас в теме
(4) HitGroove, спасибо за ссылки. Обе ссылки скорее "учебные".
Хотелось получить комментарии специалистов конкретно по интеграции 1С:8.3.5.1383 с MS Project, так как есть мнение, что платформа работает не корректно.
7. HitGroove 50 03.04.15 14:58 Сейчас в теме
(5) RailMen, Да ссылки учебные, это в основном для понимая как работать 1С и web-сервису, для 1С вообще пофиг это что это MS Project, или какой другой сервис. Вы когда передаете пустой параметр, то сервер Вам выдает пустой ответ следовательно при получении не пустого ответа, 1С пытается сопоставить объекты которые получает, а не может "Ошибка преобразования данных XDTO:" ибо не знает что это за объекты.

1. Добавьте WS ссылку в конфигурацию 1С
2. Укажите http://adrseservera/pwa1/_vti_bin/psi/Project.asmx?wsdl

И попробуйте поработать с самим сервисом, если подобные ошибки будут появляться, возможно сервер отправляет в ответе типы объектов которые 1С понимать не хочет... И что то придется менять в настройках сервера.
8. RailMen 828 03.04.15 15:21 Сейчас в теме
(7) HitGroove,
1. Добавьте WS ссылку в конфигурацию 1С


Это сделано в приведенном выше коде. Но можно и сделать WS ссылку в конфигураторе. Это ничего принципиально не изменит.

И что то придется менять в настройках сервера.

Настройки какого сервера надо менять? MS Project server не имеет настроек, которые мы могли бы редактировать. Или я чего-то не так понял?
9. HitGroove 50 03.04.15 15:39 Сейчас в теме
(8) RailMen, Отлично выяснили что с сервером ни чего сделать нельзя. Добавив ws ссылку мы НАГЛЯДНО сможем посмотреть какие свойства, типы объектов и типы значений используются в данном сервисе! Чтобы указать те которые устроят 1С. Потому как приведенные ошибки указывают что одинэс не может сопоставить типы.
10. RailMen 828 03.04.15 15:55 Сейчас в теме
(9) HitGroove, делали через ссылку. Да удобно, все видно. Но эффект тот же. Ошибка возникает при разборе любого не пустого значения, полученного из MS Project. Через ссылку или через код не имеет значения.
Вот-вот, "платформа 1С не может сопоставить типы".
11. HitGroove 50 03.04.15 16:35 Сейчас в теме
(10) RailMen, Разверните дерево ссылки покажите скрин. Что там есть...
12. RailMen 828 03.04.15 18:11 Сейчас в теме
(11) HitGroove, пожалуйста
Прикрепленные файлы:
22. ture 613 14.05.15 19:28 Сейчас в теме
(1) Есть несколько путей интеграции, которые можно разделить на две условные группы:
К первой относятся виды, где обмен происходит онлайн, т.е. об изменениях сразу сообщается целевому получателю.
Ко второй относится обмен, когда изменения происходят сами собой и об этом целевой получатель узнает, только когда сам "пошевелится".

Первый вариант:
Изменение порождает событие, которое ставится в очередь на отправку получателю. Можно писать в таблицу с учетом времени и на ее основе дергать вебсервис, к примеру.

Второй вариант:
Получатель сам периодически копается в источнике в поисках измененных данных. Этот вариант разумеется возможен в рамках только локальной сети.

Конечно это две крайности, часто бывает решение где-то в середине - не онлайн и без поиска изменений.
25. ditp 94 15.05.15 10:58 Сейчас в теме
(1) Сниффером посмотреть, что уходит из 1С и что возвращает веб-сервис в обоих случаях, не пробовали? И сравнить в проверочным на C#
Я не уверен, что ответ, содержащий что-то вроде
<a class="is-fancybox" href="/redirect.php?url=aHR0cDov...

является корректным ответом сервера.
Возможно, происходит сбой на стороне сервиса из-за неверно переданных параметров (или при их обработке происходит ошибка), и сервер возвращает обычную html страницу.
26. ture 613 15.05.15 11:05 Сейчас в теме
(25) Зачем снифер? Надо пустить трафик через проксю и там логгировать. зачем велосипед выдумывать?
27. ditp 94 15.05.15 11:08 Сейчас в теме
(26) Кому что проще, очевидно же.
Мне в подобных ситуациях проще установить банальный smartsnif, например.
28. ture 613 15.05.15 11:10 Сейчас в теме
(27) Я также пользовал снифер в начале. А потом выяснилось, что проще писать на шарпе и логировать обмен. Но если надо логировать имеющийся, то прокси, т.к. дров ставить не надо для сетевой карты.
32. ture 613 06.06.15 13:48 Сейчас в теме
(1) RailMen, совсем без программирование и вникания в устройство не получится
33. alex_sh2008 5 03.07.15 16:21 Сейчас в теме
(1) RailMen, А есть ли смысл загружать все данные которые выдает Projects, может свойства с типом anyType вообще не нужны для дальнейшей обработки в 1С?
2. Sanek_159 1 03.04.15 14:04 Сейчас в теме
А какой релиз платформы 1С используете?
3. RailMen 828 03.04.15 14:07 Сейчас в теме
6. RailMen 828 03.04.15 14:39 Сейчас в теме
Мы сделали обращение в техническую поддержку 1С (зарегистрирована 25.12.2014 под номером SW893155 код ошибки 30016652). Предоставив дополнительную информацию по запросам специалистов 1С мы получили ответ 02.04.2015 о том, что «это не ошибка платформы». Однако, есть сомнения.
13. pavelyar 05.04.15 01:28 Сейчас в теме
Интересно что получится..
14. kengurulkeo 10.04.15 11:58 Сейчас в теме
Мы делали интеграцию 1С с Web сервисами на JBoss (Java EE сервер), так вот проблема в том, что 1С очень требовательна к типам возвращаемых значений. Т.е. в описании SOAP методов на JBoss было все сделано корректно и они вызывались другими системами нормально. Но 1С выдавала ошибку несовпадения типов при разборе XDTO. Нам было проще, т.к. методы мы писали сами, то добавили аннотации:
Было:
@WebMethod()
public String getTaskStateByNumber(
@WebParam(name = "number") long number,
@WebParam(name = "projectId") long projectId) {
TaskDTOfor1C task = findTaskByTaskNumber(new BigDecimal(number),
projectId);
return task != null ? task.getState() : null;
}

Стало:
@WebMethod()
@WebResult(targetNamespace = "http://web.msp.inagro.ua/")
public String getTaskStateByNumber(
@WebParam(name = "number", targetNamespace = "http://web.msp.inagro.ua/") long number,
@WebParam(name = "projectId", targetNamespace = "http://web.msp.inagro.ua/") long projectId) {
TaskDTOfor1C task = findTaskByTaskNumber(new BigDecimal(number),
projectId);
return task != null ? task.getState() : null;
}

т.е. мы добавили принудительно namespace

Это необходимо сделать и внутри возвращаемых объектов, если это не примитив, т.е. в описании TaskDTOfor1C
было:

@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
public class TaskSOAPDTO implements Serializable {

private static final long serialVersionUID = 1L;

@XmlElement(namespace = SOAPDeclarations.SOAP_NS_FIELDS, nillable=true)
private BigDecimal taskID;
@XmlElement(namespace = SOAPDeclarations.SOAP_NS_FIELDS)
private String moniobjectID;
...

Стало:
@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
public class TaskDTOfor1C implements Serializable {

private static final long serialVersionUID = 1L;
@XmlElement(namespace = "http://web.msp.inagro.ua/")
private long id;
@XmlElement(namespace = "http://web.msp.inagro.ua/")
private long currentStatusId;
...

Думаю у вас похожая проблема.

Если это так то есть несколько путей:
1. Вручную парсить строки - жуть, если честно.
2. Написать прокси сервер, который будет транслировать запросы и ответы. Чисто техническая задача - брать и делать, ничего сверх сложного - просто время и деньги.
3. В 8.3.6 в описании написано, что они чего-то переделали с форматом обращения с SOAP... Я не проверял, хуже точно не стало, но стало ли лучше - не знаю. Но проверить стоит.
17. RailMen 828 20.04.15 12:03 Сейчас в теме
(14) (15) (16) , спасибо. Буду смотреть. Чую, без шамана с бубном не обойтись.
18. Serginio 941 20.04.15 12:33 Сейчас в теме
(17) Я специально 15 под задачи с вэб сервисами изначально и решал. Где куча классов итд, что муторно решать через свою оболочку COM. А так ты получаешь доступ к классам Net как к ком объектам и написание обращения к Вэб сервису через эту оболочку во многих случаях даже проще и понятнее чем родными 1Скими
19. kihor 20.04.15 18:06 Сейчас в теме
(17) Я решил задачу интеграции с Project Server-ом составляя пакета запроса (soap:Envelope и RequestHeaders) и отсылая его через Msxml2.ServerXMLHTTP. Потом делаю парсинг ответа при помощи MSXML2.DOMDocument. Таким образом получаю и список всех проектов и параметры одного определенного проекта.
15. Serginio 941 11.04.15 13:11 Сейчас в теме
Используй http://infostart.ru/public/238584/
1С очень далека от совершенства при работе с вэб сервисами
Здесь обсуждения http://www.forum.mista.ru/topic.php?id=689926&page=1
16. blackhole321 1314 18.04.15 10:21 Сейчас в теме
Можно попробовать http://infostart.ru/public/274486/
Как вызвать метод веб сервиса можно посмотреть здесь: http://blog.robseder.com/2014/03/23/calling-a-soap-web-service-from-powershell-3-0/
Протестировать вызов методов etc. можно перейдя по ссылке Протестировать online
20. Serginio 941 20.04.15 18:45 Сейчас в теме
Кстати а что возвращает сервис? Возможно проблема с пространством имен возвращаемого типа раз ошибка

Несоответствие типов XDTO:
Тип '{http://www.w3.org/2001/XMLSchema}anyType' не соответствует типу '{http://www.w3.org/2001/XMLSchema}topLevelElement'
Тип свойства не соответствует типу значения


Посмтри фиддлером что возвращает сервис
21. N!ghtmare 14.05.15 19:17 Сейчас в теме
Для того чтобы удостоверится что проблема точно на стороне 1С, чтобы не наводить зря напраслину :)
Предлагаю проверить полученный ответ от веб-сервиса на валидность - строгое соответствие схеме.

Например с помощью SOAP UI. Кстати тем всем кто занимается отладкой взаимодействия из 1С с сторонними веб сервисами обязательный must have, так как
в платформе нет возможности перехватить сообщение до валидатора и его изменить.

Как проверить вот: http://www.soapui.org/soap-and-wsdl/validating-soap-services.html
С помощью же SOAP UI можно привести сообщение к такому виду, который будет устраивать валидатор 1С.
Для этого в SOAP UI поднять веб-сервис эммулирующий сервис проджекта и запросы из 1С слать на него.

Потом как было сказано в 14 берем готовый WS-SOAP прокси (к слову это одна из функций сервисной шины ESB) или если есть возможность и средства пишем свой, который умеет преобразовать входящие сообщения в удобоворимый вид для валидатора 1С, с помощью XSLT преобразований например.

В свое время подобным образом решал задачу интеграции 1с-ных веб сервисов с саповской шиной PI.

Если возможно, опубликуйте судя WSDL(поинты можно обезличить) и сообщение полученное от MS Project-а.Посмотрю на досуге.
23. N!ghtmare 14.05.15 20:21 Сейчас в теме
34. RailMen 828 03.07.15 17:20 Сейчас в теме
(23) N!ghtmare, деньги хоть и виртуальные отдаю тебе )))
Простите, что давно не заглядывал.
35. N!ghtmare 16.07.15 16:58 Сейчас в теме
(34) RailMen, Какая приятная неожиданность :) Спасибо!
24. kengurulkeo 15.05.15 07:06 Сейчас в теме
О! Здорово, спасибо, не знал что есть такие готовые, интересные решения )
Не знаю как автор этой темы, но я точно себе попробую - давно хотел с MS Exchange пообщаться, да только там похожая проблема... а задача не настолько критична, чтобы выделять сколько нибудь значимые ресурсы... А если через готовый прокси заработает - то будет здорово!
29. Deroswent 18.05.15 17:00 Сейчас в теме
По сути имея современные ресурсы в виде бесплатных VDS которые можно расковырять и настроить на какую угодно задачу, логирования превращается в творческую задачу: миллион способов и все сводится к предпочтениям. Как по мне то прокся поднятая на VDS идеально подходит под это дело
30. Serginio 941 18.05.15 17:56 Сейчас в теме
Тут аналогичная проблема
http://www.forum.mista.ru/topic.php?id=742950

А случайно вэб сервис не возврващает DataTable
http://forums.asp.net/t/1171111.aspx?Web+Service+DataTable+result+problem
31. ture 613 21.05.15 18:32 Сейчас в теме
Web-сервис на Си Шарп с использованием похожих методов отработал без ошибок. 

Раз так, то можно обойтись комобъектами. построить хml и отправить ее на url. Не обязательно замыкаться на средствах 1С.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот