Добрго времени!
Подскажите, как привильно сделать синхронизацию контрагентов между 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, теперь такое выводит
{Обработка.ПробныйОбмен.Форма.Форма.Форма(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
Не установлено значение одного из следующих свойств:
(9) Manticor, а что бы запустить отладчик, нужно в каталоге публикации вашего сервиса на Apache открыть файл default.vrd и перед строкой
<ws>
добавить строку
<debug enable="true" url="tcp://localhost"/>
Затем в конфигураторе, в меню "Отладка" > "Подключение" > "Автоматическое подключение" установить флажок напротив пункта "Web-Сервисы". После этого можно ставить точку останова в вашей процедуре Obmen и вызывать сервис обработкой из другой базы.
Только учтите, что редактировать файл default.vrd нужно уже после публикации Web-Сервиса, т.к. при публикации он заменяется на создаваемый Apache по умолчанию.
(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, однако после вызова выводится ошибка:
(12) Manticor, как-то странно, как у вас мог заработать отладчик, если на строке получения прокси, пишет что сервис не найден?
Можете показать, что у вас в настройках публикации на веб-сервере и на закладках "Операции" и "Прочее" в настройках самого веб-сервиса?
(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 И без имени пользователя и пароля я думаю он у вас все же не соединиться.
(15) VBod, попробовал сделать так. Поставил аутентификацию - также как и было.
{Обработка.ПробныйОбмен.Форма.Форма.Форма(12)}: Ошибка при вызове конструктора (WSПрокси)
Прокси = Новый WSПрокси(Определения, "http://www.sample-package.org", "Obmen", "ObmenSoap");
по причине:
Сервис не найден. {http://www.sample-package.org}:Obmen
(17) VBod, спасибо большое Вам, вроде без ошибок работает, тоесть сейчас при выполнении РезультатыИмпорта имеет такие данные(скрин приложил).
Что еще нужно сделать(добавить) для полноценной синхронизации контрагентов между 1С и сайтом и наоборот??
(18) Manticor, ну теперь доделывайте передачу остальных реквизитов, которые вам нужны и делайте на сайте вызов этого веб-сервиса. Неплохо бы сделать, что бы в ответ веб-сервис возвращал данные с подтверждением удачной загрузки или ошибку в случае неудачной, что позволит в случае ошибки отправлять данные повторно. Продумайте предварительную проверку (перед загрузкой), существования контрагента, это позволит избежать дублей. Затем пишите веб-сервис на сайте, для передачи контрагентов из 1С на сайт. Плюс читайте (5) и (6).
Вот с сайта в 1С как раз лучше выгружать используя Web-Сервис созданный в 1С. Т.е. вы сейчас создаете в 1С Web-сервис, который будет не передавать контрагентов на сайт, а наоборот принимать их с сайта. Это удобнее т.к. на сайте вы можете привязать вызов этого Web-сервиса к событию создания контрагента, таким образом создание контрагента в 1С у вас будет происходить практически синхронно вместе с его созданием на сайте.
(1) Manticor, а вот на сайте уже нужно будет разработать еще один Web-Сервис на PHP, который будет создавать контрагентов. Затем при создании контрагента в 1С, нужно будет вызвать этот Web-Сервис и в параметрах передавать ему данные нового контрагента. Только не забудьте учесть, что в 1С, контрагент может быть как создан, так и удален или его данные могут быть изменены, поэтому нужно учесть возможность удаления и изменения контрагентов на сайте, если они изменяются или удаляются в 1С.
Доброго времени! У меня проблема на эту же тему:
По этой же статье ( 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 есть