веб сервис 1с – обмен данными XML
У нас на предприятии, где я работаю, обмены данными между конфигурациями реализованы через веб-сервисы 1с, которые крутятся на IIS. Решил для сделать заметку, о том, как быстро и просто можно запрограммировать такой веб-сервис и обеспечить обмен данными любыми объектами конфигурации через XML! В интернете много информации, но как по мне, не хватает четкого и детального разбора! Здесь мы попробуем это исправить!
В конце статьи сможете скачать архив базы с веб-сервисом и обработку, которая из любой базы отправляет объект в виде ‘xml’ по веб-сервису!
Сразу уточню: сама оснастка через что будет работать веб-сервис должна уже быть настроена: ISS или Apache или… . Здесь же мы рассмотрим веб-сервис обмена с точки зрения структуры конфигурации и программного кода. В моем случае это все работает на IIS.
Итак, первое что мы делаем в нашем примере, это на сервере (dbs2) где крутится сервер 1с (там же у меня и ISS) создаем новую базу (Test_Web_Service) / добавляем в ней роль “Полные права”/ создаем пользователя Admin без пароля. Отлично, с этим справились, далее создаем XDTO-пакет ‘craft1c_DataExchange‘ с пространством имен ‘http://www.craft1c.ru/mng‘ (можете придумать свое!):
Далее добавляем тип объекта ‘MessageInfo‘ – с помощью этого объекта мы будем возвращать информацию от веб-сервиса (дальше в коде поймете его суть):
И его свойства ‘Status‘, ‘IsError‘, ‘Description‘ – пускай они будут все одинакового и простого типа ‘string‘:
Отлично, мы создали XDTO-пакет. Теперь давайте создадим непосредственно сам наш веб-сервис ‘craft1c_DataExchangeService‘:
- Пространство имен: http://www.craft1c.ru/mng
- Пакет XDTO: http://www.craft1c.ru/mng (тот который мы создали выше)
- Имя файла публикации: craft1c_DataExchangeService.1cws
Далее добавляем операцию (метод который мы будем дергать из вне) ‘CreateDictionaryObject‘ и его ‘входной параметр ‘ObjectXML’ типа ‘string (http://www.w3.org/2001/XMLSchema)‘:
Со структурой данных в конфигураторе закончили, теперь осталось прописать код в модуле нашего веб-сервиса и пишем простой код обработки данных и возврата значения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
Функция CreateDictionaryObject(ObjectXML) УстановитьПривилегированныйРежим(Истина); Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.craft1c.ru/mng", "MessageInfo")); ТекстСообщения = ""; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ObjectXML); Пока ВозможностьЧтенияДанных(ЧтениеXML) Цикл Данные = ПрочитатьДанные(ЧтениеXML, ТекстСообщения); Если НЕ Данные = Неопределено Тогда Попытка Данные.Записать(); Исключение ТекстСообщения = ОписаниеОшибки(); КонецПопытки; КонецЕсли; Прервать; КонецЦикла; ЧтениеXML.Закрыть(); Если ЗначениеЗаполнено(ТекстСообщения) Тогда ДобавитьИнформациюОСобытии(Результат, "0", Истина, ТекстСообщения); Возврат Результат; КонецЕсли; ТекстСообщения = "Все успешно!"; ДобавитьИнформациюОСобытии(Результат, "1", Ложь, ТекстСообщения); Возврат Результат; КонецФункции Функция ВозможностьЧтенияДанных(ЧтениеXML) ТипXML = ПолучитьXMLТип(ЧтениеXML); Если ТипXML = Неопределено Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции Процедура ДобавитьИнформациюОСобытии(Сообщение, знач СтатусДокумента, ЯвляетсяОшибкой, знач ТекстСообщения) Сообщение.Status = СтатусДокумента; Сообщение.IsError = ЯвляетсяОшибкой; Сообщение.Description = ТекстСообщения; КонецПроцедуры Функция ПрочитатьДанные(ЧтениеXML, ТекстСообщения = "") ТипXML = ПолучитьXMLТип(ЧтениеXML); Возврат ЧтениеXML(ЧтениеXML, ТекстСообщения); КонецФункции Функция ЧтениеXML(ЧтениеXML, ТекстСообщения = "") ЭлементОбъект = Справочники.craft1c_ТестовыйСправочник.ПустаяСсылка(); // ЧтениеXML.Прочитать(); Пока ЧтениеXML.Прочитать() Цикл //стандартные механизмы чтения XML //ниже пример процедуры из моей конфигурации где считываются данные из xml //Вместо процедуры ЧтениеXML делаем свои процедуры: ПРИМЕР СМОТРИ В МОДУЛЕ: craft1c_МодульСПримерами //ЧтениеКонтрагенты //ЧтениеДоговорыКонтрагентов КонецЦикла; //в результате разбора xml по полченным данным к примеру ищем по нужным параметрам элемент справочника (либо нашли либо нет) //и заполняем реквизиты по данным из xml //возвращем элемент справочника и записываем его: Возврат ЭлементОбъект; Конецфункции |
Когда из вне мы будем дергать наш метод, то в качестве параметра получим xml объект, которые программно обработаем так как нам нужно:
А в качестве ответа вернем объект из описанного нами XDTO пакета:
Ребят, смотрите внимательно код в конфигурации – там есть тестовые примеры из моего боевого обмена, в модуле ‘craft1c_МодульСПримерами’.
Отлично, с кодом разобрались – теперь публикуем наш веб-сервис (запускаем конфигуратор под правами администратора!). Идем в меню ‘Администрирование/Публикация на веб-сервере…‘:
Перезагружаем ISS. Проверяем что веб-сервис появился в каталоге (файл default.vrd) и там есть файл ‘web.config‘ (есть данный файл у меня в архиве – его структура зависит от версии платформы и расположения файла ‘wsisapi.dll’):
Далее с локального компьютера можем проверить что наш веб-сервис работает и видна его структура (значит в модуле веб-сервиса ошибок нет). Вбиваем путь в браузер и проверяем ‘http://dbs2/Test_Web_Service/ws/craft1c_DataExchangeService.1cws‘ (авторизация – пользователь и пароль из базы 1с – Admin / пустой пароль):
Если мы все сделали правильно и без ошибок, то появится примерно такое окно:
Все супер! Наш веб-сервис работает, теперь осталось только научиться передавать его данные и проверять жив ли он!
Создадим новую обработку и напишем код проверки доступности нашего веб-сервиса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
&НаКлиенте Процедура Отправить(Команда) Отказ = Ложь; ТекстСообщения = ""; ПроверитьПодключение(Отказ, ТекстСообщения); Сообщить(ТекстСообщения); Если Отказ Тогда Возврат; КонецЕсли; КонецПроцедуры Функция ПроверитьПодключение(Отказ, ТекстСообщения) Экспорт Сообщение = ""; НастройкиПодключения_Путь = "http://dbs2/Test_Web_Service/ws/craft1c_DataExchangeService.1cws"; Пользователь = "Admin"; Пароль = ""; Попытка Определения = Новый WSОпределения(НастройкиПодключения_Путь + "?wsdl", Пользователь, Пароль); ТекстСообщения = "Успешно подключились!"; Исключение Инфо = ИнформацияОбОшибке(); ТекстСообщения = "Ошибка подключения к Веб сервису: " + КраткоеПредставлениеОшибки(Инфо); Отказ = Истина; КонецПопытки; Отказ = Ложь; КонецФункции |
Запустим её из базы источника и проверим доступен ли веб-сервис нашей базы приемника:
Отлично, теперь все что нам осталось – это отправить нужный нам объект для обмена по веб-сервису в формате ‘xml’ и получить от него ответ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
&НаКлиенте Процедура Отправить(Команда) Отказ = Ложь; ТекстСообщения = ""; ПроверитьПодключение(Отказ, ТекстСообщения); Сообщить(ТекстСообщения); Если Отказ Тогда Возврат; КонецЕсли; СоздатьЭлементСправочникаЧерезСервис(); КонецПроцедуры &НаСервере Процедура СоздатьЭлементСправочникаЧерезСервис(); ОбъектXML = Новый ЗаписьXML; ОбъектXML.УстановитьСтроку(); ЗаписатьXML(ОбъектXML, ОтправляемыйОбъект.ПолучитьОбъект()); СтрокаXML = ОбъектXML.Закрыть(); Результат = Новый Структура("Статус, ЯвляетсяОшибкой, Описание"); СообщениеОбОшибке = ""; НастройкиПодключения_Путь = "http://dbs2/Test_Web_Service/ws/craft1c_DataExchangeService.1cws"; Пользователь = "Admin"; Пароль = ""; Определения = Новый WSОпределения(НастройкиПодключения_Путь + "?wsdl", Пользователь, Пароль); Если Определения = Неопределено Тогда Возврат; КонецЕсли; ПространствоИмен = "http://www.craft1c.ru/mng"; ИмяСервиса = "craft1c_DataExchangeService"; Прокси = Новый WSПрокси(Определения, ПространствоИмен, ИмяСервиса, ИмяСервиса + "Soap"); Прокси.Пользователь = Пользователь; Прокси.Пароль = Пароль; //Отправка СообщениеXDTO = Неопределено; Попытка СообщениеXDTO = Прокси.CreateDictionaryObject(СтрокаXML); Исключение Инфо = ИнформацияОбОшибке(); СообщениеОбОшибке = "Ошибка получения данных (Веб сервис): " + КраткоеПредставлениеОшибки(Инфо); Сообщить(СообщениеОбОшибке); Возврат; КонецПопытки; Если СообщениеXDTO = Неопределено Тогда Возврат; КонецЕсли; //Обработка результата Результат.Статус = СообщениеXDTO.Status; Результат.ЯвляетсяОшибкой = СообщениеXDTO.IsError; Результат.Описание = СообщениеXDTO.Description; Если Результат.ЯвляетсяОшибкой Тогда Если Не ЗначениеЗаполнено(СообщениеОбОшибке) Тогда СообщениеОбОшибке = Результат.Описание; КонецЕсли; Иначе СообщениеОбОшибке = "Обмен выполнен успешно!"; КонецЕсли; КонецПроцедуры |
Отлично, давайте включим отладку веб-сервиса и посмотрим что происходит на его стороне:
На стороне веб-сервиса все работает – xml объект улетел, а что же происходит после вызова веб-сервиса на стороне базы источника:
А вот на стороне базы источника получаем ошибку (наш xdto-пакет). По ошибке понятно, что в тестовом примере мы не создали сам объект справочника, поэтому программа не может его записать. Исправляем это и снова пробуем сделать обмен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Функция ЧтениеXML(ЧтениеXML, ТекстСообщения = "") ЭлементОбъект = Справочники.craft1c_ТестовыйСправочник.ПустаяСсылка(); // ЧтениеXML.Прочитать(); Пока ЧтениеXML.Прочитать() Цикл //стандартные механизмы чтения XML //ниже пример процедуры из моей конфигурации где считываются данные из xml //Вместо процедуры ЧтениеXML делаем свои процедуры: ПРИМЕР СМОТРИ В МОДУЛЕ: craft1c_МодульСПримерами //ЧтениеКонтрагенты //ЧтениеДоговорыКонтрагентов КонецЦикла; //в результате разбора xml по полченным данным к примеру ищем по нужным параметрам элемент справочника (либо нашли либо нет) //и заполняем реквизиты по данным из xml //возвращем элемент справочника и записываем его: ЭлементОбъект = Справочники.craft1c_ТестовыйСправочник.СоздатьЭлемент(); ЭлементОбъект.Наименование = "Тест"; Возврат ЭлементОбъект; Конецфункции |
Вот таким вот нехитрым способом можно сделать обмен данными через веб-сервис. В этой заметке показана основа архитекторы обмена, если все делать красиво то нужно учитывать множество моментов:
- Для внешних подключений лучше всего сделать отдельный справочник, где хранить строку подключения к веб-сервису, логин и пароль;
- Регистрацию ошибок производить в регистр сведений;
- и т.д.
Как и обещал, выкладываю архив со всеми нужными файлами, что бы вам да и мне проще было разобраться. Всем удачи! И хороших обменов! Пока!
Скачать файлыcraft1c_ObmenSVebServisom.rar
+ вторая часть работы с веб-сервисом: обмен данные через коллекцию значений!
https://craft1c.ru/veb-servis-1s-obmen-dannymi-cherez-kollekciju/