WEB-приложение Сведение отчетности- Загрузка отчетов  (раздел целиком)  (26.07.2026)
Загрузка отчетов
Сервис реализует возможность загрузки отчетов из внешних файлов различных типов. Тип файла определяется его содержимым. Поддерживаются следующие типы файлов:
  1. xml-документ, выгруженный для центра учета из (другого либо того же самого) центра учета. Для загрузки файлов этого типа никаких дополнительных действий предпринимать не нужно.
  2. pra-архив, выгруженный для центра учета из (другого либо того же самого) центра учета. Для загрузки архивов этого типа никаких дополнительных действий предпринимать не нужно.
  3. pra-архив, выгруженный для центра учета из абонентского пункта Excel. Для загрузки архивов этого типа никаких дополнительных действий предпринимать не нужно.
  4. xml-документ произвольной структуры. Для этого необходимо разработать схему для валидации документа (файл с расширением xsd) и xslt-преобразование (файл с расширением xsl), соответственно для валидации и преобразования загружаемых xml-документов. Схемы, указанные в списке при настройке сервиса, перебираются последовательно. Если для той или иной схемы документ проходит валидацию по схеме, то произойдет преобразование по соответствующему этой схеме сценарию, и дальнейшая загрузка результата преобразования, как xml-документа из пункта 1. Схемы перебираются последовательно.
  5. Текстовый файл. Для этого необходимо разработать скрипт загрузки текстового файла на языке прграммирования VBscript . Скрипты, указанные в списке при настройке сервиса, перебираются последовательно. Если пользовательский текстовый файл проходит преобразование скриптом (переменной InvalidData после завершения очередного скрипта присвоено значение False), то произойдет дальнейшая загрузка результата разбора, как xml-документа из пункта 1.
  6. Рабочая книга Microsoft Excel. Для этого необходимо разработать скрипт загрузки рабочих книг на языке прграммирования VBscript . Скрипты, указанные в списке при настройке сервиса, перебираются последовательно. Если пользовательский файл рабочей книги проходит преобразование скриптом (переменной InvalidData после завершения очередного скрипта присвоено значение False), то произойдет дальнейшая загрузка результата разбора, как xml-документа из пункта 1. Рабочие книги в формате xlsx поддерживаются при условии установки на сервере соответствующей версии Microsoft Office.

1. Разработка xslt-преобразований
Для реализации загрузки отчетов из xml-документов произвольной структуры необходимо предпринять следующие шаги:
  1. Внимательно изучить структуру, с которой придется иметь дело. Если схемы валидации документов такой структуры не существует, ее придется разработать самостоятельно.
    Пример
    Например, нам нужно иметь дело с документами следующей структуры:
    1<data>
    2  <report agent="РосПищеСвет" form="Форма 160.285">
    3    <subreport ЗаСпички="100" ЗаМыло="200" Качество="Хорошее" />
    4    <subreport code="Разрез 1" ЗаСпички="10" ЗаМыло="20" Качество="Среднее" />
    5    <subreport code="Разрез 2" ЗаСпички="80" ЗаМыло="280" Качество="Отличное" />
    6  </report>
    7</data>
    Для валидации документов такой структуры создадим xsd-схему:
    01<xs:schema
    02  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    03  <xs:element name="data">
    04  <!--  Корневой элемент документа имеет имя "data" -->
    05    <xs:complexType>
    06      <xs:sequence>
    07        <xs:element name="report" maxOccurs="unbounded">
    08        <!--  Корневой элемент включает в себя любое количество элементов "report" -->
    09          <xs:complexType>
    10            <xs:sequence>
    11              <xs:element maxOccurs="unbounded" name="subreport">
    12              <!--  Элемент "report" включает в себя любое количество элементов "subreport" -->
    13                <xs:complexType>
    14                  <xs:attribute name="code" type="xs:string" use="optional" />
    15                  <!--  Элемент "subreport" имеет необязательный атрибут "code" -->
    16                  <xs:anyAttribute processContents="skip" />
    17                  <!--  Элемент "subreport" имеет неизвестное заранее количество любых атрибутов
    18                    Это будут значения показателей.
    19                   -->
    20                </xs:complexType>
    21              </xs:element>
    22            </xs:sequence>
    23            <xs:attribute name="agent" type="xs:string" use="required" />
    24            <!--  Элемент "report" имеет обязательный строковый атрибут "agent" -->
    25            <xs:attribute name="form" type="xs:string" use="required" />
    26            <!--  Элемент "report" имеет обязательный строковый атрибут "form" -->
    27          </xs:complexType>
    28        </xs:element>
    29      </xs:sequence>
    30    </xs:complexType>
    31  </xs:element>
    32</xs:schema>
  2. Теперь нам нужно научиться превращать документы в документы стандартной структуры Парус 8:
    01<REPORTS>
    02  <!-- отчет -->
    03  <REPORT>
    04    <!-- обязательные элементы -->
    05    <AGENT>Мнемокод контрагента</AGENT>
    06    <FORM>Мнемокод формы</FORM>
    07    <BDATE>Дата отчета</BDATE>
    08    <KIND>0-первичный отчет, 1-сводный отчет</KIND>
    09
    10    <!-- необязательные элементы -->
    11    <CATALOG>Наименование каталога</CATALOG>
    12    <CHECKED>0-непроверен;1-проверен</CHECKED>
    13    <STATE>Состояние отчета</STATE>
    14    <SENT>Отправлен</SENT>
    15
    16    <!-- подотчеты -->
    17    <SUBREPORTS>
    18
    19      <!-- главный подотчет -->
    20      <SUBREPORT>
    21        <!-- значения одиночных показателей -->
    22        <VALUES>
    23          <VALUE>
    24            <CODE>Мнемокод показателя</CODE>
    25            <!-- один из трех вариантов -->
    26            <NVAL>Число</NVAL>
    27            <SVAL>Строка</SVAL>
    28            <DVAL>Дата</DVAL>
    29          </VALUE>
    30          <VALUE>
    31            ...
    32          </VALUE>
    33        </VALUES>
    34
    35        <!-- таблицы показателей -->
    36        <TABLES>
    37          <TABLE>
    38            <NAME>Наименование таблицы</NAME>
    39            <!-- строки таблицы -->
    40            <ROWS>
    41              <ROW>
    42                <VALUE>
    43                  <CODE>Мнемокод показателя в составе таблицы</CODE>
    44                  <!-- один из трех вариантов -->
    45                  <NVAL>Число</NVAL>
    46                  <SVAL>Строка</SVAL>
    47                  <DVAL>Дата</DVAL>
    48                </VALUE>
    49                <VALUE>
    50                  ...
    51                </VALUE>
    52              </ROW>
    53              <ROW>
    54                ...
    55              </ROW>
    56            </ROWS>
    57          </TABLE>
    58          <TABLE>
    59            ...
    60          </TABLE>
    61        </TABLES>
    62      </SUBREPORT>
    63      <SUBREPORT>
    64        <CODE>Мнемокод разреза</CODE>
    65          ...
    66      </SUBREPORT>
    67    </SUBREPORTS>
    68  </REPORT>
    69  <REPORT>
    70    ...
    71  </REPORT>
    72</REPORTS>
    Пример
    Преобразование нашего исходного документа к стандартной структуре:
    01<xsl:stylesheet version="1.0"
    02                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    03                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    04                xmlns:parus="parus.xslt"
    05                xmlns:vbs="parus.vbscript"
    06                exclude-result-prefixes="xsl msxsl parus vbs">
    07<!-- Пространства имен:
    08  xsl - стандартное пространство имен элементов xslt
    09  msxsl - расширение Microsoft пространства имен xslt
    10  parus - "наше" пространство имен. Принадлежащие ему идентификаторы описаны ниже.
    11  vbs - "локальное" пространство имен, через которое мы будем получать доступ к скриптовым функциям. -->
    12
    13<!-- нам понадобятся возможнсти, которые не предоставляются стандартными средствами xslt-транслятора.
    14Напрмер, нам будет нужна текущая дата. Определелим в локальном пространстве имен скриптовую функцию,
    15возвращающую отформатированную дату -->
    16  <msxsl:script language="VBScript" implements-prefix="vbs">
    17  <![CDATA[
    18    function today()
    19      today = Year(Date) & "-" & Month(Date) & "-" & Day(Date)
    20    end function
    21  ]]>
    22  </msxsl:script>
    23
    24  <xsl:output encoding="UTF-8"
    25              method="xml"/>
    26
    27  <!-- шаблон корневого узла. Он будет применен один и только один раз. -->
    28  <xsl:template match="/">
    29    <!-- Элемент целевой структуры -->
    30    <REPORTS>
    31
    32      <!-- Для каждого элемента "report" исходной структуры ... -->
    33      <xsl:for-each select="data/report">
    34        <REPORT>
    35          <!-- выводим сообщение пользователю. Он увидит его протоколе загрузки -->
    36          <xsl:value-of select="parus:Message(concat('Сообщение пользователю при загрузке файла ', parus:FileName(), '.'))"/>
    37
    38          <!-- выводим сообщение в отладочный монитор. -->
    39          <xsl:value-of select="parus:DebugString('Сообщение в монитор.')"/>
    40
    41          <!-- эти элементы бререм из атрибутов узла "report" -->
    42          <AGENT><xsl:value-of select="@agent"/></AGENT>
    43          <FORM><xsl:value-of select="@form"/></FORM>
    44
    45          <!-- Формируем дату как результат вызова скриптовой функции -->
    46          <BDATE><xsl:value-of select="vbs:today()" /></BDATE>
    47
    48          <!-- константа -->
    49          <KIND>0</KIND>
    50
    51          <SUBREPORTS>
    52            <!-- цикл по элементам "subreport" -->
    53            <xsl:for-each select="subreport">
    54              <SUBREPORT>
    55
    56                <!-- если "subreport" имеет атрибут "code", то использовать его -->
    57                <xsl:if test="@code">
    58                  <CODE><xsl:value-of select="@code"/></CODE>
    59                </xsl:if>
    60
    61                <VALUES>
    62                  <!-- цикл по всем атрибутам элемента "subreport" -->
    63                  <xsl:for-each select="@*">
    64                    <!-- если атрибут имеет имя, отличное от "code", то это показатель -->
    65                    <xsl:if test="not(name(.)='code')">
    66                      <VALUE>
    67                        <CODE><xsl:value-of select="name(.)"/></CODE>
    68                        <SVAL><xsl:value-of select="." /></SVAL>
    69                      </VALUE>
    70                    </xsl:if>
    71                  </xsl:for-each>
    72                </VALUES>
    73              </SUBREPORT>
    74            </xsl:for-each>
    75          </SUBREPORTS>
    76        </REPORT>
    77      </xsl:for-each>
    78    </REPORTS>
    79  </xsl:template>
    80</xsl:stylesheet>
    В результате применения этого преобразования к нашему документу мы получим следующий документ:
    01<REPORTS>
    02  <REPORT>
    03    <AGENT>РосПищеСвет</AGENT>
    04    <FORM>Форма 160.285</FORM>
    05    <BDATE>2015-10-15</BDATE>
    06    <KIND>0</KIND>
    07    <SUBREPORTS>
    08      <SUBREPORT>
    09        <VALUES>
    10          <VALUE>
    11            <CODE>ЗаСпички</CODE>
    12            <SVAL>100</SVAL>
    13          </VALUE>
    14          <VALUE>
    15            <CODE>ЗаМыло</CODE>
    16            <SVAL>200</SVAL>
    17          </VALUE>
    18          <VALUE>
    19            <CODE>Качество</CODE>
    20            <SVAL>Хорошее</SVAL>
    21          </VALUE>
    22        </VALUES>
    23      </SUBREPORT>
    24      <SUBREPORT>
    25        <CODE>Разрез 1</CODE>
    26        <VALUES>
    27          <VALUE>
    28            <CODE>ЗаСпички</CODE>
    29            <SVAL>10</SVAL>
    30          </VALUE>
    31          <VALUE>
    32            <CODE>ЗаМыло</CODE>
    33            <SVAL>20</SVAL>
    34          </VALUE>
    35          <VALUE>
    36            <CODE>Качество</CODE>
    37            <SVAL>Среднее</SVAL>
    38          </VALUE>
    39        </VALUES>
    40      </SUBREPORT>
    41      <SUBREPORT>
    42        <CODE>Разрез 2</CODE>
    43        <VALUES>
    44          <VALUE>
    45            <CODE>ЗаСпички</CODE>
    46            <SVAL>80</SVAL>
    47          </VALUE>
    48          <VALUE>
    49            <CODE>ЗаМыло</CODE>
    50            <SVAL>280</SVAL>
    51          </VALUE>
    52          <VALUE>
    53            <CODE>Качество</CODE>
    54            <SVAL>Отличное</SVAL>
    55          </VALUE>
    56        </VALUES>
    57      </SUBREPORT>
    58    </SUBREPORTS>
    59  </REPORT>
    60</REPORTS>
    Этот документ вполне соответствует стандартной структуре, и, если в БД существуют соответствующая форма, контрагент, показатели и разрезы, то он загрузится.
Важно!
Элементы пространства имен с uri "parus.xslt":
  • Функция FileName () возвращает имя загруженного пользователем файла.
  • Функция Message (Text: string) передает строковый аргумент пользователю в протокол загрузки отчета. Возвращает пустую строку. Если вы хотите передать этой функции что-то, отличное от строки, то преобразуйте аргумент в строку функцией string. Например, <xsl:value-of select="parus:Message(string(@code))" />
  • Функция DebugString (Text: string) передает строковый аргумент в отладочный монитор. Возвращает пустую строку. Если вы хотите передать этой функции что-то, отличное от строки, то преобразуйте аргумент в строку функцией string. Например, <xsl:value-of select="parus:DebugString(string(@code))" />
  • Функция SessionValue (Name: string) возвращает сохраненное в сессии значение с именем, определяемым параметром Name. Например, <xsl:value-of select="parus:SessionValue("agent")" />
Этими функциями вы можете пользоваться в своих xslt-преобразованиях.

2. Разработка скриптов загрузки
Скрипты - загрузчики разрабатываются на языке VBscript . В скрипте загрузки вы можете использовать следующие интерфейсные элементы:
  • Процедура Message (Text: string) передает строковый аргумент пользователю в протокол загрузки отчета.
  • Процедура DebugString (Text: string) передает строковый аргумент в отладочный монитор.
  • Переменная FileName : string (только для чтения) содержит имя загруженного пользователем файла.
  • Переменная xml : Object содержит объект MSXML DOM Document . Во время исполнения скрипта этот документ пуст. Ожидается, что скрипт наполнит его узлами в соответствии с информацией, доступной скрипту их загруженного файла. Именно этот документ будет в дальнейшем загружаться в базу данных. Структура этого документа достаточно подробно описана здесь.
    Совет
    Вы можете вывести текст сформированного документа в отладочный монитор оператором
    DebugString xml.xml
  • Переменная InvalidData : BOOL содержит результат разбора файла скриптом. Если ваш скрипт "признал файл своим", присвойте этой переменной значение True, если нет, то присвойте ей значение False.
    Важно!
    Переменная InvalidData по умолчанию имеет значение False. Скрипт, который "забудет" присвоить значение этой переменной, "захватит" любой проходящий через него файл.
  • Функция SessionValue (Name: string) : string возвращает сохраненное в сессии значение с именем, определяемым параметром Name.

Ниже будут рассмотрены особенности загрузчиков файлов различных типов, и даны соответствующие примеры.


2.1. Загрузка текстовых файлов
В дополнение к ранее описанным объектам, скрипт загрузки текстового файла имеет доступ к следующему:
  • Переменная StringCount : Integer (только для чтения) содержит количество строк в загружаемом текстовом файле.
  • Функция Strings(Index: Integer) : string возвращает строку загружаемого файла с номером Index. Строки нумеруются с нуля. Попытка обратиться к несуществующей строке приведет к ошибке.
Пример
Ниже приведен откомментированный пример скрипта загрузки текстового файла:
001'Так можно и нужно анализировать строки пришедшего текстового файла.
002'Количество строк - StringCount, строка с номером I - Strings(I), нумерация с 0.
003
004'Фактически здесь написано: если на четвертой (с номером 3) строке написано что-то,
005'отличное от "Форма 160/128q", то это не "наш" текстовый файл, его не надо обрабатывать.
006if StringCount < 4 then
007  'Количество строк меньше четырех. Это точно не "нащ" файл.
008  InvalidData = True
009elseif Strings(3) <> "Форма 160/128q" then
010  'Текстовый файл не признан "своим".
011  InvalidData = True
012else
013  'Следите за отступами.
014
015  Message("Анализируем файл.") 'Сообщение пользователю в протокол загрузки.
016
017  '1. Создание корневого элемента REPORTS
018  set xml.documentElement = xml.createElement("REPORTS")
019
020  '2. Создание элемента-отчета. Повторять столько раз, сколько нужно отчетов.
021  with xml.documentElement.appendChild(xml.createElement("REPORT"))
022
023    '3. Атрибуты отчета
024
025    .appendChild(xml.createElement("AGENT")).appendChild(xml.createTextNode("Мнемокод контрагента"))
026    .appendChild(xml.createElement("FORM")).appendChild(xml.createTextNode("Мнемокод формы"))
027    .appendChild(xml.createElement("BDATE")).appendChild(xml.createTextNode("Дата в формете YYYY-MM-DD"))
028    .appendChild(xml.createElement("NOTE")).appendChild(xml.createTextNode("Примечание!!!"))
029    .appendChild(xml.createElement("KIND")).appendChild(xml.createTextNode("0")) '0-первичный, 1-сводный
030
031    'Также можно установить дополнительные атрибуты отчета:
032    '.appendChild(xml.createElement("CATALOG")).appendChild(xml.createTextNode("Наименование каталога"))
033    '.appendChild(xml.createElement("CHECKED")).appendChild(xml.createTextNode("1"))
034    '.appendChild(xml.createElement("STATE")).appendChild(xml.createTextNode("2"))
035    '.appendChild(xml.createElement("SENT")).appendChild(xml.createTextNode("1"))
036
037    '4. Список подотчетов
038    with .appendChild(xml.createElement("SUBREPORTS"))
039
040      '5. Главный подотчет (без мнемокода)
041      with .appendChild(xml.createElement("SUBREPORT"))
042
043        '6. Список значений
044        with .appendChild(xml.createElement("VALUES"))
045
046          'Создать столько значений, сколько нужно.
047          '7. Значение числового показателя
048          with .appendChild(xml.createElement("VALUE"))
049            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
050            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
051          end with
052
053          '8. Значение строкового показателя
054          with .appendChild(xml.createElement("VALUE"))
055            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
056            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
057          end with
058
059          '9. Значение показателя типа "дата".
060          with .appendChild(xml.createElement("VALUE"))
061            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
062            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
063          end with
064
065        end with
066
067        '10. Таблицы показателей - если редакция содержит таблицы показателей.
068        with .appendChild(xml.createElement("TABLES"))
069
070          '11. Таблица. Повторять столько раз, сколько нужно таблиц.
071          with .appendChild(xml.createElement("TABLE"))
072
073            '12. Наименование таблицы
074            .appendChild(xml.createElement("NAME")).appendChild(xml.createTextNode("Наименование таблицы"))
075
076            '13. Строки таблицы
077            with .appendChild(xml.createElement("ROWS"))
078
079              '14. Строка таблицы
080              with .appendChild(xml.createElement("ROW"))
081
082                '15. Значение строкового показателя
083                with .appendChild(xml.createElement("VALUE"))
084                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
085                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
086                end with
087
088                with .appendChild(xml.createElement("VALUE"))
089                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
090                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
091                end with
092
093              end with
094
095              '16. Строка таблицы
096              with .appendChild(xml.createElement("ROW"))
097
098                '17. Значение строкового показателя
099                with .appendChild(xml.createElement("VALUE"))
100                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
101                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
102                end with
103
104                with .appendChild(xml.createElement("VALUE"))
105                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
106                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
107                end with
108
109              end with
110
111            end with
112
113          end with
114
115        end with
116
117      end with
118
119      '18. Подотчет. Повторять столько раз, сколько нужно подотчетов.
120      with .appendChild(xml.createElement("SUBREPORT"))
121
122        '19. Мнемокод разреза подотчета
123        .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод разреза"))
124
125        '20. Список занчений
126        with .appendChild(xml.createElement("VALUES"))
127
128          'Создать столько значений, сколько нужно.
129          '21. Значение числового показателя
130          with .appendChild(xml.createElement("VALUE"))
131            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
132            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
133          end with
134
135          '22. Значение строкового показателя
136          with .appendChild(xml.createElement("VALUE"))
137            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
138            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
139          end with
140
141          '23. Значение показателя типа "дата".
142          with .appendChild(xml.createElement("VALUE"))
143            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
144            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
145          end with
146
147        end with
148
149        'Создать таблицы, если они нужны.
150
151      end with
152
153    end with
154  end with
155end if

2.2. Загрузка рабочих книг Excel
В дополнение к ранее описанным объектам, скрипт загрузки рабочей книги Excel имеет доступ к следующему:
  • Переменная WorkBook : ExcelWorkBook (только для чтения) содержит объект-рабочую книгу. Через эту переменную вы можете обращаться к любым свойствам и методам объектной модели Microsoft Excel.
Пример
Ниже приведен откомментированный пример скрипта загрузки рабочей книги Excel:
001'Так можно и нужно анализировать ячейки рабочей книги Excel.
002'WorkBook - объект рабочей книги.
003
004'Фактически здесь написано: если на листе "Лист 1" в ячейке D13 содержится значение,
005'отличное от "Форма 160/128q", то это не "наша" рабочая книга, ее не надо обрабатывать.
006
007if WorkBook.WorkSheets("Лист 1").Range("D13").Value <> "Форма 160/128q" then
008  'Текстовый файл не признан "своим".
009  InvalidData = True
010else
011  'Следите за отступами.
012
013  Message("Анализируем файл.") 'Сообщение пользователю в протокол загрузки.
014
015  '1. Создание корневого элемента REPORTS
016  set xml.documentElement = xml.createElement("REPORTS")
017
018  '2. Создание элемента-отчета. Повторять столько раз, сколько нужно отчетов.
019  with xml.documentElement.appendChild(xml.createElement("REPORT"))
020
021    '3. Атрибуты отчета
022
023    .appendChild(xml.createElement("AGENT")).appendChild(xml.createTextNode("Мнемокод контрагента"))
024    .appendChild(xml.createElement("FORM")).appendChild(xml.createTextNode("Мнемокод формы"))
025    .appendChild(xml.createElement("BDATE")).appendChild(xml.createTextNode("Дата в формете YYYY-MM-DD"))
026    .appendChild(xml.createElement("NOTE")).appendChild(xml.createTextNode("Примечание!!!"))
027    .appendChild(xml.createElement("KIND")).appendChild(xml.createTextNode("0")) '0-первичный, 1-сводный
028
029    'Также можно установить дополнительные атрибуты отчета:
030    '.appendChild(xml.createElement("CATALOG")).appendChild(xml.createTextNode("Наименование каталога"))
031    '.appendChild(xml.createElement("CHECKED")).appendChild(xml.createTextNode("1"))
032    '.appendChild(xml.createElement("STATE")).appendChild(xml.createTextNode("2"))
033    '.appendChild(xml.createElement("SENT")).appendChild(xml.createTextNode("1"))
034
035    '4. Список подотчетов
036    with .appendChild(xml.createElement("SUBREPORTS"))
037
038      '5. Главный подотчет (без мнемокода)
039      with .appendChild(xml.createElement("SUBREPORT"))
040
041        '6. Список значений
042        with .appendChild(xml.createElement("VALUES"))
043
044          'Создать столько значений, сколько нужно.
045          '7. Значение числового показателя
046          with .appendChild(xml.createElement("VALUE"))
047            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
048            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
049          end with
050
051          '8. Значение строкового показателя
052          with .appendChild(xml.createElement("VALUE"))
053            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
054            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
055          end with
056
057          '9. Значение показателя типа "дата".
058          with .appendChild(xml.createElement("VALUE"))
059            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
060            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
061          end with
062
063        end with
064
065        '10. Таблицы показателей - если редакция содержит таблицы показателей.
066        with .appendChild(xml.createElement("TABLES"))
067
068          '11. Таблица. Повторять столько раз, сколько нужно таблиц.
069          with .appendChild(xml.createElement("TABLE"))
070
071            '12. Наименование таблицы
072            .appendChild(xml.createElement("NAME")).appendChild(xml.createTextNode("Наименование таблицы"))
073
074            '13. Строки таблицы
075            with .appendChild(xml.createElement("ROWS"))
076
077              '14. Строка таблицы
078              with .appendChild(xml.createElement("ROW"))
079
080                '15. Значение строкового показателя
081                with .appendChild(xml.createElement("VALUE"))
082                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
083                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
084                end with
085
086                with .appendChild(xml.createElement("VALUE"))
087                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
088                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
089                end with
090
091              end with
092
093              '16. Строка таблицы
094              with .appendChild(xml.createElement("ROW"))
095
096                '17. Значение строкового показателя
097                with .appendChild(xml.createElement("VALUE"))
098                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
099                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
100                end with
101
102                with .appendChild(xml.createElement("VALUE"))
103                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
104                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
105                end with
106
107              end with
108
109            end with
110
111          end with
112
113        end with
114
115      end with
116
117      '18. Подотчет. Повторять столько раз, сколько нужно подотчетов.
118      with .appendChild(xml.createElement("SUBREPORT"))
119
120        '19. Мнемокод разреза подотчета
121        .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод разреза"))
122
123        '20. Список занчений
124        with .appendChild(xml.createElement("VALUES"))
125
126          'Создать столько значений, сколько нужно.
127          '21. Значение числового показателя
128          with .appendChild(xml.createElement("VALUE"))
129            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
130            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
131          end with
132
133          '22. Значение строкового показателя
134          with .appendChild(xml.createElement("VALUE"))
135            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
136            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
137          end with
138
139          '23. Значение показателя типа "дата".
140          with .appendChild(xml.createElement("VALUE"))
141            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
142            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
143          end with
144
145        end with
146
147        'Создать таблицы, если они нужны.
148
149      end with
150
151    end with
152  end with
153end if

3. Содержимое сессии
В скриптах и преобразованиях, используемых при загрузке отчетов, вы можете обращаться к следующим значениям, сохраненным в сессии:
Имя Описание
HTTPID Уникальный идентификатор сессии
showReport Значение " on " указывает на то, что протокол загрузки будет показан пользователю, значение " off " - на то, что протокол загрузки не будет показан.
canOverWrite Значение " on " указывает на то, что пользователь разрешил при загрузке обновлять существующие отчеты " off " - обновление существующих отчетов запрещено пользователем.
canSkipValues Значение " on " указывает на то, что пользователь разрешил пропускать значения при отсутствии показателей " off " - пропускать значения при отсутствии показателей запрещено пользователем.
recalcReports Значение " on " указывает на то, что отчеты будут пересчитаны после загрузки, " off " - пересчет отчетов после загрузки пользователем не заказан.
distrByCatalog Значение " on " указывает на то, что пользователем разрешено распределение отчетов по каталогам, " off " - распределение отчетов по каталогам пользователем не заказано.
agent Значение мнемокода контрагента, заданное пользователем при загрузке. Пустая строка указывает на то, что пользователь не выбрал никакого контрагента.
kind Тип загружаемых отчетов. " 0 " - первичные, " 1 " - сводные.