В данной статье будет рассмотрены вопросы интеграции 1С с уже существующими веб-сервисами и использование самой 1С как веб-сервиса.
При этом под веб-сервисами будет пониматься системы, работающие в интернете и обеспечивающие взаимодействие с ними не только по SOAP (что является именно веб-сервисом), но и другими способами, включая обычные HTTP(S)-запросы.
Далее для экономии веб-сервис будет именоваться просто сервис.
Оглавление
Правила построения сервисов по продаже. 1
Использование 1С как сервиса. 1
Правила разработки сервиса на базе 1С. 1
В платформе 1С81 появилась реализация веб-сервисов.
Но их использование чревато рисками:
Клиенту выдается документ о продаже (чек) только в том случае, если транзакция по сервису прошла успешно. Иначе возможна ситуация, когда клиент получит чек и будет пребывать в уверенности, что получил услугу, а на самом деле это не так.
Веб-сервисы SOAP используют WSDL схемы и объекты XDTO для представления данных.
Для того, чтобы использовать внешний сервис, нужно загрузить его WSDL-схему.
Иногда WSDL-схема не загружается в 1С. Проверить валидность (правильность) схемы можно любым валидатором WSDL-схем, например http://www.validwsdl.com/.
Нужно загрузить схему на какой-нибудь http-сайт (можно по ftp) и указать адрес файла, в который загружена схема:
Особенность загрузки WSDL в 1С в том, что валидные схемы могут не загружаться. Никакого встроенного валидатора нет, поэтому приходится искать ошибку методом деструктивного анализа, последовательно уменьшая количество элементов в схеме. Можно, например, удалить описание веб-сервиса.
1С не любит слово «policies». Если WS-ссылка не загружается, нужно убрать все, что связано с этим словом в любом XML-редакторе.
Для тестирования работающего внешнего веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf» из пакета к этой статье.
Тестирование можно использовать на примере сервиса Morpher, склоняющего имена (адрес сервиса http://www.morpher.ru/WebServices/Morpher.asmx?WSDL ):
Таким способом можно протестировать любой сервис, который имеет простые точки входа, содержащие параметры простых типов: число, дата, строка.
В обработке можно указать также логин и пароль, которые требуются для авторизации доступа к веб-сервису.
Для отладки можно использовать программу SoapUI, который может передать произвольный запрос веб-сервису и получить от него ответ.
К сожалению, SOAP в 1С достаточно капризно ведет себя при работе через протокол HTTPS, практика показывает, что добиться HTTPS соединения невозможно, хотя возможность и продекларирована в платформе. Сказывается отсутствие средств диагностики и отладки для выяснения причин, из-за которых не устанавливается соединение. Поэтому удобно использовать SOAP через CURL.
Встроенный механизм использования HTTPS подразумевает, что все сертификаты должны быть опубликованы в общем файле pem в каталоге программы 1С.
Правилом хорошего тона является создание в сервисе операцию, которая информирует о том, что сервис доступен. Это облегчает жизнь интеграторов, им будет проще проверять, налажена ли связь с сервисом.
Например, можно использовать операцию Hello без параметров, которая просто возвращает булево значение Истина.
Процедура хорошо описана в документации: file:///C:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81.htm#_Toc176167634 :
Задача публикации Web-сервисов сводится к размещению конфигурационных файлов *.1cws Web-сервисов в соответствующем каталоге веб-сервера с соответствующими настройками для веб сервера. Для того, чтобы выполнить публикацию Web-сервисов, следует выполнить команду меню «Администрирование | Публикация Web-сервисов».
В результате выполнения этой команды будет открыто окно публикации Web-сервисов.
Окно публикации Web-сервисов содержит путь к веб-серверу и два списка:
· «Web-сервисы» – список Web-сервисов конфигурации;
· «Публикация» – список Web-сервисов, опубликованных на указанном веб-сервере.
С помощью кнопки «Соединение…» следует указать веб-сервер, на котором требуется опубликовать Web-сервисы.
Окно выбора пути к веб-серверу позволяет указать путь двумя способами:
· на закладке «Файлы» – этот способ используется в том случае, когда публикация выполняется на том же компьютере, на котором установлен веб-сервер. В качестве пути указывается локальный каталог, соответствующий интернет-странице, с которой будет выполняться вызов публикуемого Web-сервера;
· на закладке «FTP сайт» – этот способ используется в том случае, когда требуется опубликовать Web-сервис на удаленном компьютере. Для выполнения публикации необходимо указать параметры FTP-соединения с удаленным компьютером и каталог, в котором будет опубликован Web-сервис.
Публикация выбранного Web-сервиса осуществляется с помощью кнопки «Опубликовать»
Для отмены публикации Web-сервиса используется кнопка «Удалить».
Для обновления списка опубликованных Web-сервисов используется кнопка «Обновить текущий список».
Публиковать можно в локальном каталоге или по FTP. Можно публиковать и на удаленный сервер по UNC-пути, если удаленный сервер входит в локальную сеть.
После публикации веб-сервис доступен по адресу «http://localhost/test.1cws» или «http://xxx.ru/test.1cws», где xxx.ru – адрес удаленного сервера а localhost – типовой адрес локального сервера.
Для доступа к сервису нужно пройти аутентификацию.
Вопросы авторизации хорошо рассмотрены тут: http://www.forum.mista.ru/topic.php?id=341168 и в документации file:///c:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81.htm
Обычно веб-сервис работает под одним конкретным пользователем (чаще - специально созданным). Можно пользователя 1С "прикрепить" средствами Windows-аутентификации к пользователю Windows IUSR_<> (для пользователя отключить авторизацию 1С). Как вариант, можно очистить список пользователей 1С, тогда авторизация не требуется.
Если требуется несколько пользователей, то можно создать несколько логинов для веб-сервера, к каждому из них привязать пользователя Windows и соответственно, прописать в 1С доступ к пользователям Windows.
В свойствах Пользователь и Пароль объекта WSПрокси используется не логин 1С, а логин пользователя веб-сервера.
Для тестирования 1с как веб-сервиса используйте обработку «ТестПроизвольногоВебСервиса.epf», как описано в разделе «Тестирование работающего внешнего веб-сервиса».
Файл 1cws и является WSDL-описанием веб-сервиса 1С.
Обычно в рознице сервисы используются для оказания различных услуг населению – прием платежей, погашение кредитов, денежные переводы, покупка программного обеспечения и т.п.
При этом по оказанной услуге в 1С формируется чек, в котором сохраняются параметры транзакции. После чего этот чек распечатывается клиенту с подробной информацией об оказанной услуге. Возможна печать предварительного чека, для того, чтобы клиент подтвердил введенные с его слов данные своей подписью.
Сервис может быть по-разному интегрирован в розничную программу, написанную на языке 1С (УТ, Розница и другие):
Для хранения информации о транзакции в чеке необходимо создать дополнительную табличную часть «Сложные продажи» с реквизитами:
Справочник «Сложные продажи: Параметры» содержит перечень параметров транзакции.
Табличную часть выгоднее использовать, чем набор реквизитов, т.к. у транзакции их может быть очень много, а в других чеках, не связанных с сервисом, эти реквизиты не будут использоваться, и будут занимать лишнее место. Кроме того, такое решение универсально для любого сервиса и не требует реструктуризации данных после внедрения нового сервиса.
Продавцу делается отдельная закладка (или печатная форма, чтобы не менять конфигурацию), в которой он может посмотреть табличку реквизитов транзакции для чека.
Рассмотрим на примере условной услуги Paym для конфигурации «Розница».
Если (Номенклатура = Справочники.Номенклатура.Paym) И (ВидОперации <> Перечисления.ВидыОперацийЧекККМ.Возврат) Тогда
ОбработкаПлатежа = Функции.ДатьВнешнююОбработку("Paym");
ФормаПлатежа = ОбработкаПлатежа.ПолучитьФорму();
Результат = ФормаПлатежа.ОткрытьМодально();
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
ИначеЕсли ВидОперации <> Перечисления.ВидыОперацийЧекККМ.Возврат И Выборка.НомеклатураСсылка = Справочники.Номенклатура.Paym Тогда
//Осипов PaymMaster
СтрокаСложныхПродаж = СложныеПродажи.Найти(Справочники.СложныеПродажиПараметры.PaymТекстЧека, "Реквизит");
Если СтрокаСложныхПродаж <> Неопределено Тогда
Товар.Наименование = СокрЛП(СтрокаСложныхПродаж.Значение);
КонецЕсли;
Отдельный вопрос – как обеспечить завершенность транзакции. Т.е. если транзакция прошла в сервисе, как сделать, чтобы она не потерялась в 1С. Наиболее оптимальный путь – сверка реестров. Но это предмет отдельного рассмотрения.
Часто в веб-сервисах используется XDTO. Приведем наиболее важные советы и рецепты по использованию XDTO в 1С.
XDTO-пакеты, описанные в ветке «XDTO-объекты» конфигурации, доступны для создания типов и объектов в глобальной фабрике Фабрика XDTO. Это не сразу становится очевидным.
Некоторые типы в схеме не имеют имени, чтобы их получить, надо пройтись по иерархии типов.
В примере был описан список System, содержавший структуры XDTO. Чтобы создать саму структуру, нужно было получить ее тип таки вот образом:
Тип = Фабрика.Тип("urn:my.ru:MasterData:Business", "Business").Свойства.Получить("System").Тип;
В некоторых форматах теги называются xs:, в некоторых xsd:, но 1С благополучно понимает оба формата. Однажды была ситуация, что XSD нормально без ошибок импортировалась в 1С, но не создавала ни одного пакета. Причина была в отсутствии атрибута targetNamespace у тега <xsd:schema>, соответственно 1С не знала, в какой пакет помещать схему, но ошибок не выдавала.
Учитывая, что сервис – это совокупность двух систем – 1с и внешней, ошибки могут быть в обоих системах, что снижает общую надежность работы.
Для того, чтобы проще было разбираться в причинах отказов в работе сервисов, рекомендуется использовать комплекс мер.
Рекомендуется сохранять все запросы и ответы на них в каталог программы, файлы сохранять в папки вида ГГГГММДД по дням. Это очень способствует пониманию причин проблем.
Обработка «ТестПроизвольногоВебСервиса.epf»