Обмен при помощи web-сервиса

1. Manticor 66 06.09.13 11:38 Сейчас в теме
Добрго времени!
Подскажите, как привильно сделать синхронизацию контрагентов между 1С и сайтом используя веб-сервисы. При создании контрагента на сайте - он должен быть передан в 1С и наоборот, при создании в 1С - передать на сайт. Конфигурация самописная(эмитирует торговлю)

За основу взял данную статью: http://infostart.ru/public/193460/#comm
Установил Apache 2.2, сделал публикацию web-сервиса.
В операции web-сервиса добавил имя метода Obmen- далее добавил функцию

Функция Obmen()
	// получим типы из XDTO
    ТипXDTOРезультатОперации = ФабрикаXDTO.Тип("http://www.sample-package.org", "РезультатОперации");
    ТипXDTOСвойства = ФабрикаXDTO.Тип("http://www.sample-package.org", "Свойства");
    // создадим значение XDTO для свойства
    XDTOСвойства = ФабрикаXDTO.Создать(ТипXDTOСвойства);
     
    СпрНом = Справочники.Контрагенты;
     
    Выборка = СпрНом.Выбрать();
     
	Пока Выборка.Следующий() Цикл
		
		// создадим значение XDTO для результата
		XDTOПозиции = ФабрикаXDTO.Создать(ТипXDTOРезультатОперации);
		
		// заполним результат
		ЗаполнитьЗначенияСвойств(XDTOПозиции, Выборка);
		
		// добавим результат в товары
		XDTOСвойства.Контрагент.Добавить(XDTOПозиции);
		
	КонецЦикла;
     
    Возврат XDTOСвойства;  
КонецФункции
Показать


Далее оздал обработку и привзал к событию нажтия кнопки вышеуказанную функцию.
Ввылетает ошибка:
{Обработка.ПробныйОбмен.Форма.Форма.Форма(12)}: Ошибка при вызове метода контекста (Obmen)
РезультатОбмена = ПроксиСервер.Obmen();
по причине:
Ошибка вызова операции сервиса: {www.URL.com}:WebService:Obmen()
по причине:
Ошибка SOAP сервера: Неизвестная ошибка. {WebСервис.WebService.Модуль(22)}: Значение не является значением объектного типа (Добавить)
по причине:
{WebСервис.WebService.Модуль(22)}: Значение не является значением объектного типа (Добавить)

Что не хватает? Как реализовать обратный обмен из сайта в 1С?? Нужно ли создвать специальную web-обработку для этих целей на языке PHP?
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VBod 39 06.09.13 11:58 Сейчас в теме
(1) Manticor, в XDTO пакете у свойства "Контрагент" поставьте максимальное количество равное "-1".
3. Manticor 66 06.09.13 12:01 Сейчас в теме
(2) VBod, теперь такое выводит
{Обработка.ПробныйОбмен.Форма.Форма.Форма(12)}: Ошибка при вызове метода контекста (Obmen)
РезультатОбмена = ПроксиСервер.Obmen();
по причине:
Ошибка вызова операции сервиса: {www.URL.com}:WebService:Obmen()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.sample-package.org}Свойства - [18,3]
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.sample-package.org}Свойства - [18,3]
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://www.sample-package.org}Свойства
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
Не установлено значение одного из следующих свойств:
4. VBod 39 06.09.13 12:20 Сейчас в теме
(3) Manticor, проверьте отладчиком, правильно ли у вас заполняются свойства "Код" и "Номенклатура"в строке
ЗаполнитьЗначенияСвойств(XDTOПозиции, Выборка);

И проверьте, что бы типы значений этих свойств совпадали с типами в самом справочнике.
7. Manticor 66 06.09.13 12:30 Сейчас в теме
(4) VBod, кстати не могу войти в отладчик - как будто на сервер пытаюсь зайти в серверном фарианте)), у меня на форме кнопка, на ней такая процедура

Процедура ИмпортВебСервис()

ПроксиСервер = WSСсылки.WSСсылка1.СоздатьWSПрокси("www.URL.com","WebService","WebServiceSoap");

РезультатОбмена = ПроксиСервер.Obmen();


КонецПроцедуры // ()
обмен уже приводил выше. Как отладку включить?))
8. VBod 39 06.09.13 12:35 Сейчас в теме
(7) Manticor, а обработка вызова Web-Сервиса у вас расположена в той же базе, где и сам Web-Сервис что-ли?
9. Manticor 66 06.09.13 12:42 Сейчас в теме
(8) VBod, конечно, функция располагается в объекте конфы вебсервисе, операции Obmen - как и в статье
11. VBod 39 06.09.13 12:59 Сейчас в теме
(9) Manticor, а что бы запустить отладчик, нужно в каталоге публикации вашего сервиса на Apache открыть файл default.vrd и перед строкой
	<ws>

добавить строку
	<debug enable="true" url="tcp://localhost"/>

Затем в конфигураторе, в меню "Отладка" > "Подключение" > "Автоматическое подключение" установить флажок напротив пункта "Web-Сервисы". После этого можно ставить точку останова в вашей процедуре Obmen и вызывать сервис обработкой из другой базы.
Только учтите, что редактировать файл default.vrd нужно уже после публикации Web-Сервиса, т.к. при публикации он заменяется на создаваемый Apache по умолчанию.
12. Manticor 66 06.09.13 14:59 Сейчас в теме
(11) VBod, (10) VBod, сделал все как Вы и сказали, создал чистую базу, туда перенес обработку.
Единтсвенное - убрал аутентификацию, поскольку вроде с ней не работает).
В итоге код такой:
Определения = Новый WSОпределения("http://localhost/TorgMini/ru_RU/ws/WebService?wsdl");
	Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Obmen", "ObmenSoap");
	Прокси.Пользователь = "";
	Прокси.Пароль = "";
	
	РезультатыИмпорта = Прокси.Obmen();



{Обработка.ПробныйОбмен.Форма.Форма.Форма(11)}: Ошибка при вызове конструктора (WSПрокси)
Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Obmen", "ObmenSoap");
по причине:
Сервис не найден. {http://www.sample-package.org}:Obmen

Но зато заработал после добавлени функции отладки первоначальный код - отладчик выполняет функцию obmen, однако после вызова выводится ошибка:

{Обработка.ПробныйОбмен.Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (Obmen)
РезультатОбмена = ПроксиСервер.Obmen();
по причине:
Ошибка вызова операции сервиса: {www.URL.com}:WebService:Obmen()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.sample-package.org}Свойства - [18,3]
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.sample-package.org}Свойства - [18,3]
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://www.sample-package.org}Свойства
Проверка свойства 'Контрагент':
форма: Элемент
имя: {http://www.sample-package.org}Контрагент
тип: {http://www.w3.org/2001/XMLSchema}anyType
Не установлено значение одного из следующих свойств:
Прикрепленные файлы:
13. VBod 39 06.09.13 15:44 Сейчас в теме
(12) Manticor, как-то странно, как у вас мог заработать отладчик, если на строке получения прокси, пишет что сервис не найден?
Можете показать, что у вас в настройках публикации на веб-сервере и на закладках "Операции" и "Прочее" в настройках самого веб-сервиса?
14. Manticor 66 06.09.13 16:33 Сейчас в теме
(13) VBod,
Прикрепленные файлы:
15. VBod 39 06.09.13 17:08 Сейчас в теме
(14) Manticor, в веб-сервисе на закладке "Прочее" в "URI пространства имен" установите значение "http://www.sample-package.org".
И в коде у вас должно быть так:
Определения = Новый WSОпределения("http://localhost/TorgMini/ws/ws1.1cws?wsdl");

Когда сделаете, то проверьте работу веб-сервиса вбив строку "http://localhost/TorgMini/ws/ws1.1cws?wsdl" в адресную строку браузера. При этом должна появиться страница наподобие этой http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL
И без имени пользователя и пароля я думаю он у вас все же не соединиться.
16. Manticor 66 09.09.13 10:35 Сейчас в теме
(15) VBod, попробовал сделать так. Поставил аутентификацию - также как и было.

{Обработка.ПробныйОбмен.Форма.Форма.Форма(12)}: Ошибка при вызове конструктора (WSПрокси)
Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Obmen", "ObmenSoap");
по причине:
Сервис не найден. {http://www.sample-package.org}:Obmen

ссылка http://localhost/TorgMini/ru_RU/ws/ws1.1cws?wsdl в браузере работает и отображает текст xml
Прикрепленные файлы:
17. VBod 39 09.09.13 12:03 Сейчас в теме
(16) Manticor, извиняюсь, это уже я не правильно сказал, в этой строке должно быть:
Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "WebService", "WebServiceSoap");
18. Manticor 66 09.09.13 17:43 Сейчас в теме
(17) VBod, спасибо большое Вам, вроде без ошибок работает, тоесть сейчас при выполнении РезультатыИмпорта имеет такие данные(скрин приложил).
Что еще нужно сделать(добавить) для полноценной синхронизации контрагентов между 1С и сайтом и наоборот??

Сейчас на выходе у нас лишь объект XDTO.
Прикрепленные файлы:
19. VBod 39 09.09.13 18:06 Сейчас в теме
(18) Manticor, ну теперь доделывайте передачу остальных реквизитов, которые вам нужны и делайте на сайте вызов этого веб-сервиса. Неплохо бы сделать, что бы в ответ веб-сервис возвращал данные с подтверждением удачной загрузки или ошибку в случае неудачной, что позволит в случае ошибки отправлять данные повторно. Продумайте предварительную проверку (перед загрузкой), существования контрагента, это позволит избежать дублей. Затем пишите веб-сервис на сайте, для передачи контрагентов из 1С на сайт. Плюс читайте (5) и (6).
5. VBod 39 06.09.13 12:28 Сейчас в теме
(1) Manticor, на счет того
Как реализовать обратный обмен из сайта в 1С?

Вот с сайта в 1С как раз лучше выгружать используя Web-Сервис созданный в 1С. Т.е. вы сейчас создаете в 1С Web-сервис, который будет не передавать контрагентов на сайт, а наоборот принимать их с сайта. Это удобнее т.к. на сайте вы можете привязать вызов этого Web-сервиса к событию создания контрагента, таким образом создание контрагента в 1С у вас будет происходить практически синхронно вместе с его созданием на сайте.
6. VBod 39 06.09.13 12:30 Сейчас в теме
(1) Manticor, а вот на сайте уже нужно будет разработать еще один Web-Сервис на PHP, который будет создавать контрагентов. Затем при создании контрагента в 1С, нужно будет вызвать этот Web-Сервис и в параметрах передавать ему данные нового контрагента. Только не забудьте учесть, что в 1С, контрагент может быть как создан, так и удален или его данные могут быть изменены, поэтому нужно учесть возможность удаления и изменения контрагентов на сайте, если они изменяются или удаляются в 1С.
10. VBod 39 06.09.13 12:48 Сейчас в теме
Лучше создайте пустую базу и там разместите обработку вызывающую ваш Web-Сервис. И вызывайте его лучше не через статическую WS-Ссылку, а динамически:
Определения = Новый WSОпределения("http://localhost/ИмяПубликуемойБазы/WS/ИмяВебСервиса.1cws?wsdl", "ИмяПользователя", "Пароль");
Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Obmen", "ObmenSoap");
Прокси.Пользователь = "ИмяПользователя";
Прокси.Пароль = "Пароль";

РезультатыИмпорта = Прокси.Obmen();

Тогда можно будет запустить отладчик.
20. irlandets1980 23.09.13 11:44 Сейчас в теме
Доброго времени! У меня проблема на эту же тему:
По этой же статье ( http://infostart.ru/public/193460/#comm )создал сервис :
Адрес сервиса: http://109.195.230.156/test/ws/WebService?wsdl он работает, я смотрел в SoapUI номенклатура выбирается.
В новой базе создал обработку в ней кнопка на ней команда:
&НаКлиенте
Процедура Команда3(Команда)
ИмпортВебСервис();
КонецПроцедуры

&НаСервере
Процедура ИмпортВебСервис()

Определения = Новый WSОпределения("http://109.195.230.156/test/ws/WebService?wsdl");
Прокси = Новый WSПрокси(Определения, "http://www.my.org", "WebService", "WebServiceSoap");
РезультатыИмпорта = Прокси.Obmen();
КонецПроцедуры

При исполнении получаю:Метод объекта не обнаружен (Obmen)
На сервисе операция obmen есть
21. VBod 39 23.09.13 15:22 Сейчас в теме
(20) irlandets1980, может нужно добавить расширение у имени сервиса?
Определения = Новый WSОпределения("http://109.195.230.156/test/ws/WebService.1cws?wsdl");

Только лучше создайте новую тему, что бы не писать здесь. А мне можете кинуть ссылку в личку. Если смогу, постараюсь помочь.
Оставьте свое сообщение

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