Сравнение разных технологий печати документов в Scala, iScala

Для начала определимся с тем, что подразумевается под словами «печать документов» применительно к Scala, iScala. Как известно, в Scala есть три типа вывода информации: запрос (информация выводится для просмотра на экране без возможности стандартной печати), отчёт (может быть просмотрен на экране и распечатан на принтер), например, «Список проводок по запасам», «Отчёт на конец периода» и документ (документы настраиваются, в отличие от стандартных отчётов), например, «Счёт-фактура», «Накладная», «Приходный кассовый ордер» и т.п. Ниже будет идти речь именно о документах.

Пример DDF файла
На настоящий момент имеются различные технологии настройки шаблонов документов для Scala/iScala. Все они используют DDF файлы (Document Definition File — Файл определения документа). Последний столбец сравнительной таблицы разных технологий — Это нестандартное решение, «внешний» отчёт, альтернатива стандартной функциональности.

№ п/п Функция DDF DDF в формате RTF Crystal (DDF+RPT) Канал MSRS (DDF+RDL) DDF+XSLT Внешний отчёт (без DDF)
1 Использование стандартной функциональности Да Да Да Да Да Нет
2 Возможность отрисовки таблиц Псевдографика Да Прямоугольники и линии Да Да Да
3 Возможность добавления вычисляемых полей Нет* Да Да Да Да Да
4 Возможность обращения к базе данных Нет Нет Условно** Да Нет Да
5 Количество разных вариантов документа для одного выходного канала 100*** 100*** 100*** 100*** 100*** Сколько угодно
6 Возможность создания документов не предусмотренных стандартно Нет Нет Нет Нет Нет Да
7 Трудоёмкость создания документа Низкая Высокая Высокая Средняя Средняя Средняя

*Только для модуля «Заработная плата» в DDF файлах можно использовать вычисляемые поля. После публикации материала коллеги меня поправляют: «С некоторых пор можно использовать вычисляемые поля в некоторых DDF-отчетах в OR и PC. Это в хелпе описано как «DDF reports in VBA»»
**Обращаться к базе данных можно с помощью специальной dll-ки, созданной «от безысходности» моим коллегой Алексеем Вишняковым. Запрос может возвращать только одно значение!
***10 кодов документов (от 0 до 9) и 10 (или более) кодов языков

Давайте подробно рассмотрим каждую функцию:

Использование стандартной функциональности — это самая главная строчка в таблице. Именно здесь я должен объяснить, что «внешний» отчёт, хоть и имеет свои прелести, не может быть универсальной альтернативой стандартному механизму печати документов с использованием DDF файлов 🙂

Очень часто пользователи говорят: «DDF файлы, фу! Устаревшая технология!». Не буду спорить, однако, когда вы используете DDF, вы получаете набор данных, который сама Scala/iScala строит по своим внутренним алгоритмам с использованием многих десятков настроек, с анализом различных правил и параметров. Если использовать альтернативный вариант в виде «внешнего» отчёта, вам придётся самостоятельно запрограммировать всю логику системы или сделать допущение относительно тех или иных параметров, что они в Вашей компании являются конкретными величинами и не будут изменены в дальнейшем.

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

Возможность добавления вычисляемых полей — это, скорее всего, не требует дополнительных комментариев 🙂

Возможность обращения к базе данных — иногда в наборе DDF кодов нет нужного. В то же время в таблице базы данных информация имеется и было бы весьма желательно эту информацию получить. Именно из-за этого в своё время мой коллега Алексей Вишняков создал специальную библиотеку для кристала. Она до сих пор работает у многих клиентов, хотя давно пора перейти на новую современную технологию (канал MSRS), где возможность обращения к базе данных является «родной» и где можно сразу получить один набор данных из многих строк, в отличие от использования вышеупомянутой библиотеки, где приходится посылать много запросов на возврат одного значения, из-за чего построение документа может выполняться достаточно длительное время.

Количество разных вариантов документа для одного выходного канала — иногда один и тот же документ имеется в разных вариантах, например, если у вас расчётные счета в нескольких банках, то для разных ваших покупателей удобно иметь разные варианты документа под названием «Счёт», одному с указанием реквизитов в Сбербанке, так как у него тоже там открыт расчётный счет, другому — в ЮниКредит банке. Для этого есть коды документов (от 0 до 9) в карточке покупателя. Кроме этого можно для разных покупателей печатать документы на разных языках (и настроить отдельные DDF файлы для этого). В этом случае используют код языка в названии DDF файла и в карточке покупателя, соответственно. В разных версиях Scala/iScala это было сделано по-разному. В старых версиях Scala для этого использовалась цифра, в iScala для этого используется 3-х символьный код языка, например, ENG, RUS. Соответственно, в старых версиях было ограничение — 10 языков (от 0 до 9), а в новых версиях можно использовать все доступные коды языков.

Возможность создания документов не предусмотренных стандартно — речь в данном случае о печати таких документов, печать которых отсутствует в меню Scala/iScala. В данном случае не имеется в виду обязательное соответствие названия документа названию пункта меню, так, например, очень часто в модуле «Заказ на Продажу» из того, что в Scala/iScala называется «Подтверждение Заказа» делают «Счёт». Здесь подразумевается нечто иное, например, «Список подборки для нескольких заказов» с выбором нескольких конкретных заказов в списке заказов (отметкой («птичкой»), а не интервал «от» и «до»!!!), что стандартно в iScala сделать невозможно. Только для таких случаев стоит «изобретать велосипед» 🙂

Более подробно о каждой из технологий:

DDF в формате RTF: довольно экзотическая технология, которая не особо прижилась в России, хотя некоторые клиенты, использующие модуль «Заработная плата», до сих пор используют это чудо 🙂

Суть этой технологии состоит в том, что при печати создаётся файл в формате RTF, который умеет читать MS Word. Редактирование такого DDF файла — занятие не для слабонервных. Выглядеть такой DDF файл может примерно следующим образом:

Пример DDF файла в формате RTFВ своё время я пытался это использовать, однако, это очень непрозрачно, особенно в случае с русскими символами, каждую букву приходилось заменять её кодом, иначе получались «кракозябры», если HTML я пишу с помощью обычного блокнота, помня HTML тэги наизусть, то запомнить все эти коды RTF я так и не смог и не стал использовать эту экзотику. Насколько я понимаю, не только я один. 🙂

Crystal (DDF+RPT): Для работы создаются 2 файла: DDF и RPT. От первого зависит набор данных, получаемый из системы, от второго — как документ будет выглядеть. Иными, более техническими словами, на основании DDF файла iScala создаёт набор данных (recordset), вызывает отчёт (RPT файл) и передаёт ему этот набор данных в качестве источника. В отчёте формируется внешний вид документа на основе полученного набора данных.

DDF файл при этом может выглядеть примерно так:

DDF файл для варианта DDF+RPT

Канал MSRS (DDF+RDL): Для работы создаются 3 файла: DDF, XML и RDL. От первого зависит набор данных, получаемый из системы, от второго — структура временной таблицы в базе данных iScala, куда полученные данные будут помещены на время формирования документа, от третьего — как документ будет выглядеть. Внутри отчёта запрос может делаться не только к создаваемой временной таблице, но и к любым таблицам базы данных iScala, тем самым, вы больше не ограничены отсутствием или наличием требуемого DDF кода 🙂

DDF файл при этом может выглядеть примерно так:

Пример DDF файла для канала MSRSБолее подробно описано здесь: «Более тесная интеграция MS SQL Server Reporting Services с iScala версии 2.3 SR2» и «Как добавить шаблон документа для выходного канала MSRS?»

DDF+XSLT: Это не технология, а новое решение на базе знаний об XSL преобразованиях, подробнее здесь: Канал MSRS — что делать, если он недоступен из-за очень старой версии?

Внешний отчёт (без DDF): что тут комментировать? 🙂
Подробнее здесь: Примеры отчётов