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

После установки всех настроек появится запрос на сохранение конфигурации:

Сохранить?

Подтвердите сохранение.

Для запуска сервера нажмите

Запуск

В процессе запуска необходимо зарегистрировать службу Windows, а также может потребоваться внести изменения в сетевые настройки компьютера, чтобы зарегистрировать правило, разрешающее сеFirewall. Перед изменением сетевых настроек конфигуратором будет задан вопрос:

Изменения в сетевые настройки

Отвечайте "Да" при работе в локальном сеансе на выделенном web-сервере. При установке сервиса через терминальный доступ, а также в случае, если на сервере установлено другое работающее в данный момент серверное программное обеспечение (особенно серверы управления базами данных с подключенными к ним пользователями), отвечайте "Нет". В этом случае вам потребуется настроить Firewall (если он используется) вручную. Об успешной установке службы Windows сигнализирует сообщение:

Сервис успешно установлен

После завершения работы инсталлятора необходимо убедиться в наличии службы Windows, а также в том, что она находится в состоянии "Запущен". Для этого в апплете "Службы" (Start --> Control Panel --> Administrative Tools --> Services) найдите службу с именем "DataMill Application Server":

Управление службами

В этом окне с помощью контекстного меню Вы сможете в дальнейшем управлять состоянием службы - останавливать и запускать ее, когда это будет необходимо.

Серверное приложение будет зарегистрировано в качестве службы операционной системы и сервер будет запущен:

Сервис успешно установлен

Главное окно изменит вид:

ГО работа

Кнопка

Останов

Служит для остановки сервиса.

Нажатие ссылки " Активные сессии " открывает список активных в настоящий момент сессий с указанием IP-адреса клиента, имени подключенного пользователя, временем до окончания сессии.

Активные сессии

Для того чтобы новый удаленный клиент мог подключиться к работе, он должен в адресной строке своего браузера набрать адрес сервера (или ip-адрес).

Откроется окно с запросом имени и пароля пользователя:

Логин

После ввода имени и пароля необходимо нажать "Ок" и будет открыта форма работы сервиса.


1. Использование отладочного монитора

Для устранения проблем и локализации ошибок применяется отладочный монитор из состава поставки сервиса:

Отладочный монитор

Отладочный монитор в реальном времени отображает все http и sql-запросы, приходящие через сервис.

Воспользовавшись действием "Сохранить в файл", можно получить почти всю информацию, необходимую разработчику для локализации проблемы, в виде одного файла.

Дополнительно, воспользовавшись действием "Удаленный сервер", можно настроить:

  • пересылку всех получаемых сообщений на удаленный syslog сервер - группа параметров "Параметры подключения к серверу"
  • прием отладочных сообщений по syslog протоколу (в данном случае Отладочный монитор будет выступать syslog сервером) - группа параметров "Параметры локального сервера"

2. Рекомендации по разработке трафаретов

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

1. Неоправданное расширение используемой области (UsedRange)  

При разработке трафарета необходимо отслеживать, чтобы за границами видимой формы (области печати) не было заполненных, не несущих смысловой нагрузки ячеек, а также ячеек с любым нестандартным форматированием. В противном случае, эти ячейки также попадут в область печати и будет распечатана ненужная страница. Также будет потрачено время на их отображение в форме документа.

Пример

Ячейки вне области печати  

2. Использование атрибутов форматирования ячейки

При создании трафарета документа, при выборе способа форматирования ячейки необходимо использовать метод выравнивания данных в ячейке по вертикали "ПО ВЕРХНЕМУ КРАЮ".   Данный метод позволяет существенно сократить время на генерацию формы в режиме он-лайн.

Также включенная функция "ПЕРЕНОСИТЬ ПО СЛОВАМ" существенно замедляет отрисовку форм документов. В связи с этим необходимо ограничить использование данной функции в трафарете для тех ячеек, в которых находится статическая (постоянная) информация.

Пример

Для приведенного ниже трафарета желтым цветом выделены ячейки, для которых функция "ПЕРЕНОС ПО СЛОВАМ" должна быть отключена. Эти ячейки не несут в себе переменной информации.

Голубым выделены ячейки, для которых возможно также не требуется включение функции "ПЕРЕНОС ПО СЛОВАМ", так как для информации, которая будет в них внесена, достаточно места.

Остальные ячейки можно использовать с переносом по словам.

Пример с переносом и выравниванием

Для того чтобы узнать способ форматирования одной или нескольких ячеек, необходимо выделить эту ячейку (или несколько ячеек с зажатой клавишей Ctrl). После этого правой кнопкой мыши вызвать контекстное меню и выбрать действие "Формат ячеек".  Перейти на вкладку "Выравнивание"  и убедиться, что соответствующие пункты заполнены верно: 

Выравнивание в ячейке по верхнему краю

3. Наличие скрытых ячеек

В трафарете не должно быть скрытых столбцов и строк. Их наличие влияет на производительность работы сервиса, а также может влиять на отображение формы документа при распечатке.

Пример

  Скрытые столбцы

В данном примере при создании трафарета были скрыты столбцы А и F. Эти столбцы не несут никакой смысловой нагрузки, однако учитываются при генерации формы документа при работе он-лайн.

Для того чтобы отобразить все скрытые ячейки на листе (если они есть) необходимо выбрать весь диапазон данных (одиночный щелчок левой кнопки мыши на выделенной на рисунке области):

Выделение всего

выделятся все ячейки. После этого в любом месте листа вызвать контекстное меню и выбрать действие "ОТОБРАЗИТЬ".

4. Перекрестные и неверные формулы

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

Рассмотрим следующий пример:

Пример
  Пример с формулами

В ячейке О20 считается значение суммы значений в ячейках O22 и O23, в которых в свою очередь подсчитываются суммы соответственно ячеек L22, M22, N22 для O22 и L23, M23, N23 для O23.

Для увеличения быстродействия рекомендуется в ячейке O20 сразу подсчитать сумму значений L22, M22, N22, L23, M23, N23, не прибегая при этом к дополнительным промежуточным вычислениям.

5. Использование нестандартных шрифтов.

Нежелательно использование в трафарете шрифтов, не включенных в стандартную поставку Microsoft Excel, так как это значительно замедляет процесс отображения форм документов.


3. Поддерживаемые функции Microsoft Excel

Разработчики заявляют о поддержке следующего набора функций:
Русское локальное имя Международное имя
ABS ABS
ACOS ACOS
ACOSH ACOSH
АДРЕС ADDRESS
И AND
ASC ASC
ASIN ASIN
ASINH ASINH
ATAN ATAN
ATAN2 ATAN2
ATANH ATANH
СРЗНАЧ AVERAGE
СРЗНАЧА AVERAGEA
ОКРВВЕРХ CEILING
СИМВОЛ CHAR
ВЫБОР CHOOSE
ПЕЧСИМВ CLEAN
КОДСИМВ CODE
СТОЛБЕЦ COLUMN
СЦЕПИТЬ CONCATENATE
COS COS
COSH COSH
СЧЁТ COUNT
СЧЁТЗ COUNTA
СЧИТАТЬПУСТОТЫ COUNTBLANK
ДАТА DATE
ДАТАЗНАЧ DATEVALUE
ДЕНЬ DAY
ДНЕЙ360 DAYS360
ГРАДУСЫ DEGREES
РУБЛЬ DOLLAR
ЧЁТН EVEN
СОВПАД EXACT
EXP EXP
ЛОЖЬ FALSE
НАЙТИ FIND
ФИКСИРОВАННЫЙ FIXED
ОКРВНИЗ FLOOR
ГПР HLOOKUP
ЧАС HOUR
ЕСЛИ IF
ДВССЫЛ INDIRECT
ИНФОРМ INFO
ЦЕЛОЕ INT
ЕПУСТО ISBLANK
ЕОШ ISERR
ЕОШИБКА ISERROR
ЕЛОГИЧ ISLOGICAL
ЕНД ISNA
ЕНЕТЕКСТ ISNONTEXT
ЕЧИСЛО ISNUMBER
ЕССЫЛКА ISREF
ЕТЕКСТ ISTEXT
ЛЕВСИМВ LEFT
ДЛСТР LEN
LN LN
LOG LOG
LOG10 LOG10
ПРОСМОТР LOOKUP
СТРОЧН LOWER
ПОИСКПОЗ MATCH
МАКС MAX
МАКСА MAXA
ПСТР MID
МИН MIN
МИНА MINA
МИНУТЫ MINUTE
ОСТАТ MOD
МЕСЯЦ MONTH
Ч N
НД NA
НЕ NOT
ТДАТА NOW
НЕЧЁТ ODD
ИЛИ OR
ПИ PI
СТЕПЕНЬ POWER
ПРОИЗВЕД PRODUCT
ПРОПНАЧ PROPER
РАДИАНЫ RADIANS
СЛЧИС RAND
РАНГ RANK
РАНГ.СР RANK.AVG
РАНГ.РВ RANK.EQ
ПОВТОР REPT
ПРАВСИМВ RIGHT
ОКРУГЛ ROUND
ОКРУГЛВНИЗ ROUNDDOWN
ОКРУГЛВВЕРХ ROUNDUP
СТРОКА ROW
ПОИСК SEARCH
СЕКУНДЫ SECOND
ЗНАК SIGN
SIN SIN
SINH SINH
КОРЕНЬ SQRT
ПОДСТАВИТЬ SUBSTITUTE
СУММ SUM
Т T
TAN TAN
TANH TANH
ТЕКСТ TEXT
ВРЕМЯ TIME
ВРЕМЗНАЧ TIMEVALUE
СЕГОДНЯ TODAY
СЖПРОБЕЛЫ TRIM
ИСТИНА TRUE
ОТБР TRUNC
ПРОПИСН UPPER
ЗНАЧЕН VALUE
ВПР VLOOKUP
ДЕНЬНЕД WEEKDAY
ГОД YEAR

Следующие функции распознаются, но их вычисление не поддерживается:
Русское локальное имя Международное имя
FРАСП FDIST
FРАСПОБР FINV
ZТЕСТ ZTEST
АСЧ SYD
АПЛ SLN
БЕТАОБР BETAINV
БЕТАРАСП BETADIST
БС FV
БИНОМРАСП BINOMDIST
ВЕЙБУЛЛ WEIBULL
ВЕРОЯТНОСТЬ PROB
ВСД IRR
ГАММАНЛОГ GAMMALN
ГАММАОБР GAMMAINV
ГАММАРАСП GAMMADIST
ГИПЕРГЕОМЕТ HYPGEOMDIST
ГИПЕРССЫЛКА HYPERLINK
ДДОБ DDB
ДИСП VAR
ДИСПА VARA
ДИСПР VARP
ДИСПРА VARPA
ФУО DB
ДОВЕРИТ CONFIDENCE
ИНДЕКС INDEX
КВАДРОТКЛ DEVSQ
КВАРТИЛЬ QUARTILE
КВПИРСОН RSQ
КОВАР COVAR
КОРРЕЛ CORREL
КПЕР NPER
КРИТБИНОМ CRITBINOM
ЛГРФПРИБЛ LOGEST
ЛИНЕЙН LINEST
ЛОГНОРМОБР LOGINV
ЛОГНОРМРАСП LOGNORMDIST
МВСД MIRR
МЕДИАНА MEDIAN
МОБР MINVERSE
МОДА MODE
МОПРЕД MDETERM
МУМНОЖ MMULT
НАИБОЛЬШИЙ LARGE
НАИМЕНЬШИЙ SMALL
НАКЛОН SLOPE
CTABKA RATE
НОРМАЛИЗАЦИЯ STANDARDIZE
НОРМОБР NORMINV
НОРМРАСП NORMDIST
НОРМСТОБР NORMSINV
НОРМСТРАСП NORMSDIST
ЧПС NPV
ОБЛАСТИ AREAS
ОСПЛТ PPMT
ОТРБИНОМРАСП NEGBINOMDIST
ОТРЕЗОК INTERCEPT
ПУО VDB
ПЕРЕСТ PERMUT
ПЕРСЕНТИЛЬ PERCENTILE
ПС PV
ПИРСОН PEARSON
ПРПЛТ IPMT
ПЛТ PMT
ПРЕДСКАЗ FORECAST
ПРОЦЕНТРАНГ PERCENTRANK
ПУАССОН POISSON
РИМСКОЕ ROMAN
РОСТ GROWTH
СКОС SKEW
СМЕЩ OFFSET
СРГАРМ HARMEAN
СРГЕОМ GEOMEAN
СРОТКЛ AVEDEV
СТАНДОТКЛОН STDEV
СТАНДОТКЛОНА STDEVA
СТАНДОТКЛОНП STDEVP
СТАНДОТКЛОНПА STDEVPA
СТОШYX STEYX
СТЬЮДРАСП TDIST
СТЬЮДРАСПОБР TINV
СУММЕСЛИ SUMIF
СУММКВ SUMSQ
СУММКВРАЗН SUMXMY2
СУММПРОИЗВ SUMPRODUCT
СУММРАЗНКВ SUMX2MY2
СУММСУММКВ SUMX2PY2
СЧЁТЕСЛИ COUNTIF
ТЕНДЕНЦИЯ TREND
ТИП TYPE
ТРАНСП TRANSPOSE
ТТЕСТ TTEST
УРЕЗСРЕДНЕЕ TRIMMEAN
ФАКТР FACT
ФИШЕР FISHER
ФИШЕРОБР FISHERINV
ФТЕСТ FTEST
ХИ2ОБР CHIINV
ХИ2РАСП CHIDIST
ХИ2ТЕСТ CHITEST
ЧАСТОТА FREQUENCY
ЧИСЛКОМБ COMBIN
ЧИСЛСТОЛБ COLUMNS
ЧСТРОК ROWS
ЭКСПРАСП EXPONDIST
ЭКСЦЕСС KURT
ЯЧЕЙКА CELL


4. Загрузка отчетов
Сервис реализует возможность загрузки отчетов из внешних файлов различных типов. Тип файла определяется его содержимым. Поддерживаются следующие типы файлов:
  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.

4.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-преобразованиях.

4.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.

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


4.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
  

4.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
  

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

5. Использование электронной подписи

Поддержка электронной подписи реализована с использованием КриптоПро ЭЦП Browser plug-in .

В Chromе (и других браузерах на основе Chromium) начиная с версии 45, и Firefox начиная с версии 53, отключена возможность использования NPAPI плагинов. Для продолжения поддержки электронной подписи в этих браузерах, КриптоПро выпустил обновленную версию своего плагина (2.0). Начиная с этой версии, для указанных браузеров, добавлен новый механизм взаимодействия с криптопровайдерами через расширение браузера CryptoPro Exension for CAdES Browser Plug-in.

С нашей стороны реализована полная поддержка новой версии КриптоПро ЭЦП Browser plug-in, и в частности подержка нового механизма взаимодействия с браузерами на основе Chromium (Opera, Яндекс.Браузер и др.), Firefox и Edge у которых отсутствует поддержка NPAPI плагинов. Наряду с этим сохранилась возможность использования существовавших ранее способов взаимодействия браузеров с криптопровайдерами.

Особенности и необходимые условия использования электронной подписи в различных браузерах:

При установке новой версии CryptoPro Browser plug-in 2.0:

  • плагин NPAPI по прежнему устанавливается во все поддерживаемые браузеры, использующие эту технологию
  • плагин ActiveX по прежнему устанавливается во все поддерживаемые браузеры Internet Exporer (до 11 версии включительно)
  • в браузере Firefox, начиная с версии 53 включительно - расширение автоматически не устанавливается. Необходимо вручную установить это расширение, предварительно скачав его с сайта КриптоПро. На данный момент расширение пока еше недоступно в магазине расширений Firefox.
  • в браузерах на основе Chromium:
    • в Chrome - расширение автоматически устанавливается. То есть нет необходимости вручную устанавливать это расширение через магазин расширений.
    • в Яндекс.Браузер - расширение автоматически устанавливается. Если оно автоматически не установилось, то его можно установить вручную напрямую из магазина Google.
    • в Edge - расширение автоматически устанавливается. Если оно автоматически не установилось, то его можно установить вручную напрямую из магазина Google.
    • в Opera - расширение автоматически не устанавливается. Необходимо вручную установить это расширение из магазина Opera (расширения из магазина Google, напрямую, не поддерживаются браузером).
      В случае если с установкой из магазина Opera возникнут проблемы, то можно воспользоваться "обходным" путем:
      1. сначала установить расширение из магазина Opera, позволяющее устанавливать расширения из магазина Google
      2. затем установить изначально требуемое расширение из магазина Google
    • в других браузерах на основе Chromium, предлагается действовать по аналогии.
  • в браузере Edge до 75 версии (не на основе Chromium), начиная с версии 38 (Windows 10 Anniversary Update) - расширение автоматически не устанавливается. На данный момент расширение пока еше недоступно в магазине Microsoft Store. Необходимо вручную установить это расширение, предварительно скачав его с сайта КриптоПро.
    Краткая инструкция по ручной установке расширения Edge:
    1. скачать установочный файл  расширения с сайта КриптоПро
    2. скачать корневой сертификат CryptoPro , которым подписано это расширение, и установить его в хранилище локального компьютера в раздел “Доверенные корневые центры сертификации”
    3. разрешить устанавливать приложения от сторонних разработчиков в ОС Windows 10 - Настройки системы -> Обновление и безопасность -> Для разработчиков -> Режим разработчика
    4. установить ранее скаченное расширение, запустив его установочный файл
    5. перезапустить браузер
    6. каждый раз при использовании функционала подписи убедиться, что расширение включено - Настройки -> Расширения

Варианты взаимодействия браузеров с криптопровайдерами :

  • в Chromе начиная с 45 версии, поддержка NPAPI плагинов полностью отключена - взаимодействие возможно только с помощью расширения.
  • в Яндекс.Браузер, поддержка NPAPI плагинов полностью отключена - взаимодействие возможно только с помощью расширения.
  • в Opera поддержка NPAPI плагинов пока не отключена (отключение планируется) - взаимодействие возможно как с помощью NPAPI плагинов, так и с помощью расширения.
  • в Firefox, начиная с 53 версии включительно, поддержка NPAPI плагинов полностью отключена - взаимодействие возможно только с помощью расширения.
  • в Firefox ESR 52, основанный на 52 версии Firefox, поддержка NPAPI плагинов не отключена - взаимодействие возможно как с помощью NPAPI плагинов, так и с помощью расширения. В более поздних версиях Firefox ESR, поддержка NPAPI плагинов полностью отключена.
  • в Edge поддержка NPAPI плагинов не реализована - взаимодействие возможно только с помощью расширения.

Приоритеты взаимодействия браузеров на основе Chromium с криптопровайдерами

Т.к. метод взаимодействия с помощью NPAPI считается устаревшим, то сначала производится попытка использовать расширение брузера. В случае, когда это не удалось - будет использоваться плагин NPAPI.

Важно!
Вниманию пользователей браузеров на основе Chromium.
Для стабильной работы расширения браузера рекомендуется обновить браузер до последней версии (104+)


6. Использование различных методов подключения сервера к сети

6.1. Использование NAT

Механизм NAT описан в rfc1631 и в rfc3022 .

Работа через NAT полностью поддерживается, и не должна вызывать каких-либо затруднений. Рассмотрим пример.
NAT

Допустим, на сервере, обозначенном как "наш сервер", установлен наш сервис. "Наш сервер" слушает IP-адрес внутренней сети 192.168.4.110, порт 8090. В таком случае он доступен пользователям во внутренней сети через url http://192.168.4.110:8090. NAT-сервер, имеющий внешний IP 212.158.161.21, устанавливает соответствие своего порта 8099 и порта 8090 локального хоста 192.168.4.110. На рисунке показано это правило для одного из "бытовых" роутеров (нас интересует последнее правило в списке):
NAT на роутере
Благодаря этому, сервис доступен "снаружи" через url http://212.158.161.21:8099.

При настройке удаленного доступа приложений Win32 к этому серверу, вам необходимо указать в поле " Хост сервера " строку " 212.158.161.21:8099 " (без кавычек), поле "Путь серверного proxy" оставить пустым. Во всех случаях номера стандартных портов можно не указывать, а IP-адреса заменить соответствующими им доменными именами.

При использовании механизма "Restricted NAT", "Наш сервер" будет лишен возможности получить реальные IP-адреса удаленных пользователей, все запросы он будет видеть приходящими с одного и того же адреса. Если вы используете Restricted NAT, то вы

  • лишаетесь возможности протоколировать IP-адреса
  • в поле "Способ идентификации сессии" на странице " Параметры сетевых настроек " не сможете использовать способы, опирающиеся на IP-адрес (фактически, вам доступен только способ "Использовать идентификатор"). Это приведет к невозможности работы с сервисом пользователей, не имеющих соединения с постоянным IP-адресом.

6.2. Использование серверного proxy

Допустим, мы имеем следующую схему подключения:
Proxy

Допустим, на сервере, обозначенном как "наш сервер", установлен наш сервис. "Наш сервер" слушает IP-адрес внутренней сети 192.168.4.110, порт 8090. В таком случае он доступен пользователям во внутренней сети через url http://192.168.4.110:8090. На сервере, обозначенном как "Proxy-сервер", установлен web-сервер apache, конфигурационный файл которого содержит, помимо прочего, следующие строки:

01  Listen 8099
02  ...
03  LoadModule proxy_module modules/mod_proxy.so
04  ...
05  ProxyPass /mysite/mysite1/mysite2/ http://192.168.4.110:8090/
06  ...
07  <Proxy /mysite/mysite1/mysite2/*>
08    Order allow,deny
09    Allow from all
10    ...
11  </Proxy>
12  ....
Proxy-сервер имеет внешний IP 212.158.161.21. То есть, все обращения, поступающие на proxy-сервер на url вида http://212.158.161.21:8099/mysite/mysite1/mysite2/.... будут перенаправлены им на наш сервер, а ответ нашего сервера будет возвращен удаленному клиенту (в этом смысл работы механизма proxy). Благодаря этому, сервис доступен "снаружи" через url http://212.158.161.21:8099/mysite/mysite1/mysite2/parusjs/index.html (вам придется указывать полный путь именно в таком виде, иначе мы не сможем разрешить относительные ссылки на страницах).

При настройке удаленного доступа приложений Win32 к этому серверу, вам необходимо указать в поле " Хост сервера " строку " 212.158.161.21:8099 " (без кавычек), в поле " Путь серверного proxy " указать строку " /mysite/mysite1/mysite2 " (без кавычек). Во всех случаях номера стандартных портов можно не указывать, а IP-адреса заменить соответствующими им доменными именами.

При использовании серверного proxy "Наш сервер" будет лишен возможности получить реальные IP-адреса удаленных пользователей, все запросы он будет видеть приходящими с одного и того же адреса. Если вы используете серверный proxy, то вы

  • лишаетесь возможности протоколировать IP-адреса (протоколирование должно быть возложено на proxy-сервер)
  • в поле "Способ идентификации сессии" на странице " Параметры сетевых настроек " не сможете использовать способы, опирающиеся на IP-адрес (фактически, вам доступен только способ "Использовать идентификатор"). Это приведет к невозможности работы с сервисом пользователей, не имеющих соединения с постоянным IP-адресом.

6.2.1. Поддержка соединения для запросов выполняющихся длительное время (более 1-2 мин)

При работе тонкого клиента напрямую с сервером приложений, подобной проблемы не возникает, т.к. тонкий клиент и сервер приложений самостоятельно поддерживают длительные запросы к СУБД, без стороннего воздействия.

При работе тонкого клиента через серверный прокси, запросы, выполняющиеся на сервере СУБД, продолжительное время (более 1-2 мин), могут быть расценены клиентом как запросы, на которые не поступил ответ. В результате, взаимодействие с сервером прекращается, и клиент получает ошибку Cannot initiate intercommunication with remote server. Please, check provided address information.

Для решения данной проблемы, необходимо помочь серверу приложений определить, что он работает через серверный прокси (reverse proxy).

Для этого необходимо настроить 2 момента:

  1.  Запросы клиентов, перенаправляемые серверным прокси, на сервер приложений, должны содержать какой-то из следующих заголовков:
    • X-Original-URL
    • X-Forwarded-For
    • X-Real-IP
    Значение этих заголовков не имеет значения, важно просто наличие одного из них.
    Пример
    В nginx, в качестве одного из вариантов, можно указать в его конфиге - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  2. Таймауты серверного прокси для ожидания ответа от сервера приложений, должны быть достаточно большими, чтобы длительный запрос успел выполниться в СУБД.
    Пример
    В nginx, в его конфиге нужно указать - proxy_read_timeout 300s; #вместо 300 сек укажите свое значение, по умолчанию nginx использует 1 мин.

7. Взаимодействие с внешними веб-сервисами

Сервис предоставляет возможность реализации взаимодействия с внешними веб-сервисами. Функционал основан на механизме пользовательских приложений.

Пример подобной реализации представлен в поставляемом пользовательском приложении "WebServicesIntegrationCROC" в виде VBScript.

Перед началом использования данного примера, необходимо задать/исправить значения следующих параметров (Файл -> Сервис -> Параметры, раздел "Первичные/сводные отчеты"):

  • URL взаимодействия с внешним веб-сервисом: КРОК
  • Каталог для сохранения присоединенных документов при взаимодействии с внешним веб-сервисом: КРОК. По умолчанию установлено "Присоединенные документы".
  • Тип присоединенных документов при взаимодействии с внешним веб-сервисом: КРОК. При отсутствии значения (по умолчанию) тип присоединяемого документа будет определяться по расширению файла (на момент взаимодействия, соответствующие типы  уже должны существовать в системе). При заданном значении параметра - все файлы, присоединяемые в процессе взаимодействия, будут добавляться с использованием указанного типа.

В данном примере, реализована NTML аутентификация для взаимодействия с внешним веб-сервисом (т.е. по пользователям входящим в домен).

В штатной поставке данного пользовательского приложения, для аутентификации передаются реквизиты пользователя, из под которого работает сервер приложений. Но т.к. штатным режимом работы сервера приложений является работа в виде сервиса Windows (а по умолчанию, все сервисы работают под локальной учетной записью "NT AUTHORITY\SYSTEM", т.е. не являются членами домена), то для успешной аутентификации необходимо выбрать 1 из следующих вариантов:

  1. Изменить учетную запись, под которой работает сервис, на учетную запись пользователя домена (Сервисы -> "DataMill Application Server" -> Свойства -> Вкладка "Вход" -> Группа "Использовать для входа"). Этот вариант является более предпочтительным.
  2. Задать логин/пароль требуемого доменного пользователя (от имени которого будет проходить аутентификация) в константах VBScript пользовательского приложения: CLogin (формат - Домен\Пользователь) и CPassword.

7.1. Модуль для взаимодействия по протоколу http(s)

Модуль для взаимодействия по протоколам http(s) представлен в поставляемом пользовательском приложении "ParusAppServerProvider", в виде COM-сервера.

В вышеуказанном модуле реализован COM-объект с ProgID ParusAppServerProvider.Provider, реализующий следующий интерфейс:

01  IProvider = interface(IDispatch)
02    ['{5CC36760-E292-44AA-B542-A32865828DAC}']
03    function CreateTempFileName(const Extension: WideString): WideString; safecall;
04    function CreateBinaryData: IDispatch; safecall;
05    function DownloadData(const Host: WideString; const Url: WideString;
06      const UserName: WideString; const Password: WideString; NegotiateAuth: WordBool;
07      PostData: OleVariant; const PostContentType: WideString; PostDataIsBinary: WordBool;
08      CanCache: WordBool; NewSession: WordBool; TimeOut: Integer): IDispatch; safecall;
09    function JSONEscape(const Value: WideString): WideString; safecall;
10    function JSONUnEscape(const Value: WideString): WideString; safecall;
11  end;
  • Функция CreateTempFileName возвращает сгенерированное системой имя временного файла с расширением, переданным в параметре Extension.
  • Функция CreateBinaryData создает пустой объект, реализующий интерфейс IBinaryData (описан ниже).
  • Функция DownloadData осуществляет обращение к указанному ресурсу по протоколу http (https), и возвращает ответ сервера в виде объекта, реализующего интерфейс IBinaryData.
    • Параметр Host определяет http-сервер, параметр Url - Url, к которому будет происходить обращение.
    • Параметры UserName и Password определяют имя пользователя и пароль, если http-сервер требует авторизовать пользователя. Параметр NegotiateAuth устанавливает режим аутентификации. (Basic или Negotiate (NTLM)).
    • Параметры PostData, PostContentType и PostDataIsBinary определяют содержимое тела POST-запроса (если не определено, функция отправит GET-запрос). Источник может быть
      • Объектом, реализующим интерфейс IStream
      • Объектом, реализующим интерфейс ISequentialStream
      • Строкой
    • Параметр CanCache позволяет использовать локальный кеш http-ответов.
    • Параметр NewSession требует принудительного создания новой сессии при вызове функции.
    • Параметр TimeOut определяет максимальное время ожидания ответа в секундах.
  • Функция JSONEscape возвращает строку в формате JSON, полученую путем конвертации переданной строки в формат JSON.
  • Функция JSONUnEscape возвращает строку, полученную путем расконвертации переданной JSON строки.

Интерфейс IBinaryData представляет набор двоичных данных:

01  IBinaryData = interface(IDispatch)
02    ['{8A9F7CB3-230A-4048-B938-852CBF6ADB2D}']
03    procedure Append(const Src: OleVariant);
04    procedure Load(const Src: OleVariant);
05    procedure Save(const Dst: OleVariant);
06    function Size: Cardinal;
07    procedure AppendData(Data: Pointer; DataSize: Cardinal);
08    procedure SetData(Data: Pointer; DataSize: Cardinal);
09    procedure GetData(Data: Pointer);
10    function ToString(Encoding: WideString): WideString;
11    procedure FromString(Data: OleVariant);
12    procedure AppendString(Data: OleVariant);
13    function ToBase64: WideString;
14    procedure FromBase64(Data: OleVariant);
15  end;
  • Процедура Load загружает двоичные данные из переданного источника. Источник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Процедура Append добавляет двоичные данные из переданного источника. Источник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Процедура Save сохраняет двоичные данные в переданный приемник. Приемник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Функция ToString переводит данные в строку. Байты, содержашиеся в объекте, будут рассматриваться как содержащие строку в кодировке, заданной параметром Encoding. По умолчанию используется кодировка UTF-8
  • Процедура FromString загружает данные из строки, переданной в параметре Data, перекодировав ее в кодировку UTF-8
  • Процедура AppendString  добавляет данные из строки, переданной в параметре Data, перекодировав ее в кодировку UTF-8
  • Функция ToBase64 возвращает строку, полученную путем кодирования в формат Base64, данных содержащихся в объекте
  • Процедура FromBase64 загружает данные из строки, переданной в параметре Data, раскодировав ее из формата Base64

8. Сохранение сформированных отчетов в базе данных

Сервис предоставляет возможность сохранения в базу данных любых выгружаемых отчетов/подотчетов, в том формате в который они могут быть сконвертированы (xls, xlsx, pdf или html).

Данная возможность реализуется, путем указания той или иной пользовательской процедуры, в параметре "Пользовательская процедура сохранения выгруженных отчетов в БД". Установить настройку можно в интерфейсе Парус 8 (Файл -> Сервис -> Параметры -> Каталог "Первичные/сводные отчеты").

Если в указанном параметре, задано значение, то в веб интерфейсе, пользователю будет доступна опция "Сохранить полученный отчет в БД". При выборе этой опции, после формирование отчета, он не будет передан на скачивание пользователю, а будет вызвана указанная процедура, с передачей в нее сформированного отчета(ов), и другой сопутствующей информацией.

В пользовательские процедуры, для сохранения отчетов, будут переданы следующие значения (в параметры с соответствующими именами):

  • SUNITCODE - Раздел из которого было вызвано формирование отчета/подотчета
  • NCOMPANY - RN текущей организация пользователя
  • NREPORT - RN вызванного отчета
  • NSUBREPORT - RN вызванного или сформированного подотчета
  • NTEMPLATE - Используемый трафарет
  • SFILENAME - Имя сформированного файла (аналогичное тому, что формируется при скачивании сформированных отчетов)
  • SFILEEXTENSION - Расширение сформированного файла отчета (xls, xlsx, pdf, html)
  • BFILEDATA - Содержимое сформированного файла отчета

Пример подобной реализации представлен в поставляемой пользователькой процедуре "SaveExecutedReport", в виде неименованного блока, который сохраняет переданные ей отчеты в Присоединенных документах отчета, который был вызван на формирование.

Перед началом использования данного примера, необходимо задать/исправить значения следующих параметров (Файл -> Сервис -> Параметры, раздел "Первичные/сводные отчеты"):

  • Каталог для сохранения выгруженных отчетов в БД. По умолчанию, установлен корневой каталог - "Присоединенные документы".
  • Тип присоединенных документов при сохранении выгруженных отчетов в БД. При отсутствии значения (по умолчанию) тип присоединяемого документа будет определяться по расширению файла (на момент взаимодействия, соответствующие типы  уже должны существовать в системе). При заданном значении параметра - все файлы, переданные в эту пользовательскую процедуру, будут добавляться с использованием указанного типа.

9. Интеграция с Парус-Онлайн Web 2.0

Интеграция и совместная работа сервиса Сведение отчетности Онлайн и Парус-Онлайн Web 2.0, предлагает пользователю возможность одновременного взаимодействия с обоими сервисами и над одними и теми же данными (предполагается, что сервисы работают с одной и той же БД и схемой), в одном окне браузера, через веб-приложение - Парус-Онлайн Web 2.0.

Описание и архитектура интеграции.

Оба сервиса могут, и по идее, должны, работать на разных хостах и иметь разные, но общедоступные доступные доменые имена, т.е. оба адреса должны быть доступны для пользователя. Однако, при этом, для обеспечения совместной работы над одними и теми же данными, оба сервиса должны использовать одну и ту же БД и схему в ней.

Аутентификация пользователей осуществляется единожды, при их входе в Парус-Онлайн Web 2.0, в приложение "Сведение отчетности. Центр учета". А при взаимодействии пользователя с сервисом Сведение отчетности Онлайн, лицензионные сеансы пользователей будут переиспользованы, без необходимости повторной аутентификации.

Важно!
Для корректного переиспользования лицензионных сеансов веб-пользователей, требуется, чтобы оба сервиса (Парус-Онлайн Web 2.0 и Сведение отчетности Онлайн) использовали один и тот же логин анонимного пользователя для работы с БД.

Воспользоваться функционалом сервиса Сведения отчетности Онлайн в веб приложении Парус-Онлайн Web 2.0, пользователь может через пункты меню:

  • Учет -> Сведения отчетности Онлайн - Первичные отчеты
  • Учет -> Сведения отчетности Онлайн - Сводные отчеты
  • Учет -> Сведения отчетности Онлайн - Протоколы сравнения отчетов

Настройка интеграции.

В Сведение отчетности Онлайн.

Для включения режима интеграции установите соответствующую галку в конфигураторе и укажите публично доступное доменное имя (или URL) текущего сервиса "Сведения отчетности Онлайн", которое назначено (или будет назначено) для сервиса Сведение отчетности Онлайн.

Важно!

Т.к. оба сервиса, Сведения отчетности Онлайн и Парус-Онлайн Web 2.0, работают на разных доменах, то для браузера они являются независимыми, и их взаимодействие осуществляется по правилам защиты от атаки CSRF (межсайтовая подделка запроса). В рамках этой защиты, браузеры требуют использование HTTPS протокола, как минимум для сайта, с которым осуществляется взаимодействие из хостового сайта, т.е. в нашем случае это текущий сервис Сведения отчетности Онлайн.

В связи с этим, включение режима интеграции с Парус-Онлайн Web, предполагает конфигурирование и работу текущего сервиса с HTTPS протоколом.

Кстати
Впоследствии, указанное значение домена (URL) также можно задать или изменить в Парус в разделе Параметры - узел "Первичные/сводные отчеты", параметр BalanceOnlineIntegrateURL: "Интеграция "Сведение отчетности Онлайн" и "Парус Онлайн": URL сервиса "Сведение отчетности Онлайн"". 

В Парус-Онлайн Web 2.0.

В состав инсталлятора Сведения отчетности Онлайн входит архив ParusWebBalanceExtension.zip, являющийся расширением для Парус-Онлайн Web 2.0.
Для подключения расширения необходимо:

  1. Распаковать содержимое архива расширения в каталог для расширений Парус-Онлайн Web 2.0 (по умолчанию, это каталог - C:\Program Files (x86)\Parus8\WebClient\WebClient\Modules).
    В итоге, должны иметься файлы, на примере каталога по умолчанию (C:\Program Files (x86)\Parus8\WebClient\WebClient\): 
    • \Modules\BalanceMainMenuHandler\BalanceMainMenuHandler.dll
    • \Modules\BalanceMainMenuHandler\scripts\tab_listener.js 
  2. Включить механизм расширений и само новое расширение. Для этого в файле конфигурации расширений "C:\Program Files (x86)\Parus8\WebClient\WebClient\Config\extensions.config" нужно указать:
    • аттрибут
      enabled="true"
              
    • убедиться, что аттрибут rootPath указывает на каталог расширений, в который было распаковано описываемое расширение для интеграции Сведения отчетности Онлайн
       rootPath="C:\Program Files (x86)\Parus8\WebClient\WebClient\Modules\"
              
    • добавить узел extensions узел описания текущего расширения:
       <extension assembly="BalanceMainMenuHandler" path="BalanceMainMenuHandler\BalanceMainMenuHandler.dll"/>
              
  3. Убедиться, что пользователь Windows, из под которого работает сервис IIS, имеет доступ на чтение к каталогу \Modules\BalanceMainMenuHandler и \Modules\BalanceMainMenuHandler\scripts, в частности
  4. Запустить или перезапустить IIS

Важно!

Если каталог расширений Modules, перенесен из корневого каталога веб-приложения WebClient, в иное место (изменен аттрибут rootPath), то распакуйте и настройте расширение в соответствии с этим местом.

Однако, необходимо сохранить каталог \Modules\BalanceMainMenuHandler\scripts\ со всем его содержимым на "старом" месте \Modules\BalanceMainMenuHandler\scripts\, в виду того, что этот путь зафиксирован в расширении и нет иного механизма для указания относительности.

Более подробно процесс подключения и настройки расширений в Парус-Онлайн Web 2.0 описан в его документации.

10. Использование SSL сертификатов c ГОСТ алгоритмами

На текущий момент существует 2 варианта реализации ГОСТ алгоритмов, которые может использовать OpenSSL, и как следствие, использоваться текущим сервисом:


10.1. gost.dll - open source библиотека

Вариант 1: gost.dll - open source библиотека, которая раньше поставлялась вместе с OpenSSL, но начиная с версии OpenSSL 1.1, она была исключена из его состава, и оформилась в виде отдельного продукта https://github.com/gost-engine/engine .

Поддержка алгоритмов ГОСТ 2001 имеется во всех версиях библиотеки gost.dll. Однако поддержка алгоритмов ГОСТ 2012 реализована только в версиях, совместимых с OpenSSL >= 1.1.0.

Библиотека gost.dll должна использоваться только с соответствующей ей версией OpenSSL:

  • для OpenSSL < 1.1.0: берется из поставки самого OpenSSL, НЕподдерживает ГОСТ 2012
  • для OpenSSL >= 1.1.0, но < 3.0: собирается самостоятельно из исходников (https://github.com/gost-engine/engine, необходимо выбрать релиз соответсвующий используемой версии OpenSSL),  поддерживает ГОСТ 2012
  • для OpenSSL >= 3.0: также собирается самостоятельно из исходников (https://github.com/gost-engine/engine, необходимо выбрать релиз соответсвующий используемой версии OpenSSL),  поддерживает ГОСТ 2012

В релизах сервиса до сентября 2020 включительно, использовались библиотеки OpenSSL 1.0.2. Поэтому возможно использовать библиотеку gost.dll из самого инталлятора OpenSSL, либо можно скачать соответствующую библиотеку с нашего сайта:

В релизах сервиса до января 2024 включительно, поставлялись библиотеки OpenSSL версии 1.1.1. Соответствующая этой версии библиотека gost.dll может быть собрана самостоятельно из исходников. Либо воспользоваться собранной нами версией для Windows:

В релизах текущей версии сервиса, поставляются библиотеки OpenSSL версии 3.3.0. Соответствующая этой версии библиотека для ГОСТ алгоритмов может быть собрана самостоятельно из исходников. Либо можно воспользоваться собранной нами версией для Windows:

Во всех релизах текущего сервиса для Linux, библиотеки OpenSSL не поставляются в составе продукта, их необходимо самостоятельно собрать локально по месту использования, либо установить с помощью менеджера пакетов Linux. При работе конфигуратор подскажет как это сделать.

Также, для Linux потребуется самостоятельная сборка библиотеки для ГОСТ, для этого можно воспользоваться исходной инструкцией - https://github.com/gost-engine/engine/blob/master/INSTALL.md.

Важно!

Необходимо использовать библиотеку соответствующую разрядности используемого приложения, которое будет использовать данную библиотеку. Например, если настраивается серверная сторона Сервиса, то выбирается в соответствии с его разрядностью, если настраивается клиентская сторона (приложение для удаленного доступа), то в соответствии с его разрядностью (на текущий момент только Win32).

Развертывание :

  1. Расположить библиотеку gost.dll, а в случае с OpenSSL 3.0, еще и gostprov.dll, нужной разрядности в каталог установки текущего сервиса, рядом с исполняемыми файлами, которые будут ее использовать. В случае использования Win64 разрядности сервиса - это подкаталог WIN64.
  2. Создать файл конфигурации OpenSSL (в случае с OpenSSL 3.0, последнюю строчку с CRYPT_PARAMS=... рекомендуется опустить и не указывать), например openssl.conf:

    01openssl_conf = openssl_def
    02
    03[openssl_def]
    04engines = engine_section
    05
    06[engine_section]
    07gost = gost_section
    08
    09[gost_section]
    10engine_id = gost
    11dynamic_path = ./gost.dll
    12default_algorithms = ALL
    13CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
        

    В указанном примере файла конфигурации предполагается, что библиотеки поддержки алгоритмов ГОСТ находятся рядом с исполняемыми файлами. Но файл конфигурации может быть расположен в ином месте. В таком случае необходимо указать полный, а не относительный путь к библиотеке gost.dll. Кстати, в качестве разделителя каталогов пути необходимо использовать прямой слэш "/" как в Unix, а не обратный, как в Windows, либо экранировать обратные слэши еще одним обратным слэшем - "\\".

    В случае использования существующего файла конфигурации, например при использовании полноценно установленного OpenSSL (а не используемого из состава поставки) в составе которого имеется свой файл конфигурации, необходимо 1-ю строчку (openssl_conf = openssl_def) вставить в начало этого файла, а остальные строки в самый конец файла.

    Указанный файл конфигурации является примером, и может быть изменен пользователем в зависимости от требуемых настроек.

    Кстати

    Подобным образом возможно подключить любые другие расширения (engine) для OpenSSL.

    Например, в случае если приватный ключ сертификата хранится на аппаратном носителе (USB токен, смарт карт) который не допускает их экспортирования в файл, но при этом предосталяет возможность их использования через свой интерфейс. Обычно в таких случаях криптопровайдер распространяет расширения для интеграции с OpenSSL.

    В таких случаях, в процессе конфигурирования вместо указания пути к файлу (Настройки протокола HTTPS, поле Закрытый ключ) необходимо указать через какое расширение можно обращаться к закрытому ключу:

    engine:id расширения:путь к закрытому ключу согласно документации криптопровайдера
            

    Например:

    engine:gostengy:techmill.ru
            

  3. Установить системную переменную окружения ОС с именем OPENSSL_CONF и значением указывающим полный путь к файлу конфигурации OpenSSL.
    Кстати
    В случае настройки клиента удаленного доступа для приложения Win32, это удобно настроить (как подключение файл конфигурации OpenSSL, так и установка переменной окружения OPENSSL_CONF) в процессе конфигурирования на странице Дополнительные модули и переменые окружения в составе клиента удаленного доступа.
  4. В файле конфигурации текущего сервиса MillAppServer.conf, который находится рядом с исполняемым файлом в зависимости от используемой разрядности, в элементе /config/object[@class="{91D7A767-7222-4463-BC7F-AD40589E3426}"] найти и изменить (или в случае его отсутствия, добавить) узел <param name="CipherList" value="GOST2012-GOST8912-GOST8912 GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89"/> для поддержки всех версий ГОСТ - 2012, 2001 и 94, либо <param name="CipherList" value="GOST2012-GOST8912-GOST8912"/> для поддержки только версии ГОСТ 2012.

В случае проблем с использованием настроенного и запущенного сервиса, для проверки его работоспособности рекомендуется использовать утилиту openssl в режиме клиента TLS, с помощью команды openssl s_client -connect 127.0.0.1:443. В случае успешного соединения с сервером в выводе консоли будет указана вся информация об установленном соединении, такая как сертификат, версия протокола TLS, используемый шифр и многое другое.

Для проверки корректности созданного файла конфигурации OpenSSL, и самой загрузки ГОСТ библиотеки, можно воспользоваться командой openssl engine. В случае правильной настройки, среди строк вывода будет строка "(gost) Reference implementation of GOST engine".

Перед использованием OpenSSL утилиты необходимо аналогично обеспечить настройку файла конфигурации OpenSSL, как указано в пункте 2 и установить системную переменную окружения ОС с именем OPENSSL_CONF, как указано в пункте 3.


10.2. gost_capi.dll или gostengy.dll - библиотека от КриптоПро (развитие прекращено)

Вариант 2: gost_capi.dll (для OpenSSL <1.1.0) или gostengy.dll (для OpenSSL >= 1.1.0) - библиотека от КриптоПро  для работы установленного КриптоПро CSP через интерфейсы OpenSSL (работает только при установленном КриптоПро CSP, т.к. вся работа с ГОСТ будет осуществляться КриптоПро CSP, но опосредованно через интерфейсы OpenSSL).

Важно!
Развитие данного продукта прекращено. Также нет сведений о поддержке актуальной версии OpenSSL 3.0.

Аналогично, как и с библиотекой gost.dll, версия библиотеки зависит от используемой версии OpenSSL:

  • для OpenSSL < 1.1.0: необходимо использовать библиотеку gost_capi, НЕ поддерживает ГОСТ 2012
  • для OpenSSL >= 1.1.0: необходимо использовать библиотеку gostengy, поддерживает ГОСТ 2012

Скачать необходимые версии библиотеки можно на сайте КриптоПро . Более подробное описание использования можно найти у них же на форуме.

Важно!

Необходимо использовать библиотеку соответствующую разрядности используемого приложения, которое будет использовать данную библиотеку. Например, если настраивается серверная сторона Сервиса, то выбирается в соответствии с его разрядностью, если настраивается клиентская сторона (приложение для удаленного доступа), то в соответствии с его разрядностью (на текущий момент только Win32).

Развертывание :

  1. Расположить необходимую библиотеку поддержки алгоритмов ГОСТ нужной разрядности (gost_capi.dll для OpenSSL <1.1.0 или gostengy.dll в случаае использования OpenSSL >= 1.1.0) рядом с исполняемыми файлами, которые будут ее использовать. В случае использования Win64 разрядности сервиса - это подкаталог WIN64.
  2. Создать файл конфигурации OpenSSL:

    01openssl_conf = openssl_def
    02
    03[openssl_def]
    04engines = engine_section
    05
    06[engine_section]
    07gost = gostengy_section
    08
    09[gostengy_section]
    10engine_id = gostengy
    11dynamic_path = ./gostengy.dll
    12default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1
        

    В указанном примере файла конфигурации предполагается, что библиотека поддержки алгоритмов ГОСТ находится рядом с исполняемыми файлами. Но файл конфигурации может быть расположен в ином месте. В таком случае необходимо указать полный, а не относительный путь к библиотеке. Кстати, в качестве разделителя каталогов пути необходимо использовать прямой слэш "/" как в Unix, а не обратный, как в Windows, либо экранировать обратные слэши еще одним обратным слэшем - "\\".

    В случае использования существующего файла конфигурации, например поставляемого с самим OpenSSL, необходимо 1-ю строчку (openssl_conf = openssl_def) вставить в начало этого файла, а остальные строки в самый конец файла.

    Указанный файл конфигурации является примером, и может быть изменен пользователем в зависимости от требуемых настроек.

    Кстати

    Подобным образом возможно подключить любые другие расширения (engine) для OpenSSL.

    Например, в случае если приватный ключ сертификата хранится на аппаратном носителе (USB токен, смарт карт) который не допускает их экспортирования в файл, но при этом предосталяет возможность их использования через свой интерфейс. Обычно в таких случаях криптопровайдер распространяет расширения для интеграции с OpenSSL.

    В таких случаях, в процессе конфигурирования вместо указания пути к файлу (Настройки протокола HTTPS, поле Закрытый ключ) необходимо указать через какое расширение можно обращаться к закрытому ключу:

    engine:id расширения:путь к закрытому ключу согласно документации криптопровайдера
            

    Например:

    engine:gostengy:techmill.ru
            

  3. Установить системную переменную окружения ОС с именем OPENSSL_CONF и значением указывающим полный путь к файлу конфигурации OpenSSL.
    Кстати
    В случае настройки клиента удаленного доступа для приложения Win32, это удобно настроить (как подключение файл конфигурации OpenSSL, так и установка переменной окружения OPENSSL_CONF) в процессе конфигурирования на странице Дополнительные модули и переменые окружения в составе клиента удаленного доступа.
  4. В связи с тем, что КриптоПро не работает с файлами закрытых ключей находящихся в файлах, необходимо использовать приватный ключ находящийся в одном из следующих мест где криптопровайдер КриптоПро сможет его найти и использовать:
    • системное хранилище сертификатов Windows (certmgr.msc) - необходимо предварительно импортировать сертификат содержащий приватный ключ одним из штатных способов
    • хранилища сертификатов самого КриптоПро - необходимо предварительно импортировать сертификат содержащий приватный ключ с помощью инструментов КриптоПро, наприме утилиты certmgr из штатной поставки КриптоПро
    • аппаратный носитель (USB токен, смарт карт) содержащий приватный ключ

    В любом из вышеперечисленном варианте, путь к закрытому ключу нужно указывать не как к файлу, а с помощью расширения для OpenSSL от КриптоПро (gost_capi или gostengy), например - engine:gostengy:techmill.ru, т.е. по шаблону engine:gost_capi или gostengy:FQDN указанное в сертификате (доменное имя). При непосредственном использовании этого ключа сам криптопровайдер определит его местонахождение, и при необходимости будет иницировать интерактивный процесс запроса разрешения на использование указанного ключа и его пароля. Но в любом случае, приватный ключ должен быть доступен КриптоПро и находиться в одном из вышеуказанных хранилищах, а не в файле.

    Но т.к. при конфигурировании текущего сервиса на странице Настройки протокола HTTPS, поле Закрытый ключ принимает только путь к файлу и ничего более, то указание пути в формате engine:gostengy:FQDN  не позволит сохранить введенное значение. Для решения этого момента, необходимо, в процессе конфигурации указать путь к какому-то другому файлу, например к файлу сертификату домена (открытый ключ), а затем после конфигурирования, в файле конфигурации текущего сервиса MillAppServer.conf, необходимо заменить введеное значение в формате engine:gostengy:FQDN. Для этого в элементе /config/object[@class="{91D7A767-7222-4463-BC7F-AD40589E3426}"] необходимо найти и изменить значение  value="..."  в узле <param name="PrivateKeyFile" value="введенное ранее значение"/> на необходимое в формате engine:gostengy:FQDN, например   <param name="PrivateKeyFile" value="engine:gostengy:techmill.ru"/>.
    Остальные файлы сертификата (сертификат центра сертификации, сертификат домена), по прежнему, необходимо использовать в виде файлов и соответственно при конфигурировании указывать как пути к файлам в файловой системе.
  5. В файле конфигурации текущего сервиса MillAppServer.conf, который находится рядом с исполняемым файлом в зависимости от используемой разрядности, в элементе /config/object[@class="{91D7A767-7222-4463-BC7F-AD40589E3426}"] найти и изменить (или в случае его отсутствия, добавить) узел <param name="CipherList" value="GOST2012-GOST8912-GOST8912 GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89"/> для поддержки всех версий ГОСТ - 2012, 2001 и 94, либо <param name="CipherList" value="GOST2012-GOST8912-GOST8912"/> для поддержки только версии ГОСТ 2012.

В случае проблем с использованием настроенного и запущенного сервиса, для проверки его работоспособности рекомендуется использовать утилиту openssl в режиме клиента TLS, с помощью команды openssl s_client -connect 127.0.0.1:443. В случае успешного соединения с сервером в выводе консоли будет указана вся информация об установленном соединении, такая как сертификат, версия протокола TLS, используемый шифр и многое другое. Перед использованием OpenSSL утилиты необходимо аналогично обеспечить настройку файла конфигурации OpenSSL, как указано в пункте 2 и установить системную переменную окружения ОС с именем OPENSSL_CONF, как указано в пункте 3.


10.3. Выбор браузеров для взаимодействия с веб-серверами использующими SSL сертификаты с ГОСТ алгоритмами

Для взаимодействия браузера с веб-серверами, использующими SSL сертификаты с ГОСТ алгоритмами, необходимо, чтобы эти браузеры "понимали" эти алгоритмы. "Понимание" криптоалгоритмов, обеспечивается путем взаимодействием браузера с определенным криптопровайдером, через ту или иную инфраструктуру криптопровайдеров.

На ОС Windows инфраструктура криптопровайдеров обеспечивается Microsoft CryptoApi. Различные браузеры могут использовать какую-то определенную инфраструктуру криптопровайдеров. Например Internet Explorer может использовать только Microsoft CryptoApi, а Chrome и Firefox - только NSS.

Таким образом, для работы с веб серверами, использующими SSL ГОСТ-сертификатами требуется установленный на клиенте криптопровайдер с поддержкой ГОСТ, и браузер, который умеет опосредовано через инфраструктуру, использовать этот криптопровайдер.

Рассмотрим на примере продуктов CryptoPro (это 1 из примеров, по аналогии могут быть использованы любые другие криптопровайдеры, добавляющиеся в Microsoft CryptoApi, и реализующие поддержку ГОСТ алгоритмов).

Установка CryptoPro CSP добавляет в Microsoft CryptoApi криптопровайдер, реализующий поддержку ГОСТ алгоритмов:

  • Internet Explorer - полная поддержка. Поддерживаются как ГОСТ 2012, так и предыдущие алгоритмы.
  • Firefox, непосредственно официальные сборки - не поддерживаются, но можно использовать третьесторонние сборки, например КриптоПро Fox.

    Важно!

    Установка браузера КриптоПро Fox, должна производится после установки криптопровайдера.

    КриптоПро Fox не подерживает  сертификаты с алгоритмами ГОСТ 2012.

    Если после установки КриптоПро Fox - соединение с сервером не устанавливается с кодом ошибки "SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT", то необходимо проверить, что модуль для связи браузера с КриптоПро CSP, загружен браузером:

    • Открыть Меню -> Настройки -> Дополнительные -> Сертификаты -> Устройства защиты
    • В открывшемся диалоге, найти модуль CryptoPro PKCS11, у которого должен быть дочерний модуль CryptoPro Token. Если дочернего модуля нет, то необходимо переустановить данный браузер.

    Если после установки КриптоПро Fox - соединение с сервером считается ненадежным, то необходимо сделать изменения в его настройках:

    • Открыть вкладку с адресом about:config
    • Найти настройку с именем security.tls.version.max, и изменить значение с 3 на 2
  • Chrome - не поддерживается из-за использования им криптопровайдеров NSS. Однако можно использовать стороннюю сборку Chromium от КриптоПро - Chromium Gost , в которую включена возможность поддержки ГОСТ алгоритмов, в случае работы совместно с КриптоПро CSP. Поддерживаются как ГОСТ 2012, так и предыдущие алгоритмы. Chromium Gost является  рекомендуемым браузером в случае использования ГОСТ сертификатов .

Кстати
На текущий момент, на сколько известно, использование продукта CryptoPro CSP, только лишь для использования в браузерах (добавление поддержки ГОСТ алгоритмов) - не требует приобретения лицензии КриптоПро CSP.

11. Процедура формирования заголовков окон
Для формирования заголовков окон и имен файлов может использоваться пользовательская процедура, мнемокод которой задается в настройке "DescribeBalanceReport". Пользовательская процедура, указанная в этой настройке, должна иметь следующие параметры:
Позиция Наименование параметра Тип данных Тип параметра Описание параметра
1 NCOMPANY Число (number) Входной (in) Организация (ссылка на COMPANIES.RN)
2 NREPORT Число (number) Входной (in) Отчет (ссылка на BLREPORTS.RN)
3 NSUBREPORT Число (number) Входной (in) Подотчет (ссылка на BLSUBREPORTS.RN)
4 NTEMPLATE Число (number) Входной (in) Трафарет (ссылка на BLRPFRMTEMPLATES.RN)
5 NINDEX Число (number) Входной (in) Показатель (сслыка на BALANCEINDEXES.RN)
6 NVALUE Число (number) Входной (in) Значение показателя (сслыка на BLTBLVALUES.RN для показателей в составе таблицы, на BLINDEXVALUES.RN для одиночных показателей)
7 DDATE Дата (date) Входной (in) Дата и время сохранения
8 SAUTHID Строка (varchar2) Входной (in) Пользователь (ссылка на USERLIST.AUTHID)
9 NPURPOSE Число (number) Входной (in) Назначение (перечислеие 0..5)
10 SRESULT Строка (varchar2) Выходной (out) Результат выполнения

Параметр NPURPOSE определяет цель вызова процедуры:
0 Сформировать заголовок окна редактирования значений. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT, NTEMPLATE.
1 Сформировать заголовок окна протокола проверки. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT.
2 Сформировать заголовок окна состава показателя. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT, NINDEX, NVALUE.
3 Сформировать имя файла значений. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT, NTEMPLATE.
4 Сформировать заголовок окна истории значений. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT, DDATE, SAUTHID.
5 Сформировать имя файла истории значений. Допустимо использовать параметры NCOMPANY, NREPORT, NSUBREPORT, DDATE, SAUTHID.

Допустимо при некоторых условиях не возвращать из пользовательской процедуры никакого значения. Если пользовательская процедура вернет в параметре SRESULT значение null, будет использована строка-описатель по умолчанию.
Кстати
Для формирования заголовка окна состава показателя процедура по умолчанию использует значения ключевых для идентификации строки таблицы показателей. Ключевые показателели - это те, которые включены хотя бы в одно активное ограничение уникальности, связанное с соответствующей таблицей показателей (вне зависимости от трафарета).
Важно!
При установке сервиса создается (и поддерживается, если она уже создана) пользовательская процедура с мнемокодом BalanceReportsDesc. Допустимо установить значение настройки "DescribeBalanceReport" в мнемокод этой процедуры, но по умолчанию значение настройки пусто.
Важно!
Пользователи должны иметь права на выполнение пользовательской процедуры, указанной в настройке "DescribeBalanceReport".

12. Настройка браузеров для использования доменной аутентификации

Доменная аутентификация может осуществляться по NTLM и Kerberos протоколу. Первый считается устаревшим, но он обычно включен администратором домена для совместимости. Kerberos всегда включен по умолчанию в современных серверных ОС Windows которые используются в качестве контроллера домена.

Важно!
В браузере Edge, на текущий момент, отсутствует поддержка доменной аутентификации.

Настройка Firefox :

  • Открыть вкладку с адресом about:config
  • В случае необходимости использования NTML аутентификации нужно настроить параметр network.automatic-ntlm-auth.trusted-uris  указав в его значении домен сервиса (например balance.domain.com или .domain.com для использования всех поддоменов из домена domain.com).
  • В случае необходимости использования Kerberos аутентификации также нужно настроить параметры network.negotiate-auth.delegation-uris (задать протокол для которого будет использоваться доменная аутентификация, например "http://,https://" для включения обоих протоколов) и network.negotiate-auth.trusted-uris (значение задается по аналогии с NTLM параметром) .

Кстати
Можно включить использование доменной аутентификации для всех доменов, включив параметры (задав значение true)  network.automatic-ntlm-auth.allow-non-fqdn или network.negotiate-auth.allow-non-fqdn, и очистив значения параметров network.automatic-ntlm-auth.trusted-uris и  network.negotiate-auth.trusted-uris.

Настройка  IE  (Chrome и браузеры на основе Chromium, в частности Opera и Yandex браузер, используют настройки IE):

  • Откройте настройки IE (свойства браузера) и перейдите на вкладку "Безопасность".
  • Выберите зону "Местная интрасеть".
  • Для включения автоматичекой аутентификации проверьте текущую настройку "Проверка подлинности пользователя" - в группе настроек "Уровень безопасности для этой зоны" нажмите на кнопку "Другой", настройка "Проверка подлинности пользователя" должна иметь значение "Автоматический вход в сеть только в зоне интрасети".
  • Для настройки перечня доменов нажмите на кнопку "Сайты" (если в открывшемся диалоговом меню не показался перечень сайтов, а предлагается автоматически определять такие сайты, то задать вручную необходимый сайт можно нажав на кнопку "Дополнительно") в открывшемся диалоге введите нужный домен, и нажмите кнопку "Добавить". Там же можно настроить и требуемый протокол (http или https).

Важно!

Браузер IE осуществляет аутентификацию в каждом новом TCP соединении (сокете) с сервером. И из-за того, что процесс доменной аутентификации происходит путем осуществления не менее 2-х запросов-ответов между клиентом и сервером, то в случае с IE требуется включение KeepAlive (в конфигураторе параметр "Повторно использовать сессии" в группе "Параметры сетевых настроек"). В противном случае, доменная аутентификация в IE будет невозможна.

В браузере IE, после прохождения доменной аутентификации и дальнейшей необходимости перевойти с помощью логина/пароля, или использования другого вида аутентификации, требуется закрыть и снова открыть браузер (переоткрыть вкладку не достаточно).
Это связано с особенностью работы браузера IE (всех версий), в которой он использует упреждающую аутентификацию  (не дожидается требования аутентификации от сервера, а самостоятельно начинает этот процесс), что в совокупности с запоминанием им возможности доменной аутентификации на конкретном URL, приводит к автоматической переаутентификации на доменную учетную запись посреди сеанса.


13. Использование Microsoft Office 2010 или выше

В случае использования на сервере Microsoft Office версии 2010 или выше, может наблюдаться проблема с быстродействием (по сравнению с Office 2007 или более ранней версии) по выгрузке отчетов в Excel файлы.

Данная проблема связана с изменениями в работе с буфером обмена в версиях Microsoft Office 2010 и выше.

А именно:

  1. Изменение способа оповещения просмотрщиков буферов обмена других процессов офисных программ (в частности Excel), запущенных в текущем сеансе Windows.

    В результате этого, при активной работе с буфером обмена, наблюдается замедление работы Excel даже в случае работы только 1-го процесса Excel.

  2. Изменение способа очистки буфера обмена перед его использованием в случаях когда это сделать не удается с 1-го раза, например при интенсивной работе с ним других процессов:
    • В версиях Excel предшествующих 2010, делалось только 1 попытка очистить буфер обмена, после чего процесс шел дальше вне зависимости от результата
    • В версиях Excel 2010 и выше, делается до 10 попыток в случае неудачи, после чего процесс идет дальше вне зависимости от результата

    В результате этого, при активной работе с буфером обмена, наблюдается замедление работы Excel пропорционально количеству других процессов (в частности Excel) конкурирующих за буфер обмена.

Решение проблемы :

  1. Microsoft признала проблемой изменение описанное в пункте 1, и реализовала возможность отключения просмотрщиков буфера обмена во всех своих продуктах Office, начиная с 2010.

    Для включения данной настройки в Office 2010, необходимо убедиться, что его версия не менее 14.0.7106.5000.

    Важно!

    Вы можете вручную применить эту настройку, так как это описано в статье , или включить флажок "Отключить просмотрщик буфера обмена Microsoft Office" в инсталляторе, для автоматического выполнения этой настройки.

    При ручном применении этой настройки стоит иметь ввиду, что она действует только для тех пользователей Windows, в ветке реестра которых она применена. Т.е. её необходимо включить как минимум для того пользователя от имени которого будет работать сервис (по умолчанию, все сервисы в системе работают от имени SID: S-1-5-18).

  2. В Microsoft было отправлено описание проблемы из пункта 2.

    До того момента когда данная проблема будет исправлена (или не исправлена) Microsoft, нами была разработана библиотека OfficeNoSleep.dll, поставляемая в составе Сервиса "Сведение отчетности Онлайн", которая детектирует ситуации описанные в пункте 2, и нивелирует их, когда это возможно.

    Данная библиотека подключается и начинает функционировать когда это необходимо (использование Microsoft Office 2010 и выше) автоматически, т.е. администратору не нужно предпринимать каких-либо действий.

Важно!
Для полного решения описанных проблем, необходимо использовать оба решения совместно. В таком случае, быстродействие будет даже несколько выше того, что было при использовании Microsoft Office 2007 или ниже.