Глобальный контекст.WSСсылки

Свойства · WSReferences

Тип: WSСсылкиМенеджер. Содержит менеджер ссылок на внешние Web-сервисы.

Полное описание, параметры и ограничения

Глобальный контекст.WSСсылки (Global context.WSReferences)

Глобальный контекст (Global context)

WSСсылки (WSReferences)

Доступен, начиная с версии 8.1.

Использование:
Только чтение.
Описание:
Тип: WSСсылкиМенеджер.
Содержит менеджер ссылок на внешние Web-сервисы.
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Различить метаданные WS-ссылки и настоящее WSDL-описание

На локальном WSDL проверяем свой WS-объект, его исходный URL и реальное описание через менеджер. Показываем, почему metadata.WSОпределение нельзя использовать как сервис или признак поломки.

Где и как запускать

Полный клиентский общий модуль УчебныеКонтракты85 обычного приложения. Только толстый клиент; Пульт отдельным модулем ниже. Не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с именем конфигурации УчебныеКонтрактыМетаданных85, совместимость НеИспользовать, обычное приложение и толстый клиент. Не рабочая база и не её копия. Код здесь не запускался: runtimeVerifiedScenarios=0.

  2. Общий модуль УчебныеКонтракты85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Вставляйте полный модуль выбранного урока. Создайте обработку УчебныеКонтракты85 с обычной основной формой Пульт и кнопкой Выполнить, действие ВыполнитьНажатие; отдельный модуль формы дан ниже.

  3. Для урока внешнего источника: Внешние источники данных → УчебныйИсточник85, синоним Учебный источник, комментарий guide-owned-source-85. Режим управления блокировкой данных Автоматический. Не задавайте подключение, учётные данные, таблицы и кубы; сервер, ODBC и внешняя БД не используются.

  4. В УчебныйИсточник85 → Функции создайте Число85: синоним Учебное число, комментарий guide-owned-number-85, ВозвращаетЗначение=Да, Тип только Число(10,0), ВыражениеВИсточникеДанных=42. Вторую Приветствие85: синоним Учебное приветствие, комментарий guide-owned-text-85, ВозвращаетЗначение=Да, Тип только Строка(40), выражение SQL-литерала 'Привет' с одиночными кавычками. Параметры функций отсутствуют. Это два определения для аудита, функции не вызываются и SQL не исполняется.

  5. Для урока палитры: Общие → Цвета палитры, два собственных цвета УчебныйФон85 и УчебныйТекст85. Синонимы Учебный фон/Учебный текст, комментарии guide-owned-background-85/guide-owned-text-color-85. Задайте абсолютные RGB 240,248,255 и 0,80,120. Не меняйте системные цвета и стили рабочей конфигурации.

  6. Для WS-урока: полный XML файла metadata-study-85.wsdl встроен отдельным блоком ниже. Сохраните этот блок в UTF-8 как локальный .wsdl; рядом со справочником уже лежит такой же файл. В новой базе создайте WS-ссылку УчебныйСервис85 и импортируйте описание ИЗ ЛОКАЛЬНОГО ФАЙЛА, не по HTTP. Синоним Учебная WS-ссылка, комментарий guide-owned-ws-85. Файл не имеет импортов WSDL/XSD; сервис StudyService85, namespace urn:guide:metadata85, адрес 127.0.0.1:9 — неработающий учебный адрес, не настоящий сервер.

  7. Для каждого урока нужны только перечисленные для него объекты. Расширения, заимствование и изменения расширениями отсутствуют. Обновите конфигурацию собственной базы, проверьте F7, имена и все подготовленные свойства. Импорт WSDL в Конфигураторе и запуск в 1С здесь не выполнялись.

  8. Выводится новый табличный документ в память и своё окно без имени файла. Не печатайте и не сохраняйте через команды окна. WSПрокси/вызовы Echo/запрос к внешнему источнику не создаются. Статический паспорт метаданных не доказывает доступность внешнего сервиса или правильность его реализации.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    МДСсылки = Метаданные.WSСсылки.Найти("УчебныйСервис85");
    Если МДСсылки = Неопределено Тогда
        ВызватьИсключение "Импортируйте собственный локальный WSDL в свою WS-ссылку";
    КонецЕсли;
    Паспорт = СоздатьСвоюТаблицу();
    ДобавитьСвойПаспорт(Паспорт, МДСсылки, "УчебныйСервис85", Метаданные);
    Если МДСсылки.WSОпределение <> Неопределено Тогда
        ВызватьИсключение "Метаданные WSОпределение по справке должны возвращать Неопределено";
    КонецЕсли;
    Если ПустаяСтрока(МДСсылки.URLИсточника) Тогда
        ВызватьИсключение "У своей импортированной ссылки не указан источник WSDL";
    КонецЕсли;
    ДобавитьСтроку(Паспорт, МДСсылки.ПолноеИмя(), "URL источника описания", МДСсылки.URLИсточника);
    ДобавитьСтроку(Паспорт, МДСсылки.ПолноеИмя(), "WSОпределение метаданных", МДСсылки.WSОпределение);
    Определения = WSСсылки.УчебныйСервис85.ПолучитьWSОпределения();
    Если ТипЗнч(Определения) <> Тип("WSОпределения") Тогда
        ВызватьИсключение "Менеджер собственной ссылки не вернул WSОпределения";
    КонецЕсли;
    Количество = 0;
    Для Каждого Сервис Из Определения.Сервисы Цикл
        Если Сервис.Имя <> "StudyService85" Или Сервис.URIПространстваИмен <> "urn:guide:metadata85" Тогда
            ВызватьИсключение "WSDL отличается от собственной локальной подготовки";
        КонецЕсли;
        Количество = Количество + 1;
        ДобавитьСтроку(Паспорт, МДСсылки.ПолноеИмя(), "Сервис из настоящего определения", Сервис.Имя);
        ДобавитьСтроку(Паспорт, МДСсылки.ПолноеИмя(), "Namespace сервиса", Сервис.URIПространстваИмен);
    КонецЦикла;
    Если Количество <> 1 Тогда
        ВызватьИсключение "В своём файле должен быть ровно один StudyService85";
    КонецЕсли;
    ПоказатьСвойПаспорт(Паспорт, "Своя WS-ссылка: метаданные и импортированное описание");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеКонтрактыМетаданных85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьСвойПаспорт(Таблица, МД, ОжидаемоеИмя, ОжидаемыйРодитель)
    Если МД.Имя <> ОжидаемоеИмя Или МД.Родитель() <> ОжидаемыйРодитель Тогда
        ВызватьИсключение "Не совпало имя или родитель собственного объекта метаданных";
    КонецЕсли;
    Если МД.ПринадлежностьОбъекта <> Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный
        Или МД.РасширениеКонфигурации() <> Неопределено Или МД.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Опыт предназначен только для своих объектов без расширений";
    КонецЕсли;
    ПолноеИмя = МД.ПолноеИмя();
    Если ПустаяСтрока(ПолноеИмя) Или ПустаяСтрока(МД.Представление()) Тогда
        ВызватьИсключение "У собственного объекта нет полного имени или представления";
    КонецЕсли;
    ДобавитьСтроку(Таблица, ПолноеИмя, "Имя", МД.Имя);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Синоним", МД.Синоним);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Представление", МД.Представление());
    ДобавитьСтроку(Таблица, ПолноеИмя, "Комментарий", МД.Комментарий);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Принадлежность", МД.ПринадлежностьОбъекта);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Привязка заимствованного объекта", МД.ОбъектРасширяемойКонфигурации);
КонецПроцедуры

Процедура ДобавитьСтроку(Таблица, Объект, Свойство, Значение)
    СтрокаПаспорта = Таблица.Добавить();
    СтрокаПаспорта.Объект = Объект;
    СтрокаПаспорта.Свойство = Свойство;
    СтрокаПаспорта.Значение = Строка(Значение);
КонецПроцедуры

Функция СоздатьСвоюТаблицу()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Объект");
    Таблица.Колонки.Добавить("Свойство");
    Таблица.Колонки.Добавить("Значение");
    Возврат Таблица;
КонецФункции

Процедура ПоказатьСвойПаспорт(Таблица, Заголовок)
    Если Таблица.Количество() = 0 Тогда
        ВызватьИсключение "Собственный паспорт пуст";
    КонецЕсли;
    Документ = Новый ТабличныйДокумент;
    Документ.Область("R1C1").Текст = "Объект";
    Документ.Область("R1C2").Текст = "Свойство";
    Документ.Область("R1C3").Текст = "Значение";
    Номер = 2;
    Для Каждого Запись Из Таблица Цикл
        Документ.Область(Номер, 1).Текст = Запись.Объект;
        Документ.Область(Номер, 2).Текст = Запись.Свойство;
        Документ.Область(Номер, 3).Текст = Запись.Значение;
        Номер = Номер + 1;
    КонецЦикла;
    Документ.Показать(Заголовок, "", Истина);
КонецПроцедуры
УчебныеКонтракты85.Пульт

УчебныеКонтрактыМетаданных85 → Обработки → УчебныеКонтракты85 → Формы → Пульт → Модуль

Полный отдельный модуль своей обычной формы; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеКонтракты85.ВыполнитьПример();
КонецПроцедуры
metadata-study-85.wsdl

Локальный учебный файл metadata-study-85.wsdl; скопируйте XML целиком и сохраните UTF-8 перед импортом в свою WS-ссылку.

Это полный XML/WSDL, НЕ BSL и НЕ модуль 1С. Он не реализует веб-сервис; адрес намеренно не обслуживается.

<?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>

Разбор по шагам

  1. Проверяется отсутствие чужой активной транзакции. Получаем описания из Метаданные, не бизнес-объекты и не внешний менеджер данных.

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

  3. ПринадлежностьОбъекта, РасширениеКонфигурации и ЕстьИзмененияРасширениямиКонфигурации проверяются раздельно. Собственный объект, созданный расширением, не равен объекту основной конфигурации.

  4. ПолноеИмя используется для строк паспорта, Представление для подписи, Синоним и Комментарий выводятся отдельно. Привязка ОбъектРасширяемойКонфигурации относится к заимствованию: для собственного объекта её произвольное значение не объявляется доказательством отсутствия расширений.

  5. WSОпределение объекта метаданных всегда Неопределено — это прямо указано в локальной справке. Значение проверяется и выводится, но его методы не вызываются.

  6. URLИсточника — местоположение импортированного описания, не обязательно SOAP-endpoint. В подготовке описание загружено из локального файла без импортов и внешних ресурсов.

  7. WSСсылки.УчебныйСервис85.ПолучитьWSОпределения возвращает WSОпределения, не WSПрокси. Перебираем его Сервисы и сверяем фактические Имя и URIПространстваИмен.

  8. StudyService85 и urn:guide:metadata85 заданы в полном приложенном WSDL. Один сервис — размер описания, не количество операций или вызовов.

  9. Сервис по адресу 127.0.0.1:9 не развёрнут. Здесь нет создания прокси, вызова Echo и проверки сети; задача — проверка контракта импортированного описания.

Как проверить результат

  1. Будущий тест: F7, запуск только в своём стенде, паспорт с фактическими именами, синонимами и комментариями. При неправильном имени или родителе успешный паспорт не выводится.

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

  3. Будущий паспорт: свой WSОпределение метаданных отображается как неопределённое значение, но менеджер возвращает WSОпределения с одним StudyService85.

  4. В копии локального WSDL измените namespace и повторите импорт в своей базе: проверка ожидаемого namespace должна отказать. Здесь повторный импорт не выполнялся.

  5. Отключённый внешний сервер не является ошибкой этого урока: он не вызывается. Не используйте отсутствие SOAP-ответа как проверку данного паспорта.

Ожидаемый результат

Подготовлен полный собственный аудит метаданных и учебный вывод без подключения к внешним данным. runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Метаданные — описания структуры, не таблицы бизнес-данных и не менеджеры подключения. Чтение ВозвращаетЗначение не вызывает внешнюю функцию.

  2. Readonly-свойства нельзя переназначать во встроенном языке. Изменения подготовки выполняются только в Конфигураторе своей новой базы; здесь они не выполнялись.

  3. Код не тестировался в 1С. Паспорт и статические проверки не являются доказательством работы внешнего сервиса, драйвера, SQL-диалекта или применённой темы интерфейса.

  4. Присвоить WSОпределение метаданных нельзя. Для чтения реального описания нужен менеджер WS-ссылки, а для вызова операции — отдельный, здесь намеренно отсутствующий клиент.

  5. WSDL согласует структуру сообщений, не реализует Echo. Учебный адрес намеренно не обслуживается; не считайте приложенный XML рабочей интеграцией.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Собрать два профиля WSПрокси, не вызывая веб-сервис

Сравним конструктор из WSОпределения и фабрику менеджера, проверим таймауты, типы транспорта и локальную установку ненастоящих учётных полей без вывода пароля.

Где и как запускать

Полный обычный клиентский общий модуль УчебныеКонтракты85, только толстый клиент. Пульт и локальный WSDL отдельными полными блоками ниже.

Подготовка

  1. НОВАЯ собственная файловая база 8.5.1.1343 с именем конфигурации УчебныеКонтрактыМетаданных85, совместимость НеИспользовать, обычное приложение и толстый клиент. Можно использовать уже подготовленный собственный стенд уроков контрактов метаданных. Не рабочая база и не её копия; нет расширений, разделителей и других сеансов. Здесь runtimeVerifiedScenarios=0.

  2. Общий модуль УчебныеКонтракты85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Вставьте полный модуль одного выбранного урока. Обработка УчебныеКонтракты85 → обычная основная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие; полный модуль формы приведён отдельно.

  3. Для всех трёх уроков: сохраните полный XML/WSDL из отдельного блока ниже в UTF-8. Создайте только свою WS-ссылку УчебныйСервис85 и импортируйте WSDL ИЗ ЛОКАЛЬНОГО ФАЙЛА, не по HTTP. StudyService85, namespace urn:guide:metadata85, StudyPort85 и Echo заданы в этом полном описании. Во втором уроке сравниваются файл и этот собственный импорт. Не нужны внешний источник, палитра или рабочие бизнес-данные.

  4. WSDL содержит встроенную XSD без import/include, один сервис и порт, операцию Echo с входным сообщением и ответом. Адрес http://127.0.0.1:9/metadata-study-85 — учебная строка описания; этот урок не публикует по ней сервис и не проверяет, свободен ли порт. Никакая операция SOAP не вызывается.

  5. Для второго урока человек сохраняет тот же XML строго как C:\1CStudy85\metadata-study-85.wsdl, UTF-8 без BOM. Допускаются LF/CRLF и завершающий перевод строки; иной текст код отклоняет ДО конструктора WSОпределения. Каталог и файл создайте сами только для своего опыта. Здесь файл на этом пути не создавался.

  6. Свой файл не должен меняться между проверкой текста и конструктором; нет другого процесса, который его заменяет. Это одиночный учебный стенд, не защита от гонки или недоверенного WSDL. Не подставляйте внешние URL и не добавляйте импорты.

  7. F7 и обновление только собственной базы. Первый урок выводит паспорт описания. Второй сравнивает своё локальное описание с импортированным. Третий создаёт два локальных объекта WSПрокси и проверяет настройки, НЕ вызывает Echo и не создаёт настоящую интеграцию.

  8. Табличные документы создаются только в памяти и показываются readonly без имени файла. Не печатайте/не сохраняйте из окна. В третьем уроке логин и пароль — заведомо ненастоящие локальные строки; пароль не выводится. Рабочие учётные данные запрещены.

Процедура ВыполнитьПример() Экспорт
    Определения = ПолучитьСвоиОпределения();
    ИнтернетМаршрут = Новый ИнтернетПрокси(Ложь);
    ИзОпределения = Новый WSПрокси(Определения, "urn:guide:metadata85", "StudyService85", "StudyPort85",
        ИнтернетМаршрут, 20, Неопределено, "http://127.0.0.1:9/metadata-study-85", Ложь);
    ИзМенеджера = WSСсылки.УчебныйСервис85.СоздатьWSПрокси("urn:guide:metadata85", "StudyService85", "StudyPort85",
        ИнтернетМаршрут, 30, Неопределено, "http://127.0.0.1:9/metadata-study-85", Ложь);
    Паспорт = СоздатьСвоюТаблицу();
    ПроверитьСвойПрофиль(Паспорт, ИзОпределения, 20, "Из определения");
    ПроверитьСвойПрофиль(Паспорт, ИзМенеджера, 30, "Из менеджера");
    Если ИзОпределения.Пользователь <> "" Или ИзОпределения.Пароль <> "" Тогда
        ВызватьИсключение "Нужен новый собственный объект без исходных учётных данных";
    КонецЕсли;
    Попытка
        ИзОпределения.Пользователь = "guide-local-demo";
        ИзОпределения.Пароль = "not-a-real-password";
        Если ИзОпределения.Пользователь <> "guide-local-demo" Или ИзОпределения.Пароль <> "not-a-real-password" Тогда
            ВызватьИсключение "Два изменяемых поля не подтвердили локальную установку";
        КонецЕсли;
        ДобавитьСтроку(Паспорт, "Из определения", "Dummy-логин проверен локально", Истина);
        ДобавитьСтроку(Паспорт, "Из определения", "Dummy-пароль проверен без вывода", Истина);
    Исключение
        ИзОпределения.Пользователь = "";
        ИзОпределения.Пароль = "";
        ВызватьИсключение;
    КонецПопытки;
    ИзОпределения.Пользователь = "";
    ИзОпределения.Пароль = "";
    Если ИзОпределения.Пользователь <> "" Или ИзОпределения.Пароль <> "" Тогда
        ВызватьИсключение "Возврат пустых локальных учётных полей не подтверждён";
    КонецЕсли;
    ПоказатьСвойПаспорт(Паспорт, "Два своих профиля WSПрокси, без вызова Echo и проверки сети");
КонецПроцедуры

Процедура ПроверитьСвойПрофиль(Паспорт, Клиент, ОжидаемыйТаймаут, Заголовок)
    Если ТипЗнч(Клиент) <> Тип("WSПрокси") Или Клиент.Таймаут <> ОжидаемыйТаймаут
        Или Клиент.ИспользоватьАутентификациюОС Или Клиент.ЗащищенноеСоединение <> Неопределено Тогда
        ВызватьИсключение "Не совпали локальный тип, таймаут или выбранные флаги транспорта";
    КонецЕсли;
    Если ТипЗнч(Клиент.Прокси) <> Тип("ИнтернетПрокси") Или ТипЗнч(Клиент.ФабрикаXDTO) <> Тип("ФабрикаXDTO")
        Или ТипЗнч(Клиент.Определение) <> Тип("WSОпределения") Тогда
        ВызватьИсключение "Объекты транспорта, фабрики и WSDL нельзя путать между собой";
    КонецЕсли;
    Точка = Клиент.ТочкаПодключения;
    Если ТипЗнч(Точка) <> Тип("WSТочкаПодключения") Или Точка.Имя <> "StudyPort85"
        Или Точка.Местоположение <> "http://127.0.0.1:9/metadata-study-85" Тогда
        ВызватьИсключение "Профиль связан не с собственным учебным портом";
    КонецЕсли;
    ДобавитьСтроку(Паспорт, Заголовок, "Таймаут в секундах", Клиент.Таймаут);
    ДобавитьСтроку(Паспорт, Заголовок, "Аутентификация ОС", Клиент.ИспользоватьАутентификациюОС);
    ДобавитьСтроку(Паспорт, Заголовок, "TLS-объект указан", Клиент.ЗащищенноеСоединение <> Неопределено);
    ДобавитьСтроку(Паспорт, Заголовок, "Тип ИнтернетПрокси", ТипЗнч(Клиент.Прокси));
    ДобавитьСтроку(Паспорт, Заголовок, "Тип ФабрикаXDTO", ТипЗнч(Клиент.ФабрикаXDTO));
    ДобавитьСтроку(Паспорт, Заголовок, "Сервисов в определении", Клиент.Определение.Сервисы.Количество());
    ДобавитьСтроку(Паспорт, Заголовок, "Порт без вызова", Точка.Имя);
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеКонтрактыМетаданных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>

Разбор по шагам

  1. Берём проверенное собственное определение и создаём ИнтернетПрокси(Ложь), чтобы не инициализировать его inetcfg.xml/настройками ОС. ИнтернетПрокси — транспортный маршрут, не SOAP-объект WSПрокси.

  2. Новый WSПрокси принимает определение, namespace, имя сервиса и имя точки подключения, затем транспорт, таймаут 20, отсутствие TLS, свой адрес и Ложь для аутентификации ОС.

  3. СоздатьWSПрокси менеджера не получает отдельный WSОпределения: менеджер использует свой импорт. Позиции необязательных параметров сдвинуты; таймаут выбран 30 секунд для сравнения двух профилей.

  4. Таймаут, ИспользоватьАутентификациюОС, ЗащищенноеСоединение, Прокси, Определение, ТочкаПодключения и ФабрикаXDTO читаются. Таймаут readonly: его задаём при создании, не присваиваем свойству.

  5. Профиль проверяет собственный StudyPort85, ожидаемый адрес и реальные классы WSОпределения/ФабрикаXDTO/ИнтернетПрокси. Он не проверяет доступность адреса или правильность аутентификации на сервере.

  6. Только Пользователь и Пароль изменяемы. До опыта требуем пустые поля нового своего объекта, задаём известные ненастоящие строки, сравниваем локально и выводим лишь Булево подтверждения, не пароль.

  7. Пустые исходные поля возвращаются после успеха и при ошибке локальной проверки. Это изменение объекта в памяти, не изменение аккаунта внешнего сервиса или сохранённого секрета.

  8. Операция Echo нигде не вызывается. Наличие объекта WSПрокси — готовность локального профиля к отдельному будущему тесту, не успешный обмен. Поэтому пункт <Имя метода> этим уроком не закрывается.

Как проверить результат

  1. Будущий паспорт показывает 20 и 30 секунд, аутентификацию ОС Ложь, отсутствие TLS-объекта и свои реальные классы фабрики/определения/маршрута. Здесь runtimeVerifiedScenarios=0.

  2. StudyPort85 и его собственный адрес должны совпадать с приложенным WSDL; случайный другой endpoint вызывает отказ до учётного опыта.

  3. Dummy-пользователь и dummy-пароль подтверждаются только локальным сравнением; пароль не попадает в паспорт или сообщение об ошибке. После опыта оба поля пусты.

  4. Неверные namespace/имя сервиса/имя порта должны дать отказ создания по контракту менеджера. Не подменяйте ошибку пустым клиентом и не пробуйте рабочие учётные данные.

  5. Изменение таймаута делается новым созданием, а не присваиванием readonly-свойству. Адрес не вызывается, успешной авторизации или SOAP-ответа в результате нет.

Ожидаемый результат

Подготовлен собственный локальный опыт без вызова операций веб-сервиса. Код и UI здесь не выполнялись: runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Описание WSDL и объект вызова WSПрокси — не результат работы внешней системы. Здесь Echo не вызывается и работоспособность сервиса не проверяется.

  2. Имена сервисов выбираются парой namespace/локальное имя; URI namespace не является URL для сетевого запроса. Местоположение порта — адрес будущего вызова, а URLИсточника WS-ссылки — источник WSDL.

  3. Все описания WS, коллекции и транспортные свойства, кроме логина/пароля WSПрокси, здесь только читаются. Коллекции описания не имеют выдуманных конструкторов, Добавить или Удалить.

  4. Тип WS-параметра/ответа — описание XDTO, а не готовое передаваемое значение и не ОписаниеТипов 1С. ВозможноПустой/ВозможноПустое описывают допустимость Неопределено, не обязательное наличие такого значения.

  5. Статическая проверка не является импортом WSDL, F7, реальным SOAP-тестом или подтверждением точного отображения document/literal параметров платформой.

  6. Локальные ненастоящие строки не являются рекомендацией хранить реальные пароли в коде. Для настоящей интеграции потребуется отдельная безопасная схема получения секрета и разрешённый тест сервиса.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.