Настройка заголовков исходящего SOAP-сообщения

SOAP-заголовки могут использоваться для передачи дополнительной информации, непосредственно не связанной с задачей, решаемой операцией сервиса. В частности, это может быть информация, используемая для проверки прав доступа к сервису. Для этого часто используется стандарт Web Service Security, который определяет набор стандартных SOAP-заголовков для аутентификации и шифрования. Например, SOAP-сервис магазина содержит операцию ДобавитьВКаталог для добавления товара (строка-наименование и число-количество) в каталог. Для этой операции в сервисе реализована проверка доступа через WSS-токен UsernameToken. Тогда для вызова операции клиенту требуется передать сервису SOAP-заголовок с именем пользователя и паролем. Упрощенный фрагмент WSDL-описания сервиса:
<definitions>
	<types>
		<schema>
			<element name="ДобавитьВКаталог" type="tns:ДобавитьВКаталог"/>
			<element name="ДобавитьВКаталогResponse" type="tns:ДобавитьВКаталогResponse"/>
			<element name="Товар" type="tns:Товар"/>
			<complexType name="ДобавитьВКаталог">
				<sequence>
					<element minOccurs="0" name="arg0" type="tns:Товар"/>
				</sequence>
			</complexType>
			<complexType final="extension restriction" name="Товар">
				<sequence>
					<element name="Количество" type="int"/>
					<element minOccurs="0" name="Наименование" type="string"/>
				</sequence>
			</complexType>
			<complexType name="ДобавитьВКаталогResponse">
				<sequence>
					<element minOccurs="0" name="return" type="string"/>
				</sequence>
			</complexType>
		</schema>
	</types>
	<message name="ДобавитьВКаталог">
		<part element="tns:ДобавитьВКаталог" name="parameters"/>
	</message>
	<message name="ДобавитьВКаталогResponse">
		<part element="tns:ДобавитьВКаталогResponse" name="parameters"/>
	</message>
	<portType name="СервисМагазина">
		<operation name="ДобавитьВКаталог">
			<input message="tns:ДобавитьВКаталог" wsam:Action="ДобавитьВКаталог"/>
			<output message="tns:ДобавитьВКаталогResponse"/>
		</operation>
	</portType>
</definitions>
У клиента КлиентСервисаМагазина генерируется метод ДобавитьВКаталог. Для настройки SOAP-заголовка с именем пользователя и паролем в модуле клиента SOAP-сервиса следует добавить обработчик НастроитьЗаголовкиSoap<ИмяМетодаСервиса>. Обработчик будет вызван при выполнении метода ДобавитьВКаталог, он добавит в запрос SOAP-заголовок с именем пользователя и паролем:
const ПРОСТРАНСТВО_WSS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

@ВПроекте
структура ЗаголовокТокенПользователя
    знч Пользователь: Строка
    знч Пароль: Строка
;

@Обработчик
метод НастроитьЗаголовкиSoapДобавитьВКаталог(Парам: КлиентСервисаМагазина.Товар?, ЗаписьSoap: ЗаписьSoap_1_1,
    ПараметрЗаголовков: Объект?)
    знч ЗаголовокWss = ЗаписьSoap.СоздатьЗаголовок("Security", ПРОСТРАНСТВО_WSS)

    если ПараметрЗаголовков это ЗаголовокТокенПользователя
        ЗаголовокWss.ЗаписатьНачалоЭлемента("UsernameToken", ПРОСТРАНСТВО_WSS)

        знч ТокенПользователя = ПараметрЗаголовков как ЗаголовокТокенПользователя
        ЗаголовокWss.ЗаписатьНачалоЭлемента("Username", ПРОСТРАНСТВО_WSS)
        ЗаголовокWss.ЗаписатьТекст(ТокенПользователя.Пользователь)
        ЗаголовокWss.ЗаписатьКонецЭлемента()

        ЗаголовокWss.ЗаписатьНачалоЭлемента("Password", ПРОСТРАНСТВО_WSS)
        ЗаголовокWss.ЗаписатьТекст(ТокенПользователя.Пароль)
        ЗаголовокWss.ЗаписатьКонецЭлемента()

        ЗаголовокWss.ЗаписатьКонецЭлемента()
    ;

    ЗаголовокWss.ЗаписатьКонецЭлемента()
;
При вызове метода ДобавитьВКаталог необходимо указать данные, которые требуется записать в SOAP-заголовок. Объект ДанныеТокена передается в обработчик НастроитьЗаголовкиSoapДобавитьВКаталог через параметр ПараметрЗаголовков.
знч КлиентСервиса = новый КлиентСервисаМагазина()
знч НовыйТовар = новый КлиентСервисаМагазина.Товар(Количество, Наименование)
знч ДанныеТокена = новый КлиентСервисаМагазина.ЗаголовокТокенПользователя("User", "Password")
знч ОтветСервиса = КлиентСервиса.ДобавитьВКаталог(НовыйТовар, ДанныеТокена)