Принимаем файл web сервисом 1с. Советы по доработке упп
Сегодня WEB сервисы используются практически повсеместно – именно они предоставляют нам информацию о рейсах самолетов и поездов, курсах валют и погоде. Неудивительно, что и 1С обладает возможностью создания собственных WEB сервисов, позволяющих выступать как в роли поставщика, так и потребителя. Данный механизм встроен в платформу «1С:Предприятие 8.3» и разработчики могут добавлять даже в типовую конфигурацию собственные объекты типа «WEB-сервисы». Их архитектура построена на наборе сервисов, позволяющих обмениваться информацией с другим программным обеспечением.
Создание веб-сервиса 1С
Одним из главных преимуществ WEB-сервисов 1С является отсутствие необходимости давать прямой доступ к данным ИБ. Правильно настроенный веб-сервис 1С позволяет другим приложениям пользоваться функциями извне. В таких случаях определять право пользования данными по заданным параметрам должна сама функция по прописанным разработчиком правилам.
Как создавать веб-сервис в 1С?
Чтобы определенная функция системы 1С стала доступна внешнему ПО, необходимо выполнить следующий алгоритм действий:
- Зайти в конфигурацию и в определенной ветке дерева добавить объект WEB-сервис;
- Описать все операции, которые сможет выполнять наш функционал. Описание функций производиться в модуле на встроенном в 1С языке;
- Добавить описание параметров функций веб-сервиса. Учтите, что типы данных описываются с учетом существующих типов механизма XDTO, появившегося в платформе версии 8.1;
- Опубликовать созданный WEB-сервис на сервере. Механизм, встроенный в платформу 1С, поддерживает следующие стандарты:
- SSL/TLS
- WS-I BP
Пример создания простого WEB-сервиса
Чтобы наиболее наглядно продемонстрировать работу механизма WEB-сервисов, создадим пример – функционал, определяющий длину введенной строки. Программное обеспечение передаст в качестве параметра запроса строку, а функция, описанная в 1С, вернет число символов. При создании нужно помнить, что публикация этого механизма даст возможность обращения к нему различного ПО. Так как не каждое ПО способно воспринимать кириллицу, будем называть объекты конфигурации, используя латинские знаки.
Открываем конфигуратор, находим в дереве ветку «WEB-сервисы» и добавляем новый сервис «wa_LengthString». Также необходимо на вкладке «Операции» добавить новую операцию. Назовем ее «CalcLengthString», в свойствах укажем тип возвращаемого значения – int или integer и создадим внутри нее параметр «InputString». Тип значения оставляем string.
Теперь необходимо прописать действие функции CalcLengthString в модуле WEB-сервиса. Для этого открываем свойства созданной функции и нажимаем кнопку в виде лупы справа, у поля ввода «Имя процедуры». 1С автоматически создаст функцию в модуле нашего WEB-сервиса и откроет его для того, чтобы мы описали действие CalcLengthString. Воспользуемся этим и напишем действие функции – определение длины вводимой строки.
Фактически на этом создание простейшего WEB-сервиса закончено. Теперь необходимо «выложить» этот сервис в общий доступ, чтобы стороннее ПО или другие системы 1С могли пользоваться данным функционалом.
Для того чтобы мы смогли опубликовать созданный веб-сервис с его функциональностью, нам необходимо иметь доступ на сайт. Перед тем как мы начнем публикацию сервиса, необходимо проверить имя файла в свойствах созданного модуля wa_LengthString. Оно должно быть понятное, простое и иметь расширение «1cws».
Теперь настало время публиковать созданный нами WEB-сервис на сервере. Эта возможность появилась в версии платформы 8.3 и многие компании уже поняли всю пользу этого функционала. Для того чтобы приступить к публикации, необходимо в конфигураторе открыть форму «Администрирование/Публикация на веб-сервере…».
В открывшемся окне нам необходима настройка Web сервисов 1С и заполнение определенных полей:
- Имя. Обозначает папку на веб-сервере, в которой будет храниться описание нашего веб-сервиса. Будьте внимательны к регистрам, так как иногда серверы различают символы большого и малого регистра;
- Веб-сервер. Необходимо выбрать сервер из установленных на компьютере;
- Каталог. Вы должны выбрать путь к папке, где хранятся данные веб-сервера по настройке подключения. Используются исключительно латинские буквы;
- Два признака типа «Булево». Первый нам пригодиться, если необходимо настроить доступ через веб-клиент к конфигурации. Для того чтобы опубликовать сервис 1С, необходимо поставить вторую отметку.
Остается лишь проверить, что у нужного WEB-сервиса установлена галка в первом столбце, и нажать на «Опубликовать».
Так как данный механизм еще достаточно новый, то вы можете столкнуться с ошибкой вида «Ошибка при выполнении файловой операции…». В этом случае вам нужно просто повторить нажатие «Опубликовать». В большинстве случаев это помогает, и вам покажется сообщение о том, что публикация веб-сервиса выполнена.
<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl
В ответ на такой запрос адреса браузер должен отобразить структуру файла XML. Если же вы видите пустую страницу, ошибку или непонятные символы (проблемы с кодировкой), то нужно еще раз проверить все действия. Также не лишним будет убедиться, что сервер настроен верно, и у вас есть к нему доступ. После успешной публикации WEB-сервис 1С смогут использовать сторонние приложения.
Благо ограничений на работу с веб-сервисами в ней нет.
Добавление Web-сервиса в метаданные
Открываем дерево конфигурации, ветка Общие , далее Web-сервисы , добавляем новый веб-сервис (назову его my_ws) и заполняем свойства как показано на рисунке.
Необходимо сделать несколько пояснений о свойствах веб-сервисов
- Пакеты XDTO — в этом поле указывается список пакетов XDTO, типы которых могут использоваться в значении, которое возвращается в результате выполнения операций веб-сервиса.
- URI пространства имен — это строка, которая задает URI пространства имен для данного веб-сервиса. Любой веб-сервис можно однозначно идентифицировать по сочетанию его имени и пространству имен. Необходимо четко понимать, что это свойство не имеет ничего общего ни с физическим адресом веб-сервера, ни с сайтом органицации и т.д. Это просто некий виртуальный адрес. Поэтому присваивать надо внятное имя, которое сможет рассказать, например, об области расположения и применения веб сервиса. В частности может присутствовать аббревиатура типовой конфигурации к которой веб-сервис относится.
Операции веб-сервиса
Чтобы обеспечить функционирование веб-сервиса, необходимо создать для него операции, которые будут выполнять определенные действия, а при необходимости и возвращать нужные данные.
В качестве примера создадим для нашего веб-сервиса операцию, которая будет возвращать классическую фразу «Привет мир!». Назовем ее Hello :
В модуле веб-сервиса создадим функцию ПриветМир() , ссылку на которую вставим в соответствующее свойство операции.
Функция ПриветМир() Возврат "Привет мир!" ; КонецФункцииНо у этой операции есть один недостаток. В нее нельзя передавать исходные данные. Для этих целей в операциях веб-сервисов используется подчиненные им объекты — Параметры .
Добавим еще одну операцию — HelloUsr , и создадим для нее параметр Name .
Эта операция будет у нас возвращать приветствие пользователю при помощи вызова вот такой функции:
Функция ПриветПользователь(ИмяПользователя) Возврат "Привет, " + ИмяПользователя + "!" ; КонецФункцииПубликация Web-сервиса
Теперь у нас все готово для публикации веб-сервиса. Для этого необходимо зайти в конфигуратор под правами администратора. Щелкаем по ярлыку 1С правой кнопкой и выбираем соответствующий пункт меню:
В меню выбираем Администрирование —> Публикация на веб-сервере
В открывшемся окне прописываем имя публикации, отмечаем пункт Публиковать Web-сервисы и также отмечаем созданный нами веб-сервис:
WS-ссылки
Для работы с веб-сервисами используется такой объект 1С как WS-ссылка . Она представляет собой WSDL описание веб-сервиса полученное путем импорта из источника на котором расположен веб-сервис. То есть в первую очередь нам надо знать адрес по которому мы сможем получить WSDL описание веб-сервиса. Применительно к нашему примеру в соответствии с настройками, которые мы делали в процессе создания и публикации веб-сервиса этот адрес будет выглядеть следующим образом
Http://localhost/professia1c/ws/my_ws.1cws?wsdl
Рассмотрим из каких же частей состоит этот адрес.
- http://localhost/ — это адрес указывает на физическое расположение веб-сервера. Так как у меня он находится на локальной машине, то localhost, а на практике это либо IP-адрес сервера, либо его имя
- professia1c — это имя публикации. Мы его вводили в поле Имя в диалоговом окне, когда публиковали веб-сервис
- ws — признак того, что мы обращаемся к веб сервису
- my_ws.1cws — имя файла публикации, которое мы указывали в свойствах при создании веб-сервиса
- ?wsdl — параметр, который указывает, что нам нужно получить WSDL описание
После публикации веб-сервиса, для того чтобы убедиться, что он успешно опубликован, можно ввести адрес его WSDL описания в адресную строку браузера. При этом мы должны получить в окне браузера XML файл примерно вот такого содержания:
- Использование динамической ws-ссылки.
- Создание статической ws-ссылки.
Рассмотрим каждый из этих способов
Динамические WS-ссылки
&НаСервере Процедура ПодключитьсяНаСервере() ВСОпределение = Новый WSОпределения("http://localhost/professia1c/ws/my_ws.1cws?wsdl" , "Сидоров" , "" ) ; ВСПрокси = Новый WSПрокси(ВСОпределение, "http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедурыКак нетрудно догадаться, результатом выполнения этой процедуры будет текст в окне сообщения «Привет, Вася!»
Статические WS-ссылки
Вместо программного создания объекта WSОпределения мы можем непосредственно в дереве конфигурации создать объект метаданных WS-ссылка. В процессе создания будет выведено окно с предложением указать адрес WSDL определения для его импорта:
После этого мы можем в коде ссылаться непосредственно на эту WS-ссылку. И процедура по обращению к веб-сервису примет вот такой вид:
&НаСервере Процедура ПодключитьсяЧересСсылкуНаСервере() ВСПрокси = WSСсылки. WSСсылка_my_ws. СоздатьWSПрокси("http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедурыНе буду останавливаться на вопросе, что такое веб-сервисы и зачем они нужны. В сети очень много статей на эту тему. Просто постараюсь вкратце показать, каким простым способом возможно создание клиента к любому веб-сервису на php.
Настройка
Для использования SOAP в php необходимо подключить модуль SOAP (входит в дистрибутив php5). Под windows это делается просто – необходимо дописать (именно дописать, так как эта строка там не просто закомментирована, она отсутствует вообще) в php.ini:
extension=php_soap.dll
Не забудьте перезапустить сервер, если php у вас установлен как модуль.
Создание SOAP-клиента по WSDL-документу
Создание SOAP-клиента обычно происходит по WSDL-документу, который представляет собой XML-документ в определенном формате, полностью описывающий тот или иной веб-сервис. За подробностями по поводу WSDL – отправляю Вас на сайт консорциума W3C - www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510 .
Главное же, что необходимо знать для того, чтобы построить клиента к веб-сервису – это знать URL его WSDL-документа.
Для примера возьмем веб-сервис «Currency Exchange Rate» от xmethods.com. Адрес этого веб-сервиса, который позволяет получать курсы валют в режиме онлайн - www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl .
Второй важный момент – из описания веб-сервиса необходимо получить информацию о том, какие методы этот сервис предоставляет, и какие параметры мы должны передавать ему в качестве входных значений (очень похоже на вызов обычной функции php или метода класса). Обычно эта информация содержится в описании сервиса на его сайте. Наш веб-сервис для получения курса валют предоставляет метод getRate(), которому в качестве аргументов передаются коды валют.
И последнее – важно знать, что ожидать в качестве ответа: сколько значений, какого типа и т.п. Это также можно получить из описания.
А в результате код получается очень простым и компактным, почти элементарным:
// Использование Web-сервиса
// "Currency Exchange Rate" от xmethods.com
// Создание SOAP-клиента по WSDL-документу
$client = new SoapClient("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");
// Поcылка SOAP-запроса и получение результата
$result = $client->getRate("us", "russia");
Echo ‘Текущий курс доллара: ’, $result, ‘ рублей’;
?>
Как видно из кода в конструктор класса SoapClient необходимо передать URL WSDL-документа и получить объект для работы с нужным веб-сервисом. Затем вызывается метод этого объекта, имя которого совпадает с именем самого метода веб-сервиса. Возвращает же этот метод желаемый нами результат.
Итак, этот простой пример иллюстрирует нам принцип построения SOAP-клиента для веб-сервисов на php. Однако в реальном приложении еще о многом придется позаботиться, в частности о том, что в момент обращения к веб-сервису он может быть временно недоступен или возвращать ошибку. Явно напрашивается использование блока try/catch/throw:)
Обмен данными обычно организовывается с помощью выгрузки файла из одной программы и загрузки в другую. Некоторые программисты предоставляют сторонним программам доступ в SQL базу 1С (что вроде как сильно не рекомендуется).
Термин «обмен данными» не всегда подходит к задаче, иногда более корректно сказать – предоставление данных. Например, внешней программе требуется идентифицировать – существует ли такой клиент в 1С и его баланс.
Предоставление доступа к данным 1С – некорректно по причинам безопасности данных. Необходим скорее механизм проверки по имени и паролю с дальнейшим возвратом баланса.
Этот подход называют – сервисным, когда программа предоставляет не данные, а сервис, который позволяет идентифицировать клиента и узнать его баланс.
Как это работает?
Функции извне вызываются (запускаются) запросом по протоколу SOAP .
Для передачи параметров и результатов используется . Для работы с веб-сервисами Вы должны иметь базовое понимание про .
Web сервисы 1С
Web сервис 1С это способ, с помощью которого можно разрешить запускать некоторые функции 1С снаружи базы 1С, в том числе из других программ или других баз 1С.
Это лучше, чем предоставление прямого доступа к данным 1С, так как при вызове метода (функции) web сервиса 1С, доступ к данным внешняя программа не имеет. Функция на языке 1С самостоятельно определяет право внешней программы получить конкретную толику данных по переданным параметрам (например, имени и паролю).
Во многих случаях, можно не создавать свой пакет XDTO, а использовать по умолчанию – выбрав из списка пакет www.sample-package.org
Методы web сервиса 1С
После этого нужно добавить список функций (методов веб сервиса 1С) – которые будут предоставляться наружу. Называть их лучше англоязычно. Функция может иметь параметры.
Базовые типы к использованию:
- string – строка
- int или integer – целое число
- real – дробное число
- date – дата.
Для каждой добавленной функции веб сервиса 1С, в свойствах нужно создать , так же, как мы это делали в , и так далее.
Именно эта функция 1С будет выполняться при вызове метода веб сервиса 1С. Не забывайте, что выполняться она будет на сервере 1С. Файловый режим работы 1С с веб-сервисами не рекомендуется.
Функция обычно возвращает какие-либо данные. Обычно указывают тип string и возвращают строку XML.
Строку XML можно сформировать с помощью объектов языка 1С для , а можно просто составить текстовую строку, в которой хранится текст XML.
Публикация web сервиса 1С
Как мы говорили раньше, другие программы должны «знать», что веб сервис 1С существует, имеет такой вот список методов и так далее.
Описание должно лежать на веб сайте. Для этого нужно:
- Иметь веб сайт
- В свойствах web сервиса 1С указать имя файла с расширением 1cws, который является ссылкой на WSDL описание
- Выложить этот файл на веб сайт в конфигураторе с помощью пункта меню Администрирование/Публикация на веб-сервере.
Браузер должен отобразить некий файл XML (пример файла WSDL здесь http://ru.wikipedia.org/wiki/WSDL), а не ошибку, не пустую страницу и не невнятный текст на любой кодировке.
После успешной публикации web сервис 1С можно использовать. Для этого в другой программе нужно использовать данный интернет адрес для ссылок на веб сервис 1С.
Например, Visual Studio позволяет для любого языка (C++, C#, Visual Basic) – включить в проект web сервис 1С по его WSDL описанию и сгенерировать класс для использования веб-сервиса 1С.
В этой статье я расскажу принципы работы с веб-сервисами Terrasoft из внешних приложений. С помощью этих механизмов можно реализовать различные интеграционные задачи с любой внешней системой.
Работать с Web-сервисами из сторонних приложений можно двумя способами, все зависит от цели использования и конкретного языка программирования:
1. Работа через COM-объекты Terrasoft
2. Работа с Web-сервисами напрямую
Работа через COM-объекты
Первый вариант наименее трудоемкий и более удобный, но требует, чтобы на клиентской машине были зарегистрированы библиотеки Terrasoft (для использования COM-объектов). При этом вся работа с Web-сервисами будет выполняться COM-объектами Terrasoft, предоставляя доступ к данным и объектам через объектную модель платформы Terrasoft: IDataset, ISelectQuery и т.д.
Для подключения программно нужно выполнить следующий код (пример на Jscript, но это можно реализовать на любом языке, который работает с COM-объектами):
// Создание экземпляров COM-объектов Connector и Configuration
WSConnector =
new
ActiveXObject("TSDskObjectLibrary.DskConnector"
)
;
// Для версий 3.4.0+ объект создается ActiveXObject("TSObjectLibrary.Connector")
var
WSConfiguration =
new
ActiveXObject("TSObjectLibrary.Configuration"
)
;
WSConfiguration.DBExecutorTypeCode
=
"WebServices"
;
// Кэшироование созданного соединения
Connector.Attributes
("WSConnector"
)
=
WSConnector;
// Установка строки соедения и название конфигурации настроенной на сервере
WSConfiguration.SetConnectionString
(
""URL=http://192.168.227.128/TSWebServicesServerLibrary.dll/soap/IServer""
+
","ConfigurationName=Dev332""
)
;
// Открытие конфигурации
var
IsConnected =
WSConnector.OpenConfiguration
(
WSConfiguration,
1
,
// Тип аутентификации: 0 - Windows Authentication, 1 - Server
"ddd"
,
// Имя пользователя
""
)
;
// Пароль
После успешного подключения можем обращаться к любым объектам, получать данные и т.д. Например получение данных о контрагентах:
// Получение сервиса ds_Account из коннектора к веб-сервисам
var
AccountDataset =
WSConnector.Services
.GetSingleItemByUSI
("ds_Account"
)
;
// Подготовка датасета: закрытие и очистка фильтров
AccountDataset.Close
()
;
EnableDatasetFilters(AccountDataset,
false
)
;
// Наложение фильтра по ID текущей записи
ApplyDatasetFilter(AccountDataset,
"ID"
,
dlData.Dataset
("ID"
)
,
true
)
;
// Открытие датасета
AccountDataset.Open
()
;
// Считывание данных
if
(AccountDataset.IsEOF
)
{
var
Value =
"(нет данных)"
;
edtWSName.Value
=
Value;
edtWSOfficialName.Value
=
Value;
edtWSCode.Value
=
Value;
}
else
{
edtWSName.Value
=
AccountDataset.ValAsStr
("Name"
)
;
edtWSOfficialName.Value
=
AccountDataset.ValAsStr
("OfficialAccountName"
)
;
edtWSCode.Value
=
AccountDataset.ValAsStr
("Code"
)
;
}
// Закрытие датасета
AccountDataset.Close
()
;
Во вложении полный пример работы с Web-сервисами на Jscript, используя COM-объекты.
Работа с Web-сервисами напрямую
Этот тип работы сложнее, т.к. все запросы к Web-сервисам нужно посылать самостоятельно, а также самому обрабатывать ответ от сервера. При этом не используются COM-объекты Terrasoft, соответственно не нужно устанавливать и регистрировать библиотеки Terrasoft на каждом клиентском компьютере, откуда будут запрашиваться веб-сервисы.
Запросы Web-сервисам можно отправлять исходя из их интерфейса (WSDL) – описания всех методов с параметрами.
Для упрощенной разработки программ для работы с Web-сервисами в некоторых IDE, например Visual Studio, предусмотрен импорт WSDL (Add WebService Reference), при этом сама IDE генерирует оберточные классы для работы с Web-сервисами. Вызывая методы такого класса вы будете упрощенно вызывать соответствующие методы веб-сервиса.
Упрощение заключается в том, что для вызова метода Web-сервиса нужно отправить полный XML запрос, а с помощью оберточных классов – просто вызвать соответствующий метод с параметрами.
Пример на C# :
// Создание клиента Web-сервиса
ws.
IServer
sc =
new
ws.
ServerClient
()
;
// ws.IServer – оберточный класс для работы с Web-сервисами Terrasoft
ws.
OpenConfigurationRequest
rqOpenConfiguration =
new
ws.
OpenConfigurationRequest
()
;
// Запросы для открытия конфигурации
ws.
OpenConfigurationResponse
rsOpenConfiguration =
new
ws.
OpenConfigurationResponse
()
;
// Открытие конфигурации
rqOpenConfiguration.
ACompressionLevel
=
0
;
//Without compression (zip)
rqOpenConfiguration.
AConfigurationName
=
Configuration;
rqOpenConfiguration.
ADBExecutorTypeCode
=
"MSSQL"
;
rqOpenConfiguration.
AUserName
=
UserName;
rqOpenConfiguration.
AUserPassword
=
Password;
rsOpenConfiguration =
sc.
OpenConfiguration
(rqOpenConfiguration)
;
При этом передачу данных, разбивку больших данных на пакеты, разбор ответа сервера и т.д. нужно реализовывать самостоятельно.
Во вложении полный пример работы с Web-сервисами на C#.
Отдельное спасибо Александру Кравчуку за предоставленные примеры.