Веб-сервисы в 1С | Самара

Web-сервисы в 1С, настройка, создание, пример веб-сервиса в 1С, публикация веб-сервиса на серере, описание работы веб-сервисов, проверка работы веб-сервиса

Особенности работы методов веб-сервисов

Большинство методов обоих веб-сервисов имеют выходной параметр – строку ErrorMessage. В случае если внутри конфигурации произошла ошибка, связанная с бизнес-логикой – в эту строку будет записана информация об этой ошибке. Если ошибок в процессе работы метода не было – в строку ErrorMessage будет помещена пустая строка. Если же в процессе работы метода возникла системная ошибка (например, на стороне конфигурации не удалось разархивировать полученный архив) – веб-метод  сгенерирует исключение (exception).

Большинство методов  обоих веб-сервисов возвращают строки, но в текущей версии возвращаемые строки всегда пустые (кроме EnterpriseDataUpload.PutDataActionResult – он возвращает статус обработки данных на стороне конфигурации – “Active”, “Completed” либо “Failed”).

Ниже на примерах мы рассмотрим, как использовать эти веб-сервисы для обмена данными с конфигурациями из языков C# и Java.

Добавление Web-сервиса в метаданные

Открываем дерево конфигурации, ветка Общие, далее Web-сервисы, добавляем новый веб-сервис (назову его my_ws) и заполняем свойства как показано на рисунке.

Необходимо сделать несколько пояснений о свойствах веб-сервисов

  • Пакеты XDTO — в этом поле указывается список пакетов XDTO, типы которых могут использоваться в значении, которое возвращается в результате выполнения операций веб-сервиса.
  • URI пространства имен — это строка, которая задает URI пространства имен для данного веб-сервиса. Любой веб-сервис можно однозначно идентифицировать по сочетанию его имени и пространству имен. Необходимо четко понимать, что это свойство не имеет ничего общего ни с физическим адресом веб-сервера, ни с сайтом органицации и т.д. Это просто некий виртуальный адрес. Поэтому присваивать надо внятное имя, которое сможет рассказать, например, об области расположения и применения веб сервиса. В частности может присутствовать аббревиатура типовой конфигурации к которой веб-сервис относится.

Зачем встраивать веб-сервисы в 1С?

Как разработчик 1С я могу назвать 5 ситуаций, когда возникает реальная потребность в использовании веб-сервисов:

  • Источник и получатель данных удалены друг от друга или, говоря другими словами, существуют ограничение на файловый обмен/использование общих файловых хранилищ. Конечно, в этом случае можно работать с облачными хранилищами, например, Яндекс.Диском, но такой подход не всегда удобен.
  • Инициатором общения выступает клиент, а значит стандартные файловые обмены 1С могут не подойти, так как они имеют ограниченный функционал. Конечно, вы можете настроить расписание или обмениваться файлами после определенных событий. Но все это не гарантирует высокой доступности данных.
  • В обмене данными участвуют разнородные платформы — это могут быть разные ОС, языки программирования, различный софт. Организовать обмен данными между ними без COM-Connector, библиотек интеграции или веб-сервисов будет очень сложно.
  • Существует необходимость высокой доступности данных, а счет идет на миллисекунды. В этом случае файловые обмены по расписанию не подходят в принципе. Даже веб-сервис нужно выстраивать правильно, чтобы обмен данными шел достаточно быстро.
  • Когда нет возможности использовать COM Connector, приходится заниматься веб-сервисами, например, если у нас больше 1 базы данных, и все они используют разную версию платформы. Придется придумывать способ динамически актуализировать версию COM Connector’а. Для подобных ситуаций существуют скрипты, но их реализация требует грамотного подхода и комплексной поддержки. К тому же COM Connector позволяет запускать вообще любые скрипты, и он порой оказывается запрещен именно по соображениям информационной безопасности.

Во всех этих ситуациях для решения задачи обмена данными подходят веб-сервисы. Они не позволяют исполнять на сервере произвольные скрипты, открывают возможности для ускоренного обмена данными, а также не зависит от конкретных версий ПО, платформ или характеристик канала связи.

В случае, когда речь идет об интеграции с разнородными системами, веб-сервисы помогают избежать трудоемких доработок. Например, стандартная выгрузка 1С может хорошо подойти для сайта, а также для клиентов под Windows и Linux. Но стоит добавить в эту экосистему Android, придется все переписывать и делать заново. Чтобы такое не происходило, я стараюсь делать такие интеграции через HTTP.

Создание веб-сервиса 1С

Одним из главных преимуществ WEB-сервисов 1С является отсутствие необходимости давать прямой доступ к данным ИБ. Правильно настроенный веб-сервис 1С позволяет другим приложениям пользоваться функциями извне. В таких случаях определять право пользования данными по заданным параметрам должна сама функция по прописанным разработчиком правилам.

Что такое веб-сервисы в 1С?

Если говорить простыми словами, то веб-сервис «1С» – инструмент, позволяющий использовать различные функции этого софта вне базы программы «1С». Например, из другой утилиты.

Использование веб-сервисов является более предпочтительным вариантом, чем предоставление прямого доступа к информации «1С». Т.к. в этом случае у внешней утилиты нет доступа к сведениям софта, ограничивающего ее права (прописываются разработчиком).

Веб-сервисы «1С» располагаются в ветке «Общие» в подразделе «Web-сервисы».

Обратите внимание: программа дает возможность формирования веб-сервисов, позволяющих работать в качестве:

  1. Потребителя веб сервисов, опубликованных другими поставщиками.
  2. Поставщика.

В версии «1С: Предприятие 8.3» свои WEB-сервисы можно включать даже в типовые конфигурации для обмена данными с другим софтом.  

Поставщик WEB-сервисов

Веб-сервис поставщика – объект, используя который можно описать определенную функциональность прикладного решения. К примеру, составление перечня имеющейся на складе продукции, их стоимости и числа. После опубликования на сервере, информация будет открыта для других пользователей-потребителей.

В роли пользователей-потребителей могут выступать пользователи произвольных программных и аппаратных платформ.

Потребитель веб-сервисов

В этом случае речь идет о возможности указания ссылки на WEB-сервис, который опубликован сторонним поставщиком. После прикладное решение в собственных прикладных внутренних алгоритмах сможет работать с информацией, доступной от этого WEB-сервиса.

Подготовка базы для взаимодействия по API.

Публикация на web-сервере.

Для начала необходимо опубликовать базу данных на web-сервере, в нашем случае это IIS. Публикацию возможно выполнить только через ЛК кабинет. После выполнения данной операции Вы получаете ссылку следующего вида: https://terminal.scloud.ru/01/login_base01.

0c87a75b624423ce8a334d8cef355998.jpg

036182506411831f223c1f035292a065.jpg

Настройка сквозной авторизации.

При обращении к базе данных по API потребуется сквозная авторизация. Для ее обеспечения следует создать в базе пользователя с логином и паролем аналогичными учетным данным для основного или дополнительного пользователей. Также следует дать данному пользователю полные, либо необходимые для взаимодействия права.

c65b84de2471cff2e76fb50a1623fbe7.jpg

Проверка наличия сервиса в конфигурации.

По умолчанию будут опубликованы все стандартные web-сервисы конфигурации. В таком режиме публикации к web-сервисам следует обращаться по ALIAS.

Узнать наименования сервисов, доступных для взаимодействия с данной конфигурацией, можно следующим образом:

Следует открыть базу данных в режиме конфигуратора, раскрыть раздел «Общие», раскрыть подраздел «Web-сервисы» или «HTTP-сервисы» соответственно, далее найти наименование интересующего сервиса.

458990bf3ff1d803de94e43989d8afe3.jpg

Проверить правильность выполняемых действий можно следующим образом.

В любой конфигурации есть стандартный WS «EnterpriseDataExchange», к нему можно обратиться следующим образом.

Открыть подраздел Web-сервисы выбрать «EnterpriseDataExchange», в примере это «EnterpriseDataExchange_1_0_1_1» проверяем во вкладке «Прочее» его ALIAS – «EnterpriseDataExchange_1_0_1_1.1cws».

a99b35c7c76358f1963a532aedc8486c.jpg

Теперь обращаемся к сервису через браузер добавив к ссылке на базу /ws/EnterpriseDataExchange_1_0_1_1.1.1cws?wsdl 

Пример:

terminal.scloud.ru/01/sc60889_base03/ws/EnterpriseDataExchange_1_0_1_1.1cws?wsdl

При запросе логина и пароля следует ввести учетные данные пользователя, которые использовались для настройки сквозной авторизации.

cc3648962f77e631c6490dcfad6963e1.jpg

Если при ответе на запрос получаем xml данные, значит предварительная настройка произведена корректно.

48cbd64ebcb470d730ad55d577246cb4.jpg

Нюансы создания веб-сервисов для 1С

Если выбор в пользу веб-сервисов уже сделан, далее необходимо определиться с архитектурой —- SOAP или HTTP (в терминологии 1С — Web-сервисы и HTTP-сервисы). И надо учитывать ограничения обоих форматов.

Для SOAP характерны более тяжелые сообщения. При обращении к веб-сервису происходит выгрузка всего содержимого, и пользователь получает пакет с мета-данными и описанием самого сервиса. И если сервис достаточно тяжелый, все это может занять значительное время — вплоть до нескольких секунд.

Не все платформы поддерживают SOAP и XML. Например, если у вас был опыт работы с Android, и вы пробовали настроить обмен сообщениями с Android-приложениями, то знаете, что у них нет привычных для 1С средств разбора XML и SOAP. Можно, конечно, перейти на Json, но даже это не решает всех вопросов, одновременно создавая дополнительные сложности интеграции.

Наконец, не все платформы имеют одинаковый взгляд на формат сообщений в рамках обмена. Даже четкое описание SOAP-сервиса, но с нехарактерной для 1С структурой, потребует дополнительных усилий при интеграции: в таком случае приходится парсить XML внутри конфигурации, а это — трудоемкая задача.

Подобная проблема есть и с другой стороны: некоторые платформы не могут принять пакет, сформированный в 1С, так как они ожидают получить данные в совершенно другом формате. Например, в стандартных выгрузках 1С существует проблема с нестрогой типизацией полей, которая может быть востребована в других приложениях.

Впрочем, HTTP — тоже не панацея. И если в описании SOAP-сервиса содержится все возможное — полный набор данных и метаданных, процедуры, которые он выполняет, характеристики входных данных и их форматов, у HTTP-сервисов такого нет. Ресурсно-ориентированная архитектура подразумевает наличие одной только ссылки. Как результат — отсутствие автоматизации навигации среди ресурсов.

Как следствие, для HTTP-сервисов возникает необходимость в более подробной документации. И те, кто когда-нибудь получал API, документированную на бумажке или недокументированную вовсе, не понаслышке знают об этой проблеме.

Требования к рабочему окружению

Для работы нам потребуется:

  • Веб-сервер (Apache или IIS)
  • Платформа 1С (8.3.8 или старше) с установленным расширением веб-сервера.

Если на Вашем компьютере уже установлено все необходимое, то Вы можете пропустить следующие два раздела.

Что нужно для работы

На стороне конфигурации

На стороне конфигурации должны быть развернуты веб-сервисы EnterpriseDataUpload и EnterpriseDataExchange соответствующих версий (в данном случае была использована версия 1.0.1.1). При открытии этих двух URL-адресов в браузере (нужно подставить правильное для вашей инсталляции «1С:Предприятия» имя веб-сервера и публикации):

http://<веб-сервер>/<веб-приложение>/ws/EnterpriseDataExchange_1_0_1_1?wsdl

http://<веб-сервер>/<веб-приложение>/ws/EnterpriseDataUpload_1_0_1_1?wsdl

должны выводиться WSDL-описания сервисов:

img-6.png?_=000535FFC8998397

C#

В примерах использовалась Visual Studio 2012. В ней было создано консольное приложение на C#, в него импортированы веб-сервисы:

  • В Solution Explorer в контекстном меню узла References выбрать команду Add Service Reference.
  • В нижнем левом углу появившегося диалога нажать кнопку Advanced.
  • В нижнем левом углу появившегося диалога нажать кнопку Add Web Reference.

Java

Использовалась среда разработки Eclipse 4.4.2. Для генерации кода по WSDL файлов веб-сервисов применялась утилита wsdl2java из фреймворка Apache CXF 2.7.16.

Простой обмен данными с конфигурациями с помощью формата EnterpriseData

Формат сообщения

Объекты, предназначенные к обмену, «упакованы» в сообщение (Message), структуру в формате XML. Корневой элемент сообщения называется Message и содержит два дочерних элемента:

  • Header (тип Header описан в схеме ExchangeMessage.xsd). Описывает заголовок сообщения, подробнее о заголовке – ниже.
  • Body. Является коллекцией (sequence) элементов – наследников Object, т.е. объектов, описанных выше. Собственно содержит все объекты, которые нужно синхронизировать. В прикладных решениях фирмы «1С» при импорте данных из сообщения каждый объект из коллекции записывается в базу в отдельной транзакции. Так, если сообщение содержит три новых номенклатуры и при обработке третьей по счету номенклатуры произошла исключительная ситуация, первые две номенклатуры будут внесены в систему, третья – нет.

Объект может содержать в себе ссылки на другие объекты (например, документ «Акт выполненных работ» может содержать в себе одну или несколько ссылок на номенклатуру). В этом случае, если мы импортируем данные в информационную базу, все объекты, на которые мы ссылаемся из «родительского» объекта, должны либо уже существовать в системе, либо их описание должно содержаться в том же XML файле.

Если нам необходимо удалить какой-то объект, в коллекцию Body надо добавить элемент типа «УдалениеОбъекта», и в этом элементе сослаться на удаляемый объект (см. описание типа «УдалениеОбъекта» в схеме EnterpriseData_X_Y_Z.xsd).

С помощью формата EnterpriseData нам доступны операции создания, обновления и удаления объектов. На данный момент для корректной загрузки данных в типовые решения все объекты должны содержать заполненный элемент «Ссылка» из элемента «Ключевые свойства» (GUID в форме строки). Это первичный ключ объекта. Конфигурации ведут себя следующим образом:

  •    Если в системе нет объекта с ключом из поля «Ссылка» – создается новый объект.
  •    Если в системе уже есть объект с ключом из поля «Ссылка» – существующий объект обновляется новыми данными, пришедшими в XML.
  •    Если пришел элемент типа «УдалениеОбъекта» – объект с соответствующим ключом удаляется из системы.

Пример сообщения

Копировать в буфер обмена<Message xmlns_msg=”http://www.1c.ru/SSL/Exchange/Message” xmlns_xs=”http://www.w3.org/2001/XMLSchema” xmlns_xsi=”http://www.w3.org/2001/XMLSchema-instance”>
<msg:Header>   <msg:Format>http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.0</msg:Format>
<msg:CreationDate>2015-04-09T11:57:48</msg:CreationDate>
<msg:AvailableVersion>1.0</msg:AvailableVersion> </msg:Header> <Body >                <Справочник.Контрагенты> <КлючевыеСвойства> <Ссылка>15ee9feb-696e-11e4-a6fc-5404a67fc69d</Ссылка> <НаименованиеПолное>Леннон Джон</НаименованиеПолное> <ЮридическоеФизическоеЛицо>ЮридическоеЛицо</ЮридическоеФизическоеЛицо> </КлючевыеСвойства>                        <Наименование>Леннон Джон</Наименование> <ОбособленноеПодразделение>false</ОбособленноеПодразделение> </Справочник.Контрагенты> <УдалениеОбъекта> <СсылкаНаОбъект> <СсылкаНаОбъект> <КонтрагентыГруппаСсылка>15ee9feb-696e-11e4-a6fc-5404a67fc69d</КонтрагентыГруппаСсылка> </СсылкаНаОбъект>                        </СсылкаНаОбъект> </УдалениеОбъекта> </Body></Message>

В секции <Header> – ссылка на формат сообщения, дата создания сообщения и версия формата.

В секции <Body> – описание нового контрагента (тип «Справочник.Контрагенты») с полным наименованием «Леннон Джон» и описание удаления объекта по ключу. Ключ в объекте  <УдалениеОбъекта> (элемент <СсылкаНаОбъект>) – тот же, что и у нового контрагента. В результате обработки этого сообщения конфигурация создаст нового контрагента и тут же удалит его. 

Веб-сервис EnterpriseDataUpload

EnterpriseDataUpload – интерфейс исключительно для импорта данных в формате EnterpriseData в конфигурацию из сторонних приложений. Условия задачи: у нас есть XML файл с данными в формате EnterpriseData, надо передать его в конфигурацию и убедиться в том, что на стороне конфигурации данные успешно получены.

Алгоритм работы следующий:

  1. Заархивировать XML-файл с данными. Если размер архива превышает некоторое предельное значение (например, 2Мб) – разбиваем его на части размером не более 2Мб каждая.
  2. Проверить соединение с помощью метода TestConnection.
  3. Отправить каждую часть архива с помощью метода PutFilePart. Если мы передаем архив одним файлом – второй параметр метода PutFilePart,PartNumber, должен быть равен нулю.  Если архив из нескольких частей – параметр PartNumber должен соответствовать номеру части, начиная с единицы.
  4. После отправки всех частей архива вызвать метод PutData.
  5. Получить результат выполнения метода PutData можно с помощью метода PutDataActionResult. Т.к. обработка полученных данных на стороне конфигурации занимает какое-то время, можно вызывать PutDataActionResult в цикле один раз в, например, 5 секунд, пока он не вернет строку «Completed» (или «Failed», если данные по какой-либо причине обработать не удалось, или «Canceled» если операция отменена).

Пример на C#

Итак, у нас есть архив с данными в формате EnterpriseData (один или несколько файлов). Не будем описывать, как в программе создать архив и разбить его на несколько файлов, чтобы сэкономить время – желающие смогут легко найти примеры подобного кода, используя поисковые сервера и соответствующие запросы.

Реализуем функцию, которая принимает такие входные параметры:

  • URL Веб-сервиса,
  • Имя пользователя для соединения с  Веб-сервисом,
  • Пароль.

Путь до архивированного файла  с данными. Если архив умещается в одном файле – это имя файла с полным путем, включая расширение (например, “C:Exchangedata.zip”). Если же архив разбит на несколько частей, то это будет имя любого из файлов без расширения и точки (например, “C:Exchangedata”). Предполагается, что это последовательность файлов с расширениями “.001”, “.002” и т.д.

Реализация функции (в виде статического метода) в листинге ниже. Диагностическая информация выводится в консоль.

Копировать в буфер обменаprivate static void PutData2WebService(string serviceURL, string user, string password, string fileName)
{
    EnterpriseDataUpload.EnterpriseDataUpload_1_0_1_1 edDataUpload = new EnterpriseDataUpload.EnterpriseDataUpload_1_0_1_1();
    edDataUpload.Url = serviceURL;
    edDataUpload.Credentials = new System.Net.NetworkCredential(user, password);
    string result = edDataUpload.Ping();
    System.Console.WriteLine(“Invoking ping ” + result);
    string errorMessage;
    bool b = edDataUpload.TestConnection(out errorMessage);
    if (b)
    {
        //если передано непосредственно имя ZIP-архива – читаем одним куском
        bool singleFile = fileName.EndsWith(“.zip”, StringComparison.OrdinalIgnoreCase);
        string fileId = Guid.NewGuid().ToString();
        if (singleFile)
        {
            byte[] partData = System.IO.File.ReadAllBytes(fileName);
            //передаем 0 в качестве номера части файла
            result = edDataUpload.PutFilePart(fileId, 0, partData, out errorMessage);
            if (errorMessage != string.Empty)
            {
                System.Console.WriteLine(“PutFilePart error: ” + errorMessage);
                return;
            }
        }
        else
        {
            //счетчик частей файла начинается с единицы
            int partNumber = 1;
            //считаем, что нам передали имя последовательности файлов (*.001, *.002 и т.д.) БЕЗ расширения и точки на конце
            string filePath = fileName + “.” + (partNumber).ToString(“d3”);
            while (System.IO.File.Exists(filePath))
            {
                System.Console.WriteLine(“Reading from: ” + filePath);
                byte[] partData = System.IO.File.ReadAllBytes(filePath);
                string putFilePartResult = edDataUpload.PutFilePart(fileId, partNumber, partData, out errorMessage);
                if (errorMessage != string.Empty)
                {
                    System.Console.WriteLine(“PutFilePart error: ” + errorMessage);
                    return;
                }
                filePath = fileName + “.” + (++partNumber).ToString(“d3”);
            }
        }
        string operationId;
        result = edDataUpload.PutData(fileId, out operationId, out errorMessage);
        if (errorMessage != string.Empty)
        {
            System.Console.WriteLine(“PutData error: ” + errorMessage);
            return;
        }
        result = edDataUpload.PutDataActionResult(operationId, out errorMessage);
        if (errorMessage != string.Empty)
        {
            System.Console.WriteLine(“PutDataActionResult error: ” + errorMessage);
            return;
        }
        while (result == “Active”)
        {
            //ждем в цикле 5 секунд – ожидаем окончания обработки данных на стороне конфигурации и спрашиваем снова
            System.Console.WriteLine(“PutDataActionResult: ” + result);
            System.Threading.Thread.Sleep(5000);
                   
            result = edDataUpload.PutDataActionResult(operationId, out errorMessage);
        }
        System.Console.WriteLine(“PutDataActionResult: ” + result);
        System.Console.WriteLine(“PutData2WebService finished”);
    }
    else
    {
        System.Console.WriteLine(“TestConnection failed: “+ errorMessage);
    }
}

Вызов метода:

Копировать в буфер обменаPutData2WebService(“http://server/1c_app/ws/EnterpriseDataUpload_1_0_1_1”,
                “Administrator”,
                “pass@word”,
                @”c:exchangedata.zip”);

Пример на Java

Принципиально ничем не отличается от реализации на C#.

Копировать в буфер обменаprivate static void putData2WebService(String serviceURL, String user, String password, String fileName)
{
 Authenticator.setDefault(new Authenticator() {
  @Override
  protected PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication(user, password.toCharArray());
  }
 });
 
 URL url = null;
 
 try {
  url = new URL(serviceURL);
 } catch (MalformedURLException e) {
  e.printStackTrace();
 }
 
 EnterpriseDataUpload1011 ss;
 ss = new EnterpriseDataUpload1011(url,
    EnterpriseDataUpload1011.SERVICE);
 
 EnterpriseDataUpload1011PortType port = ss.getEnterpriseDataUpload1011Soap12();
 System.out.println(“Invoking ping…”);
 port.ping();
 System.out.println(“Ping Ok”);
 
 Holder<String> outString = new Holder<String>();
 Boolean testConnectionOk =  port.testConnection(outString);
 
 if (testConnectionOk)
 {
  //если передано непосредственно имя ZIP-архива – читаем одним куском
  Boolean singleFile = fileName.toLowerCase().endsWith(“.zip”);
  String fileId = UUID.randomUUID().toString();
  String strResult;
  
  if (singleFile)
  {
   Path path = Paths.get(fileName);
   byte[] data;
   
   try
   {
    data = Files.readAllBytes(path);
   }
   catch (Exception e)
   {
    System.err.println(“Exception when open file ” + path);
    return;
   }
   
   //передаем 0 в качестве номера части файла
   strResult = port.putFilePart(fileId, 0, data, outString);
 
   if (!outString.value.isEmpty())
              {
    System.err.println(“PutFilePart error: ” + outString);
    return;
              }
  }
  else
  {
   //счетчик частей файла начинается с единицы
   int partNumber = 1;
   
   //считаем, что нам передали имя последовательности файлов (*.001, *.002 и т.д.) БЕЗ расширения и точки на конце
   Path filePath = Paths.get(fileName + “.” + String.format(“%03d”, partNumber));
   
   while (Files.exists(filePath))
   {
    System.out.println(“reading from ” + filePath);
    
    byte[] data;
    
    try
    {
     data = Files.readAllBytes(filePath);
    }
    catch (Exception e)
    {
     System.err.println(“Exception when open file ” + filePath);
     return;
    }
    
    strResult = port.putFilePart(fileId, partNumber, data, outString);
 
    if (!outString.value.isEmpty())
             {
     System.err.println(“PutFilePart error: ” + outString.value);
     return;
             }
    
    filePath = Paths.get(fileName + “.” + String.format(“%03d”, ++partNumber));
   }
  }
  
  Holder<String> operationId = new Holder<String>();
  strResult = port.putData(fileId, operationId, outString);
  if (!outString.value.isEmpty())
          {
   System.err.println(“PutData error: ” + outString.value);
   return;
          }
  
  strResult = port.putDataActionResult(operationId.value, outString);
  if (!outString.value.isEmpty())
          {
   System.err.println(“putDataActionResult error: ” + outString.value);
   return;
          }
  else
  {
   System.out.println(“putDataActionResult: ” + strResult);
   
   while (“Active”.equals(strResult))
   {
    //ждем в цикле 5 секунд – ожидаем окончания обработки данных на стороне конфигурации и спрашиваем снова
    try
    {
     Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
     //ignore
    }
    
    strResult = port.putDataActionResult(operationId.value, outString);
    
    if (!outString.value.isEmpty())
               {
     System.err.println(“putDataActionResult error: ” + outString.value);
     return;
               }
    System.out.println(“putDataActionResult: ” + strResult);
   }
  }
 }
 else
 {
  System.err.println(“Connection failed, reason: ” + outString.value);
 }
}

Инструменты для работы с веб-сервисами

Для работы с веб-сервисами я использую общие инструменты тестирования и отладки. В частности, очень полезны оказываются интерфейсы отправки запросов, такие как Postman, SoapUI, Advanced REST Client. На мой взгляд, Postman — один из самых развитых инструментов этой категории. Неопытный разработчик может готовить обработку, которая запускается из 1С и вызывает сервис. Но рано или поздно станет очевидно, что тестировать с помощью такой структуры, а потом — готовить документацию — оказывается сложно.

Второй обязательный инструмент экосистемы — Proxy-серверы для веб-отладки. Я использую Fiddler, Charles, mitmproxy. Они нужны в тех случаях, если нет полной уверенности в том, как идет обмен данными между системами. С помощью Proxy разработчик может увидеть, что конкретно передает или получает сервис. Proxy помогает выяснить, почему сервис не работает, а в некоторых случаях — почему он, несмотря ни на что, работает?

Proxy-сервер отслеживает все сообщения, которые проходят через HTTP-порты, а при помощи Fiddler с правильным сертификатом можно анализировать даже HTTPs-трафик.

Есть также утилиты, специально созданные для интеграции HTTP-сервисов в экосистеме 1С. В практике Neti активно используется консоль HTTP-запросов. Она предоставляет функции, во многом аналогичные Postman (кроме, пожалуй, документации), а также обладает своими уникальными фичами. В консоли можно делать вызов HTTP-сервиса, но при этом генерировать код вызова для приложений 1С (когда в Postman можно работать только с Java, C++ и другими универсальными языками программирования).

Внимания заслуживает и библиотека 1CHTTP-Connector. Она предлагает прекрасный способ вызова сторонних HTTP-сервисов. При работе над интеграцией, в этой библиотеке можно найти нужные методы и обработчики и без лишних затрат времени реализовать нужный функционал, а также проанализировать ответы сторонних сервисов.

Проверка работы http сервиса 1С на веб-сервере

Сделать это очень просто — после публикации достаточно вбить адрес веб-сервера 1С в браузер в таком формате:

http://<имя сервера>/ws/<ИмяФайлаВебСервиса>.1cws?wsdl

wsdl

Если Вы увидите что-то вроде этого, Вы на правильном пути, и веб-сервис опубликован на сервере верно.

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Ресурсы

  • Описание, XSD-схемы и актуальные версии формата EnterpriseData
  • Примеры использования веб-сервисов на C# и Java
Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...