Внешние XSLT

Материал из razgovorov.ru
Перейти к: навигация, поиск

Общее описание

Внешние xslt - еще один из способов настройки Внешней Обработки для выгрузки документов. Использование такого метода интеграции требует от специалиста минимальных знаний по работе в 1С, но достаточно уверенного навыка работы с xsl преобразованиями.

Что можно сделать?

Вы сможете выгрузить документы не входящие в поставку нашей обработки, реализовать простую логику по подстановке данных в тот или иной реквизит при выгрузке/загрузке из 1С и при этом не писать ВнешниеФункции_Клиент.

Настройка

  1. В каталоге настроек Внешней Обработки создать папку c именем xslt.
  2. В эту папку поместить файлы с xsl преобразованиями имена которых задаются по маске: "<Файл_Формат>_<Файл_ВерсияФормата>.xslt". Если версия формата задана в ини файле через точку, то в названии xslt файла это значение должно идти через нижнее подчеркивание
  3. Перезапустить Внешнюю Обработку в 1С

Обратите внимание: Если название созданного Вами внешнего преобразования совпадет с названием стандартного xslt, зашитого в обработку, то оно будет полностью заменено внешним шаблоном.

Как это работает?

Внешняя Обработка на выходе (на выгрузку из 1С в СБиС) и на входе (на загрузку из СБиС в 1С) в основной алгоритм программы подает xml файлы всегда одинаковой структуры, схожей со структурой счета на оплату формата 3.01. После выполнения основных процедур к этим файлам применяются xslt преобразования по маске <Файл_Формат>_<Файл_ВерсияФормата>. Так у нас получаются "правильные по формату" xml для отправки в документооборот.

Как взять xslt преобразования, зашитые в обработку?

  1. Открыть конфигуратор 1С
  2. Открыть в нем обработку
  3. Создать на компютере zip - архив
  4. Скачать содержимое макета xslt в этот архив

Xslt.jpg

Пример использования

Выгрузка стандартного сублицензионного договора из 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>&lt;Реквизит Имя="ИдВизуализации" Значение="</xsl:text>
      <xsl:choose>
        <xsl:when test="//Файл/@КодФормы">
          <xsl:value-of select="//Файл/@КодФормы"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text></xsl:text>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:text>"/></xsl:text>
    </xsl:variable>
    <xsl:variable name="ТекстИнф2">
      <xsl:for-each select="//Файл/Документ/Параметр[@Имя!='' and @Значение!='']">
        <xsl:text>&lt;Реквизит Имя="</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>&lt;Реквизит Имя="</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>&lt;Реквизит Имя="НаимПост" Значение="</xsl:text>
        <xsl:value-of select="//Файл/Документ/Отправитель/@Название"/>
        <xsl:text>"/></xsl:text>
      </xsl:if>
      <xsl:if test="//Файл/Документ/Получатель/СвФЛ">
        <xsl:text>&lt;Реквизит Имя="НаимПокуп" Значение="</xsl:text>
        <xsl:value-of select="//Файл/Документ/Получатель/@Название"/>
        <xsl:text>"/></xsl:text>
      </xsl:if>
      <xsl:if test="//Файл/Документ/Грузоотправитель/СвФЛ">
        <xsl:text>&lt;Реквизит Имя="НаимГрузОтпр" Значение="</xsl:text>
        <xsl:value-of select="//Файл/Документ/Грузоотправитель/@Название"/>
        <xsl:text>"/></xsl:text>
      </xsl:if>
      <xsl:if test="//Файл/Документ/Грузополучатель/СвФЛ">
        <xsl:text>&lt;Реквизит Имя="НаимГрузПолуч" Значение="</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>&lt;Данные></xsl:text>
          <xsl:value-of select="$ТекстИнф1"/>
          <xsl:value-of select="$ТекстИнф2"/>
          <xsl:value-of select="$ТекстИнф3"/>
          <xsl:text>&lt;/Данные></xsl:text>
        </xsl:attribute>
      </ИнфПол>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>