Внешние XSLT
Содержание
Общее описание
Внешние xslt - еще один из способов настройки Внешней Обработки для выгрузки документов. Использование такого метода интеграции требует от специалиста минимальных знаний по работе в 1С, но достаточно уверенного навыка работы с xsl преобразованиями.
Что можно сделать?
Вы сможете выгрузить документы не входящие в поставку нашей обработки, реализовать простую логику по подстановке данных в тот или иной реквизит при выгрузке/загрузке из 1С и при этом не писать ВнешниеФункции_Клиент.
Настройка
- В каталоге настроек Внешней Обработки создать папку c именем xslt.
- В эту папку поместить файлы с xsl преобразованиями имена которых задаются по маске: <Файл_Формат>_<Файл_ВерсияФормата>.xslt
- Перезапустить Внешнюю Обработку в 1С
Обратите внимание: Если название созданного Вами внешнего преобразования совпадет с названием стандартного xslt, зашитого в обработку, то он будет полностью заменен внешним шаблоном.
Как это работает?
Внешняя Обработка на выходе (на выгрузку из 1С в СБиС) и на входе (на загрузку из СБиС в 1С) в основной алгоритм программы подает xml файлы всегда одинаковой структуры, схожей со структурой счета на оплату формата 3.01. Затем к этим файлам применяются xslt преобразования по маске <Файл_Формат>_<Файл_ВерсияФормата>, только после этого у нас получается "правильные" xml, годные для отправки в документооборот. Как взять xslt преобразования, зашитые в обработку?
- Открыть конфигуратор 1С
- Открыть в нем обработку
- Создать на компютере zip - архив
- Скачать содержимое макета xslt в этот архив
Пример использования
Выгрузка стандартного сублицензионного договора из 1С:Бухгалтерия Предприятия 2.0 из реестра документов РеализацияТоваровУслуг Изменения в пользвательском ини-файле
<мФайл Имя="ДогПП">
<Файл_Формат>'ДогПП'</Файл_Формат>
<Файл_ВерсияФормата>'3.01'</Файл_ВерсияФормата>
<Файл_Имя>'ON_CONTRACT_'</Файл_Имя>
...
Дальше copy-paste из стандартной инишки
...
</мФайл>
xslt файл с именем ДогПП_3_01
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="windows-1251"/>
<xsl:template match="Документ">
<Файл>
<xsl:attribute name="ВерсФорм">
<xsl:text>5.01</xsl:text>
</xsl:attribute>
<xsl:if test="//Файл/@ВерсПрог">
<xsl:attribute name="ВерсПрог">
<xsl:value-of select="//Файл/@ВерсПрог"/>
</xsl:attribute>
</xsl:if>
<xsl:attribute name="ИдФайл">
<xsl:value-of select="//Файл/@Имя"/>
</xsl:attribute>
<СвУчДокОбор>
<xsl:attribute name="ИдОтпр"/>
<xsl:attribute name="ИдПок"/>
<СвОЭДОтпр>
<xsl:attribute name="НаимОрг">
<xsl:text>ООО 'Компания 'Тензор'</xsl:text>
</xsl:attribute>
<xsl:attribute name="ИННЮЛ">
<xsl:text>7605016030</xsl:text>
</xsl:attribute>
<xsl:attribute name="ИдЭДО">
<xsl:text>2ВЕ</xsl:text>
</xsl:attribute>
</СвОЭДОтпр>
</СвУчДокОбор>
<Документ>
<СвДоговор>
<xsl:attribute name="Дата">
<xsl:value-of select="//Файл/Документ/@Дата"/>
</xsl:attribute>
<xsl:attribute name="Номер">
<xsl:value-of select="//Файл/Документ/@Номер"/>
</xsl:attribute>
<xsl:if test="//Файл/Документ/Отправитель">
<СвОтпр>
<xsl:call-template name="ИдСв">
<xsl:with-param name="node" select="//Файл/Документ/Отправитель"/>
</xsl:call-template>
<xsl:call-template name="Адрес">
<xsl:with-param name="node" select="//Файл/Документ/Отправитель/Адрес"/>
</xsl:call-template>
</СвОтпр>
</xsl:if>
<xsl:if test="//Файл/Документ/Получатель">
<СвПол>
<xsl:call-template name="ИдСв">
<xsl:with-param name="node" select="//Файл/Документ/Получатель"/>
</xsl:call-template>
<xsl:call-template name="Адрес">
<xsl:with-param name="node" select="//Файл/Документ/Получатель/Адрес"/>
</xsl:call-template>
</СвПол>
</xsl:if>
<html>
Текст договора в html
</html>
</СвДоговор>
<Подписант>
<ЮЛ>
<xsl:attribute name="ИННЮЛ"/>
<xsl:attribute name="Должн"/>
<ФИО>
<xsl:attribute name="Фамилия"/>
<xsl:attribute name="Имя"/>
<xsl:attribute name="Отчество"/>
</ФИО>
</ЮЛ>
</Подписант>
</Документ>
</Файл>
</xsl:template>
<xsl:template name="ИдСв">
<xsl:param name="node"/>
<ИдСв>
<xsl:choose>
<xsl:when test="$node/СвФЛ">
<СвФЛ>
<xsl:attribute name="ИННФЛ">
<xsl:value-of select="$node/СвФЛ/@ИНН"/>
</xsl:attribute>
<ФИОИП>
<xsl:choose>
<xsl:when test="$node/СвФЛ/@Фамилия!='' and $node/СвФЛ/@Имя!=''">
<xsl:attribute name="Фамилия">
<xsl:value-of select="$node/СвФЛ/@Фамилия"/>
</xsl:attribute>
<xsl:attribute name="Имя">
<xsl:value-of select="$node/СвФЛ/@Имя"/>
</xsl:attribute>
<xsl:if test="$node/СвФЛ/@Отчество!=''">
<xsl:attribute name="Отчество">
<xsl:value-of select="$node/СвФЛ/@Отчество"/>
</xsl:attribute>
</xsl:if>
</xsl:when>
<xsl:when test="$node/СвФЛ/@Название!=''">
<xsl:variable name="surName" select="substring-before($node/СвФЛ/@Название,' ')"/>
<xsl:variable name="strWithoutSurname" select="substring-after($node/СвФЛ/@Название,' ')"/>
<xsl:variable name="name" select="substring-before($strWithoutSurname,' ')"/>
<xsl:variable name="fatherName" select="substring-after($strWithoutSurname,' ')"/>
<xsl:attribute name="Фамилия">
<xsl:value-of select="$surName"/>
</xsl:attribute>
<xsl:attribute name="Имя">
<xsl:value-of select="$name"/>
</xsl:attribute>
<xsl:if test="$fatherName!=''">
<xsl:attribute name="Отчество">
<xsl:value-of select="$fatherName"/>
</xsl:attribute>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="surName" select="substring-before($node/@Название,' ')"/>
<xsl:variable name="strWithoutSurname" select="substring-after($node/@Название,' ')"/>
<xsl:variable name="name" select="substring-before($strWithoutSurname,' ')"/>
<xsl:variable name="fatherName" select="substring-after($strWithoutSurname,' ')"/>
<xsl:attribute name="Фамилия">
<xsl:value-of select="$surName"/>
</xsl:attribute>
<xsl:attribute name="Имя">
<xsl:value-of select="$name"/>
</xsl:attribute>
<xsl:if test="$fatherName!=''">
<xsl:attribute name="Отчество">
<xsl:value-of select="$fatherName"/>
</xsl:attribute>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</ФИОИП>
</СвФЛ>
</xsl:when>
<xsl:otherwise>
<СвЮЛ>
<xsl:attribute name="НаимОрг">
<xsl:choose>
<xsl:when test="$node/СвЮЛ/@Название !=''">
<xsl:value-of select="$node/СвЮЛ/@Название"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$node/@Название"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="ИННЮЛ">
<xsl:value-of select="$node/СвЮЛ/@ИНН"/>
</xsl:attribute>
<xsl:attribute name="КПП">
<xsl:value-of select="$node/СвЮЛ/@КПП"/>
</xsl:attribute>
</СвЮЛ>
</xsl:otherwise>
</xsl:choose>
</ИдСв>
</xsl:template>
<xsl:template name="Адрес">
<xsl:param name="node"/>
<Адрес>
<xsl:choose>
<xsl:when test="$node/АдрРФ">
<АдрРФ>
<xsl:for-each select="$node/АдрРФ/@*">
<xsl:if test=". !=''">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:if>
</xsl:for-each>
</АдрРФ>
</xsl:when>
<xsl:when test="$node/АдрИно">
<АдрИно>
<xsl:attribute name="КодСтр">
<xsl:choose>
<xsl:when test="$node/АдрИно/@КодСтр!=''">
<xsl:value-of select="$node/АдрИно/@КодСтр"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>643</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="АдрТекст">
<xsl:value-of select="$node/АдрИно/@АдрТекст"/>
</xsl:attribute>
</АдрИно>
</xsl:when>
<xsl:otherwise>
<АдрИно>
<xsl:attribute name="КодСтр">
<xsl:text>643</xsl:text>
</xsl:attribute>
<xsl:attribute name="АдрТекст">
<xsl:value-of select="$node/@АдрТекст"/>
</xsl:attribute>
</АдрИно>
</xsl:otherwise>
</xsl:choose>
</Адрес>
</xsl:template>
<xsl:template name="БанкРекв">
<xsl:param name="node"/>
<БанкРекв>
<xsl:if test="$node/@РСчет">
<xsl:attribute name="НомерСчета">
<xsl:value-of select="$node/@РСчет"/>
</xsl:attribute>
</xsl:if>
<СвБанк>
<xsl:if test="$node/@НаимБанк">
<xsl:attribute name="НаимБанк">
<xsl:value-of select="$node/@НаимБанк"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$node/@БИК">
<xsl:attribute name="БИК">
<xsl:value-of select="$node/@БИК"/>
</xsl:attribute>
</xsl:if>
</СвБанк>
</БанкРекв>
</xsl:template>
<xsl:template name="Контакт">
<xsl:param name="node"/>
<Контакт>
<xsl:if test="$node/@Телефон">
<xsl:attribute name="Тлф">
<xsl:value-of select="substring($node/@Телефон, 1, 20)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$node/@Факс">
<xsl:attribute name="Факс">
<xsl:value-of select="substring($node/@Факс, 1, 20)"/>
</xsl:attribute>
</xsl:if>
</Контакт>
</xsl:template>
<xsl:template name="ИнфПол">
<xsl:variable name="ТекстИнф1">
<xsl:text><Реквизит Имя="ИдВизуализации" Значение="</xsl:text>
<xsl:choose>
<xsl:when test="//Файл/@КодФормы">
<xsl:value-of select="//Файл/@КодФормы"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>1С</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>"/></xsl:text>
</xsl:variable>
<xsl:variable name="ТекстИнф2">
<xsl:for-each select="//Файл/Документ/Параметр[@Имя!='' and @Значение!='']">
<xsl:text><Реквизит Имя="</xsl:text>
<xsl:value-of select="@Имя"/>
<xsl:text>" Значение="</xsl:text>
<xsl:value-of select="@Значение"/>
<xsl:text>"/></xsl:text>
</xsl:for-each>
<xsl:for-each select="//Документ/ТаблДок/ИтогТабл/Параметр[@Имя!='' and @Значение!='']">
<xsl:text><Реквизит Имя="</xsl:text>
<xsl:value-of select="@Имя"/>
<xsl:text>" Значение="</xsl:text>
<xsl:value-of select="@Значение"/>
<xsl:text>"/></xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="ТекстИнф3">
<xsl:if test="//Файл/Документ/Отправитель/СвФЛ">
<xsl:text><Реквизит Имя="НаимПост" Значение="</xsl:text>
<xsl:value-of select="//Файл/Документ/Отправитель/@Название"/>
<xsl:text>"/></xsl:text>
</xsl:if>
<xsl:if test="//Файл/Документ/Получатель/СвФЛ">
<xsl:text><Реквизит Имя="НаимПокуп" Значение="</xsl:text>
<xsl:value-of select="//Файл/Документ/Получатель/@Название"/>
<xsl:text>"/></xsl:text>
</xsl:if>
<xsl:if test="//Файл/Документ/Грузоотправитель/СвФЛ">
<xsl:text><Реквизит Имя="НаимГрузОтпр" Значение="</xsl:text>
<xsl:value-of select="//Файл/Документ/Грузоотправитель/@Название"/>
<xsl:text>"/></xsl:text>
</xsl:if>
<xsl:if test="//Файл/Документ/Грузополучатель/СвФЛ">
<xsl:text><Реквизит Имя="НаимГрузПолуч" Значение="</xsl:text>
<xsl:value-of select="//Файл/Документ/Грузополучатель/@Название"/>
<xsl:text>"/></xsl:text>
</xsl:if>
</xsl:variable>
<xsl:if test="$ТекстИнф1!='' or $ТекстИнф2!='' or $ТекстИнф3!=''">
<ИнфПол>
<xsl:attribute name="ТекстИнф">
<xsl:text><Данные></xsl:text>
<xsl:value-of select="$ТекстИнф1"/>
<xsl:value-of select="$ТекстИнф2"/>
<xsl:value-of select="$ТекстИнф3"/>
<xsl:text></Данные></xsl:text>
</xsl:attribute>
</ИнфПол>
</xsl:if>
</xsl:template>
</xsl:stylesheet>