Коллекция веб-сервисов.
Полное описание, параметры и ограничения
WSКоллекцияСервисов (WSServiceCollection)
WSКоллекцияСервисов (WSServiceCollection)
Доступен, начиная с версии 8.1.
Элементы коллекции:
WSСервис
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0) коллекции.
Методы:
Количество (Count)
Получить (Get)
Описание:
Коллекция веб-сервисов.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
См. также:
WSОпределения, свойство Сервисы
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разобрать локальный WSDL от сервиса до параметров и ответа
Построим паспорт своего импортированного контракта, сравним получение по индексу и имени, различим описание операции и реально возвращённые данные.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеКонтракты85, только толстый клиент. Пульт и локальный WSDL отдельными полными блоками ниже.
Подготовка
НОВАЯ собственная файловая база 8.5.1.1343 с именем конфигурации УчебныеКонтрактыМетаданных85, совместимость НеИспользовать, обычное приложение и толстый клиент. Можно использовать уже подготовленный собственный стенд уроков контрактов метаданных. Не рабочая база и не её копия; нет расширений, разделителей и других сеансов. Здесь runtimeVerifiedScenarios=0.
Общий модуль УчебныеКонтракты85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Вставьте полный модуль одного выбранного урока. Обработка УчебныеКонтракты85 → обычная основная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие; полный модуль формы приведён отдельно.
Для всех трёх уроков: сохраните полный XML/WSDL из отдельного блока ниже в UTF-8. Создайте только свою WS-ссылку УчебныйСервис85 и импортируйте WSDL ИЗ ЛОКАЛЬНОГО ФАЙЛА, не по HTTP. StudyService85, namespace urn:guide:metadata85, StudyPort85 и Echo заданы в этом полном описании. Во втором уроке сравниваются файл и этот собственный импорт. Не нужны внешний источник, палитра или рабочие бизнес-данные.
WSDL содержит встроенную XSD без import/include, один сервис и порт, операцию Echo с входным сообщением и ответом. Адрес http://127.0.0.1:9/metadata-study-85 — учебная строка описания; этот урок не публикует по ней сервис и не проверяет, свободен ли порт. Никакая операция SOAP не вызывается.
Для второго урока человек сохраняет тот же XML строго как C:\1CStudy85\metadata-study-85.wsdl, UTF-8 без BOM. Допускаются LF/CRLF и завершающий перевод строки; иной текст код отклоняет ДО конструктора WSОпределения. Каталог и файл создайте сами только для своего опыта. Здесь файл на этом пути не создавался.
Свой файл не должен меняться между проверкой текста и конструктором; нет другого процесса, который его заменяет. Это одиночный учебный стенд, не защита от гонки или недоверенного WSDL. Не подставляйте внешние URL и не добавляйте импорты.
F7 и обновление только собственной базы. Первый урок выводит паспорт описания. Второй сравнивает своё локальное описание с импортированным. Третий создаёт два локальных объекта WSПрокси и проверяет настройки, НЕ вызывает Echo и не создаёт настоящую интеграцию.
Табличные документы создаются только в памяти и показываются readonly без имени файла. Не печатайте/не сохраняйте из окна. В третьем уроке логин и пароль — заведомо ненастоящие локальные строки; пароль не выводится. Рабочие учётные данные запрещены.
Процедура ВыполнитьПример() Экспорт
Определения = ПолучитьСвоиОпределения();
Паспорт = СоздатьСвоюТаблицу();
ДобавитьСтроку(Паспорт, "WSDL", "Документация", Определения.Документация);
Если ТипЗнч(Определения.ФабрикаXDTO) <> Тип("ФабрикаXDTO") Тогда
ВызватьИсключение "ФабрикаXDTO определения — объект фабрики, не описание параметра";
КонецЕсли;
ДобавитьСтроку(Паспорт, "WSDL", "Тип фабрики", ТипЗнч(Определения.ФабрикаXDTO));
Сервисы = Определения.Сервисы;
Сервис = Сервисы.Получить(0);
ПоИмени = Сервисы.Получить("urn:guide:metadata85", "StudyService85");
Если Сервис.Имя <> ПоИмени.Имя Или Сервис.URIПространстваИмен <> ПоИмени.URIПространстваИмен Тогда
ВызватьИсключение "Индекс и пара namespace/имя должны выбрать свой единственный сервис";
КонецЕсли;
ДобавитьСтроку(Паспорт, Сервис.Имя, "Сервисов", Сервисы.Количество());
ДобавитьСтроку(Паспорт, Сервис.Имя, "Namespace", Сервис.URIПространстваИмен);
ДобавитьСтроку(Паспорт, Сервис.Имя, "Документация", Сервис.Документация);
Точки = Сервис.ТочкиПодключения;
Точка = Точки.Получить(0);
ПоИмениТочки = Точки.Получить("StudyPort85");
Если Точка.Имя <> ПоИмениТочки.Имя Или Точка.Местоположение <> ПоИмениТочки.Местоположение Тогда
ВызватьИсключение "Индекс и имя должны выбрать свой единственный порт";
КонецЕсли;
ДобавитьСтроку(Паспорт, Точка.Имя, "Точек подключения", Точки.Количество());
ДобавитьСтроку(Паспорт, Точка.Имя, "Адрес без вызова", Точка.Местоположение);
ДобавитьСтроку(Паспорт, Точка.Имя, "Документация", Точка.Документация);
Интерфейс = Точка.Интерфейс;
Если ТипЗнч(Интерфейс) <> Тип("WSИнтерфейс") Тогда
ВызватьИсключение "У своего порта должен быть интерфейс определения";
КонецЕсли;
ДобавитьСтроку(Паспорт, Интерфейс.Имя, "Namespace интерфейса", Интерфейс.URIПространстваИмен);
ДобавитьСтроку(Паспорт, Интерфейс.Имя, "Документация", Интерфейс.Документация);
Операции = Интерфейс.Операции;
Если Операции.Количество() <> 1 Тогда
ВызватьИсключение "В собственной подготовке нужна одна операция Echo";
КонецЕсли;
Операция = Операции.Получить(0);
Если Операция.Имя <> "Echo" Или Операции.Получить("Echo").Имя <> "Echo" Тогда
ВызватьИсключение "Индекс и имя должны выбрать Echo, но не вызвать его";
КонецЕсли;
ДобавитьСтроку(Паспорт, Операция.Имя, "Операций", Операции.Количество());
ДобавитьСтроку(Паспорт, Операция.Имя, "Документация", Операция.Документация);
Параметры = Операция.Параметры;
Если Параметры.Количество() = 0 Тогда
ВызватьИсключение "Echo собственного файла имеет входное сообщение; пустое описание требует анализа импорта";
КонецЕсли;
ДобавитьСтроку(Паспорт, Операция.Имя, "Параметров после импорта", Параметры.Количество());
Имена = Новый Массив;
Для Каждого Параметр Из Параметры Цикл
Если ПустаяСтрока(Параметр.Имя) Или Имена.Найти(Параметр.Имя) <> Неопределено Тогда
ВызватьИсключение "Для проверки Получить по имени нужны непустые уникальные имена параметров";
КонецЕсли;
Имена.Добавить(Параметр.Имя);
КонецЦикла;
Для Индекс = 0 По Параметры.Количество() - 1 Цикл
Параметр = Параметры.Получить(Индекс);
ПоИмениПараметра = Параметры.Получить(Параметр.Имя);
Если ПоИмениПараметра.Имя <> Параметр.Имя Тогда
ВызватьИсключение "Получить по индексу и фактическому имени должны выбрать один параметр";
КонецЕсли;
ДобавитьСтроку(Паспорт, Параметр.Имя, "Направление", Параметр.НаправлениеПараметра);
ДобавитьСтроку(Паспорт, Параметр.Имя, "Возможно Неопределено", Параметр.ВозможноПустой);
ДобавитьСтроку(Паспорт, Параметр.Имя, "Класс описания XDTO-типа", ПроверитьКлассТипа(Параметр.Тип));
ДобавитьСтроку(Паспорт, Параметр.Имя, "Документация", Параметр.Документация);
КонецЦикла;
Результат = Операция.ВозвращаемоеЗначение;
Если ТипЗнч(Результат) <> Тип("WSВозвращаемоеЗначение") Тогда
ВызватьИсключение "Echo описывает ответ, не значение реально вызванной операции";
КонецЕсли;
ДобавитьСтроку(Паспорт, "Ответ Echo", "Возможно Неопределено", Результат.ВозможноПустое);
ДобавитьСтроку(Паспорт, "Ответ Echo", "Класс описания XDTO-типа", ПроверитьКлассТипа(Результат.Тип));
ДобавитьСтроку(Паспорт, "Ответ Echo", "Документация", Результат.Документация);
ПоказатьСвойПаспорт(Паспорт, "Свой WSDL: сервис → порт → интерфейс → Echo → параметры и ответ");
КонецПроцедуры
Функция ПроверитьКлассТипа(ТипДанных)
Класс = ТипЗнч(ТипДанных);
Если Класс <> Тип("ТипЗначенияXDTO") И Класс <> Тип("ТипОбъектаXDTO") Тогда
ВызватьИсключение "WS-тип должен быть описанием XDTO, не строкой или ОписаниемТипов 1С";
КонецЕсли;
Возврат Класс;
КонецФункции
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеКонтрактыМетаданных85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСвоиОпределения()
ПроверитьСвойКонтекст();
Если Метаданные.WSСсылки.Найти("УчебныйСервис85") = Неопределено Тогда
ВызватьИсключение "Импортируйте свой приложенный локальный WSDL в УчебныйСервис85";
КонецЕсли;
МенеджерыСсылок = WSСсылки;
МенеджерСсылки = МенеджерыСсылок.УчебныйСервис85;
Определения = МенеджерСсылки.ПолучитьWSОпределения();
Если ТипЗнч(Определения) <> Тип("WSОпределения") Или Определения.Сервисы.Количество() <> 1 Тогда
ВызватьИсключение "Нужно собственное описание с одним сервисом";
КонецЕсли;
Сервис = Определения.Сервисы.Получить("urn:guide:metadata85", "StudyService85");
Если Сервис.Имя <> "StudyService85" Или Сервис.URIПространстваИмен <> "urn:guide:metadata85"
Или Сервис.ТочкиПодключения.Количество() <> 1 Тогда
ВызватьИсключение "Не совпал сервис своего локального WSDL";
КонецЕсли;
Точка = Сервис.ТочкиПодключения.Получить("StudyPort85");
Если Точка.Имя <> "StudyPort85" Или Точка.Местоположение <> "http://127.0.0.1:9/metadata-study-85" Тогда
ВызватьИсключение "Не совпали порт и учебный адрес; никаких вызовов не выполняем";
КонецЕсли;
Возврат Определения;
КонецФункции
Процедура ДобавитьСтроку(Таблица, Объект, Свойство, Значение)
СтрокаПаспорта = Таблица.Добавить();
СтрокаПаспорта.Объект = Объект;
СтрокаПаспорта.Свойство = Свойство;
СтрокаПаспорта.Значение = Строка(Значение);
КонецПроцедуры
Функция СоздатьСвоюТаблицу()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Объект");
Таблица.Колонки.Добавить("Свойство");
Таблица.Колонки.Добавить("Значение");
Возврат Таблица;
КонецФункции
Процедура ПоказатьСвойПаспорт(Таблица, Заголовок)
Если Таблица.Количество() = 0 Тогда
ВызватьИсключение "Собственный паспорт пуст";
КонецЕсли;
Документ = Новый ТабличныйДокумент;
Документ.Область("R1C1").Текст = "Объект";
Документ.Область("R1C2").Текст = "Свойство";
Документ.Область("R1C3").Текст = "Значение";
Номер = 2;
Для Каждого Запись Из Таблица Цикл
Документ.Область(Номер, 1).Текст = Запись.Объект;
Документ.Область(Номер, 2).Текст = Запись.Свойство;
Документ.Область(Номер, 3).Текст = Запись.Значение;
Номер = Номер + 1;
КонецЦикла;
Документ.Показать(Заголовок, "", Истина);
КонецПроцедурыУчебныеКонтракты85.Пульт
УчебныеКонтрактыМетаданных85 → Обработки → УчебныеКонтракты85 → Формы → Пульт → Модуль
Полный модуль своей обычной формы, не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеКонтракты85.ВыполнитьПример();
КонецПроцедурыmetadata-study-85.wsdl
Полный локальный UTF-8 XML/WSDL для своего импорта; для файлового урока C:\1CStudy85\metadata-study-85.wsdl.
Это XML, не BSL и не работающий сервис. Импорты и include отсутствуют.
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:guide:metadata85" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="urn:guide:metadata85" name="MetadataStudy85">
<types>
<xsd:schema targetNamespace="urn:guide:metadata85" elementFormDefault="qualified">
<xsd:element name="Echo"><xsd:complexType><xsd:sequence><xsd:element name="text" type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element>
<xsd:element name="EchoResponse"><xsd:complexType><xsd:sequence><xsd:element name="text" type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element>
</xsd:schema>
</types>
<message name="EchoRequest"><part name="parameters" element="tns:Echo"/></message>
<message name="EchoResponse"><part name="parameters" element="tns:EchoResponse"/></message>
<portType name="StudyPortType"><operation name="Echo"><input message="tns:EchoRequest"/><output message="tns:EchoResponse"/></operation></portType>
<binding name="StudyBinding" type="tns:StudyPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="Echo"><soap:operation soapAction="urn:guide:metadata85:Echo"/><input><soap:body use="literal"/></input><output><soap:body use="literal"/></output></operation>
</binding>
<service name="StudyService85"><port name="StudyPort85" binding="tns:StudyBinding"><soap:address location="http://127.0.0.1:9/metadata-study-85"/></port></service>
</definitions>
Разбор по шагам
ПолучитьСвоиОпределения получает реальный глобальный WSСсылкиМенеджер, конкретный менеджер УчебныйСервис85 и его WSОпределения. Не используется неизвестный входной объект или getter-обёртка.
Проверяем ровно один свой сервис и порт, заданные приложенным XML. Получить сервиса имеет два разных синтаксиса: индекс 0 либо два обязательных аргумента namespace и имя, не одну строку с именем.
Сервисы, ТочкиПодключения, Операции и Параметры — четыре разных коллекции. Количество проверяется ДО индексного чтения; индексы начинаются с нуля. Именные методы портов/операций/параметров получают одну строку, в отличие от сервиса.
Из порта берём WSИнтерфейс, из него одну операцию Echo. Читаем Имя, Namespace, Документация и Местоположение в паспорт. Пустая документация допустима: в нашем WSDL текстовые documentation не заданы.
WSОперация — описание Echo, а не вызов Echo. Параметры берутся из этого описания. Имена после импорта читаются реально, не подставляем выдуманное имя text как гарантированное имя аргумента 1С.
До именованного получения проверяем непустые уникальные имена фактических параметров. При дублях отказываем: совпавшие имена не делают две разные позиции одной сущностью.
У каждого параметра показываем НаправлениеПараметра, ВозможноПустой, Документация и класс описания Тип. Проверяем два документированных класса XDTO; не преобразуем его в строковый тип Число/Строка 1С.
ВозвращаемоеЗначение операции — WSВозвращаемоеЗначение. Его Тип, ВозможноПустое и Документация описывают будущий ответ, не содержат результат вызова. Это отдельный объект, не последний элемент Параметры.
ФабрикаXDTO принадлежит определению и используется для работы с типами этого описания. Проверяем сам класс фабрики; не выдумываем имя анонимного комплексного типа и не создаём HTTP-клиент.
Как проверить результат
Будущий паспорт: один StudyService85 в urn:guide:metadata85, один StudyPort85 с учебным loopback-адресом, одна операция Echo. Здесь runtimeVerifiedScenarios=0, импорт и UI не выполнялись.
Получение единственного сервиса по индексу и QName, порта/операции по индексу и имени даёт согласованные имена и адрес. Индекс не является постоянным идентификатором чужого WSDL.
Параметры имеют непустые уникальные фактические имена; паспорт выводит их реальное число, направления и классы XDTO. Точное число/имена параметров после document/literal отображения здесь заранее не выдумываются.
Описание ответа имеет тип WSВозвращаемоеЗначение; nullable-флаг и XDTO-класс показываются отдельно от реального значения, которое отсутствует без вызова.
В копии своего WSDL переименуйте сервис или порт, затем переимпортируйте только свой стенд: фиксированные проверки подготовки должны отказать. Верните исходный XML; рабочий импорт запрещён.
Ожидаемый результат
Подготовлен собственный локальный опыт без вызова операций веб-сервиса. Код и UI здесь не выполнялись: runtimeVerifiedScenarios=0.
На что обратить внимание
Описание WSDL и объект вызова WSПрокси — не результат работы внешней системы. Здесь Echo не вызывается и работоспособность сервиса не проверяется.
Имена сервисов выбираются парой namespace/локальное имя; URI namespace не является URL для сетевого запроса. Местоположение порта — адрес будущего вызова, а URLИсточника WS-ссылки — источник WSDL.
Все описания WS, коллекции и транспортные свойства, кроме логина/пароля WSПрокси, здесь только читаются. Коллекции описания не имеют выдуманных конструкторов, Добавить или Удалить.
Тип WS-параметра/ответа — описание XDTO, а не готовое передаваемое значение и не ОписаниеТипов 1С. ВозможноПустой/ВозможноПустое описывают допустимость Неопределено, не обязательное наличие такого значения.
Статическая проверка не является импортом WSDL, F7, реальным SOAP-тестом или подтверждением точного отображения document/literal параметров платформой.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.