2. Конфигурация

Для добавления генератора документа в конфигурации указывается запись вида:

document:pattern.<id>.title=<title>
document:pattern.<id>.scope=<scope>
document:pattern.<id>.script=ru.bgcrm.plugin.document.docgen.CommonDocumentGenerator
document:pattern.<id>.type=<type>
document:pattern.<id>.documentTitle=<doc_title>
document:pattern.<id>.file=<file>
document:pattern.<id>.xslt=<xslt>
#
# необязательные параметры общие
document:pattern.<id>.titleRegexp=<title_pattern>
#
# необязательный параметры для type=pdfForm
document:pattern.<id>.flattening=<flattening>

Где:

<id> - уникальный числовой идентификатор типа документа;
<scope> - тип сущности, для которой генерируется документ;
<type> - тип генерируемого документа, в данный момент поддерживается только pdfForm - PDF форма;
<doc_title> - имя сгенерированного документа;
<file> - имя файла со шаблоном документа (PDF форма либо иной исходный документ для подстановки параметров) рекомендуется располагать в каталоге BGCRM/docpattern;
<xslt> - XSLT 2.0 шаблон, генерирующий XML документ со значениями полей;
<title_pattern> - REGEXP шаблон имени сущности, для которой будет предлагаться к генерации данный тип документа;
<flattening> - 1, если сгенерированный PDF документ следует сделать нередактируемым.

Замечание

PDF формы можно подготовить с помощью Adobe Acrobat или аналогичной программы.

Например:

document:pattern.3.title=Уфа заказ
document:pattern.3.scope=bgbilling-commonContract
document:pattern.3.script=ru.bgcrm.plugin.document.docgen.CommonDocumentGenerator
document:pattern.3.titleRegexp=^72\d{6}
document:pattern.3.file=docpattern/ufa_zakaz.pdf
document:pattern.3.xslt=docpattern/ufa_zakaz.xsl
document:pattern.3.type=pdfForm
document:pattern.3.documentTitle=Уфа заказ.pdf

Принцип генерации основан на подстановке в именованные поля документа (для PDF формы это имена редактируемых полей) определённых значений. Значения полей получаются из XML документа - результата XSLT трансформации.

На вход XSLT генератора подаётся XML документ следующего содержания:

<event objectId="<objectId>" objectType="<objectType>">
<request>
<param name="<paramName1>" value="<value1>"/>
<param name="<paramName2>" value="<value2>"/>
....
<param name="<paramNameX>" value="<valueX>"/>
</request>
</event>

Где:

<objectId> - код объекта для которого генерируется документ;
<objectType> - тип объекта;
<paramNameX> и <valueX> - параметры HTTP запроса, переданные на генерацию документа, благодаря этим данным возможен параметризированный вызов генерации документа из внешних систем.

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

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm="http://bgcrm.ru/saxon-extension"
 xmlns:bgcrm-math="http://bgcrm.ru/saxon-extension-math"
 xmlns:t="http://bgcrm.ru/template" 
 exclude-result-prefixes="bgcrm bgcrm-math t"
 version="2.0">

 <xsl:template match="/event">
  <data>
     <!-- отладочный исходной XML -->
    <xsl:copy-of select="/event"/>
  </data>
 </xsl:template>
</xsl:transform>

Получение дополнительной информации осуществляется с помощью функций-расширений. Результат вызова функции-расширения можно вывести в отладку с помощью инструкции <xsl:copy-of>.

В результате преобразования для генерации шаблона подготавливается документ следующего вида со значениями полей.

08-07/19:03:49 DEBUG [http-bio-9089-exec-6] CommonDocumentGenerator - Transformation debug: <?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xs="http://www.w3.org/2001/XMLSchema">
<field name="contract_number">72000784</field>
<field name="contract_day">11</field>
<field name="contract_month">апреля</field>
...

В составе ядра представлены перечисленные далее пространства имён и функции в них. Список может дополняться в плагинах. Примеры XSLT шаблонов для генерации документов доступны в WiKi.

2.1. Расширения пространства имён "http://bgcrm.ru/saxon-extension-math"

isbitset( <value>, <bitNumber> ) - возвращает результат проверки установленности в значении <value> бита <bitNumber>, нумерация с 0 от конца двоичного представления числа.

Пример:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm-math="http://bgcrm.ru/saxon-extension-math"
 exclude-result-prefixes="bgcrm-math"
 version="2.0">

...
<xsl:when test="bgcrm-math:isbitset( $contractCard/data/contract/@gr, 43 )">
   <field name="contract_ctv_erkc">On</field>
</xsl:when>
...

2.2. Расширения пространства имён "http://bgcrm.ru/saxon-extension"

customer( <id> ) - получение XML документа с данными контрагента с кодом <id>.

Пример:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm="http://bgcrm.ru/saxon-extension"
 exclude-result-prefixes="bgcrm"
 version="2.0">
...
<xsl:variable name="customer" select="bgcrm:customer($customerId)" />
...
<field name="fio_full">
  <xsl:value-of select="$customer/data/customer/@title" />
</field>
...