Шаблоны RTF применяются для вывода отчетов в программах MS WORD, LibreOffice Writer и им подобных. Описание шаблона см далее в параграфе "Структура шаблона RTF". Ознакомится с примерами RTF шаблонов можно в меню "Менеджер шаблонов", см шаблоны : sqr_8np11.rtf и rep_reestr_sogl_rtf_corr2_ecp.rtf .
Текст после открывающей квадратной скобки [
всегда воспринимается как формула для вычисления. Поэтому в тексте шаблона нельзя применять квадратные скобки [ ] вне формул - это приведет к ошибке формирования отчета. Для обычного текста вместо квадратных скобок следует применять другие спосбы отделения текста: круглые скобки ( ), фигурные скобки { }, угловые скобки < >, символы слэша / / и т.п.
Примеры оформления вывода переменных :
суммы [dbo.xstr(s_kr,'0.00')] или [dbo.xstr(s_kr, '0 0,##')] , где s_kr - имя числовой переменной, зависит от печатаемого отчета/документа; второй аргумент - формат числа, он определяет: наличие разделителя разрядов, количество знаков в дробной части, разделитель дробной части - неполный аналог форматов ячеек MS Excel). Примеры форматов:
'0' - целое число,
'0.00' - число с двумя знаками после запятой, вывод дробной части в любом случае: 1234.50 выведет как "1234.50", а 1234.00 выведет как "1234.00".
'#' - целое число;
'#.##' - число с двумя знаками после запятой, вывод только ненулевой дробной части: 1234.50 выведет как "1234.5", а 1234.00 выведет как "1234".
'0 0,##' - число, разделитель разрядов пробел, разделитель копеек запятая, после запятой два разряда, вывод ненулевой дробной части: 1234.45 выведет как "1 234,45" , а 1234.00 выведет как "1 234" .
'0 0=0' - число, разделитель разрядов пробел, разделитель копеек знак "=", после запятой один разряд, вывод дробной части в любом случае: 1234.56 выведет как "1 234=5" , а 1234.00 выведет как "1 234=0" .
итоги [dbo.xstr(sum(s_kr),'0.00')]
дата [dbo.date_to_str(date_b,1,0)] , где date_b - имя переменной содержащей дату, зависит от печатаемого отчета/документа; 1 - год 4 цифры (0 - 2 цифры), 0 - месяц числом (1 - месяц словом, 2 - всю дату прописью).
за [dbo.date_to_str(CONVERT(datetime, '#@dDate2#', 104), 1, 1)] - результат: за 07 марта 2019 . Здесь @dDate2 - это дата конца периода отчета.
Пример вывода только года [right(dbo.date_to_str(max(date_begin),1,0),4)] .
реквизиты [number] , [max(cdiv)] или [isnull(max(cdiv),'-')] или [max(left(cdiv,2))] , где cdiv, - имя переменной (например код БК) , зависит от печатаемого отчета/документа.
настройка #User_FIO# или [dbo.date_to_str('#dDate#',1,0)] , где User_FIO, dDate - имена переменных со значениями настроек, см описание доступных настроек.
число (целое) прописью [dbo.m_int_propis(sum(s_kr),1,0,'')] , где s_kr число (переменная), которое надо вывести прописью; 1 - род (1-мужской, 2-женский, 3-средний); 0 - склонение (0-сколько "два", 1-какой "второй", 2-какого "второго", 3-скольких "двух"); '' - единицы измерения, необязательный параметр (для рублей например: 'рубль,рубля,рублей,рублев,1') . Число ноль не прописывается - возвращается пусто.
сумма (рубли) прописью [dbo.m_num_to_str(sum(s_kr), 1)] , где s_kr число (переменная), которое надо вывести прописью в рублях; 1 - учитывать падеж копеек (0 - не учитывать, всегда будет "...копеек"). Пример [dbo.m_num_to_str(28.60, 1)] - Двадцать восемь рублей 60 копеек.
Примеры формул
[dbo.m_int_propis(83472358,1,0,'')] - восемьдесят три миллиона четыреста семьдест две тысячи триста пятьдесят восемь;
[dbo.m_int_propis(65,2,1,'')] годовщина - шестьдесят пятая годовщина;
[dbo.m_int_propis(2010,1,2,'')] года - две тысячи десятого года;
[dbo.m_int_propis(222,1,1,'рубль,рубля,рублей,рублев,1')] товар - двухсот двадцати двухрублевый товар;
[dbo.m_int_propis(34,1,0,'год,года,лет,летн,1')] - тридцать четыре года;
[dbo.m_int_propis(34,1,1,'год,года,лет,летн,1')] - тридцати четырехлетный;
[dbo.m_int_propis(11,1,0,'рубль,рубля,рублей,рублев,1')] и ещё
[dbo.m_int_propis(1,2,0,'копейка,копейки,копеек,копеечн,1')] - одиннадцать рублей и ещё одна копейка.
[CASE when sum(s_kr)=0 THEN 'ноль' ELSE [dbo.m_int_propis(sum(s_kr),1,0,'')] END] - обработка нуля, чтоб выводилось не пустое значение.
Примеры формул в RTF шаблоне:
[dbo.xstr(sum(floor(sum_y00)), '0 0')] ([replace(replace(dbo.m_num_to_str(sum(sum_y00),0),' 00 копеек',''),' руб',') руб')]
Результат:
для sum_y00=123.00 : 123 (Сто двадцать три) рубля ,
для sum_y00=123.67 : 123 (Сто двадцать три) рубля 67 копеек .
[dbo.xstr(sum(floor(sum_y00)), '0 0')] ([replace(replace(dbo.m_num_to_str(sum(sum_y00),0),' хх копеек',''),' руб',') руб')]
Результат:
для sum_y00=123.00 : 123 (Сто двадцать три) рубля 00 копеек ,
для sum_y00=123.67 : 123 (Сто двадцать три) рубля 67 копеек .
[dbo.xstr(sum(sum_y00), '0 0,00')] рублей ([dbo.m_num_to_str(sum(sum_y00),0)])
Результат:
для sum_y00=123.00 : 123,00 рублей (Сто двадцать три рубля 00 копеек) ,
для sum_y00=123.67 : 123,67 рублей (Сто двадцать три рубля 67 копеек).
[select dbo.xstr(sum_y00, '0 0,##') + ' (' + lower(replace(replace(dbo.m_num_to_str(sum_y00, 1), ' 00 копеек',''), ' руб', ') руб'))]
Результат:
для sum_ba_y00=123.00 : 123 (сто двадцать три) рубля ,
для sum_ba_y00=123.67 : 123,67 (сто двадцать три) рубля 67 копеек .
[select dbo.xstr(sum_y00, '0 0,##') + ' (' + lower(replace(replace(dbo.m_num_to_str(sum_y00, 1), ' хх копеек',''), ' руб', ') руб'))]
Результат:
для sum_ba_y00=123.00 : 123 (сто двадцать три) рубля 00 копеек ,
для sum_ba_y00=123.67 : 123,67 (сто двадцать три) рубля 67 копеек .
вычисление [dbo.xstr(round(sum(s_kr)*100/sum(s_br),2), '0,##')] - в данном примере вычисление % исполнения росписи (s_kr*100/s_br).
функции
Пример вывода переменной name_act в родительском падеже с заменой слова "района" на "МО":
<func>ПАДЕЖ("[max(REPLACE(dbo.dq(name_act) ,'района', 'МО'))]";1)</func>
выражение dbo.find_ecp(max(dopuk),1,'4.5') - вернет значение "#4.5|И на Марсе будут яблони цвести." ,
а выражение [dbo.rtf_replace(dbo.GetElement(dbo.find_ecp(max(dopuk),1,'4.5'), '|', 1))] - вернет значение "И на Марсе будут яблони цвести.".
ЭЦП
Пример вывода отдельных реквизитов ЭП:
[dbo.GetElement(dbo.find_ecp(max(ecp),5,1), '|', 2)] - дата наложения ЭП 1 уровня в виде ЧЧ.ММ.ГГГГ ЧЧ:ММ:СС , например 22.11.2021 11:33:48 , где 5,1 - вывод реквизита ЭП 1 уровня; '|',2 - признак вывода даты наложения ЭП.
[Left(dbo.GetElement(dbo.find_ecp(max(ecp),2,'Иванов'), '|', 2),10)] - дата наложения ЭП сертификатом, выданным Иванову, в виде ЧЧ.ММ.ГГГГ, например 22.11.2021 , где 2,"Иванов" - вывод реквизита ЭП выданной Иванову; '|',2 - признак вывода даты наложения ЭП.
[Left(dbo.GetElement(dbo.find_ecp(max(ecp),10,'grbs01'), '|', 2),10)] - дата наложения ЭП подписанной определенным логином в виде ЧЧ.ММ.ГГГГ, например 22.11.2021 , где 10,"grbs01" - вывод реквизита ЭП наложенной логином grbs01 (или содержащем текст "grbs01"); '|', 2 - признак вывода даты наложения ЭП.
[dbo.GetElement(dbo.find_ecp(max(ecp),5,1), '|', 0)] - должность подписанта из сертификата, например директор , где 5,1 - вывод реквизита ЭП 1 уровня; '|',0 - признак вывода должности полписанта ЭП
Когда следует использовать max/sum , а когда просто скобки [ ] .
Если данные выводятся без построчной детализации (один текст наподобие договора), то любые переменные надо выводить через функцию max() для текстовых реквизитов и sum() для денежных/суммовых значений.
Например, печатается документ и для всего отчета номер документа является константой от строки не зависящей, тем не менее для вывода номера документа в заголовке отчета вместо [number] следует написать [max(number)]. Аналогично для сумм: в блоке
Образец шаблона RTF:
<report01 srctable="#cSrcDataTable#"; add_order="fio,name">
Блок <report_N srctable="..."; add_where="..."; add_order="..."> …
<report srctable="#cSrcDataTable#">
Описывает источник данных, дополнителные подключаемые таблицы, условия и сортировка данных, также можно указать параметры группировки и отображения. Обязательный блок - переменные считаются только внутри этого блока, вне блока выражения вида [s_kr] воспринимаются как текст.
_N – постфикс блока report, должно быть уникально (число или текст, можно не указывать, если отчет один).
srctable – обязательный параметр, здесь указывается таблица-источник данных. Для универсальности можно использовать значение #cSrcDataTable# (значение имени таблицы из настроек). Источником данных может быть и выборка c алиасом, например: (select … ) t .
add_from – дополнительные таблицы в предложение from …
add_where – дополнительные таблицы в предложение where …
add_order – дополнительные таблицы в предложение order by …
field – поле для группировки данных.
when – условие печати блока.
Блок <group_N_X field="..."; when="..."> …
<group_cdep field="cdep"; when="sum(summa)>0">
Указываются параметры группировки и отображения, аналог блока "Шапка группы" в Excel шаблонах. Данный блок может отсутствовать в отчете.
_N – постфикс блока report. Указывает на принадлежность блока группировки к конкретному блоку report.
_X – должно быть уникально в пределах блока report (число или текст, можно не указывать, если группа одна).
field – имя поля для группировки данных. Можно указать только одно поле. Если группировка требуется по нескольким полям, то следует создать несколько группировок подряд.
when – условие печати блока.
Блок
<detail when=" summa>0">
Можно указать параметры отображения, аналог блока "Детализации" в Excel шаблонах. Данный блок может отсутствовать в отчете.
_N – постфикс блока report . Указывает на принадлежность блока детализации к конкретному блоку report.
when – условие печати блока .
Пример шаблона для печати документа "Плана ФХД"
Структура шаблона RTF "Отчет в отчете"
Во всех блоках отчета можно использовать вложение нового блока <report_N …> … , содержащего свои блоки информации.
Последовательные отчеты, пример:
Вложенные отчеты, пример:
В этом примере для вложенного отчета
Постфиксы (_N) вложенного отчета и его групп не должны пересекаться с постфиксами других блоков <report_N …> … .
Использование вложенных отчетов на больших объемах (в случае, когда внутренние отчеты сильно размножаются) нецелесообразно, так как отчеты формируются начиная в самого внешнего к внутренним, последовательно, и на самом внутреннем отчете, вместо того чтобы создавать один отчет, возможно придется создавать тысячи отчетов, что обязательно скажется на быстродействии не лучшим образом. Лучше заменять вложенные отчеты на один отчет с использованием дополнительных групп, разбитию отчета на разделы и т.п.