WEB-приложение Сведение отчетности ((раздел целиком))

WEB-приложение Сведение отчетности- Разработка скриптов загрузки (раздел целиком) (29.04.2026) | (одним файлом)

Разработка скриптов загрузки
- Скрипты - загрузчики разрабатываются на языке 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. Ниже будут рассмотрены особенности загрузчиков файлов различных типов, и даны соответствующие примеры.

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. Загрузка рабочих книг 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