Для начала определимся с тем, что подразумевается под словами «печать документов» применительно к Scala, iScala. Как известно, в Scala есть три типа вывода информации: запрос (информация выводится для просмотра на экране без возможности стандартной печати), отчёт (может быть просмотрен на экране и распечатан на принтер), например, «Список проводок по запасам», «Отчёт на конец периода» и документ (документы настраиваются, в отличие от стандартных отчётов), например, «Счёт-фактура», «Накладная», «Приходный кассовый ордер» и т.п. Ниже будет идти речь именно о документах.
На настоящий момент имеются различные технологии настройки шаблонов документов для 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 файл может примерно следующим образом:
В своё время я пытался это использовать, однако, это очень непрозрачно, особенно в случае с русскими символами, каждую букву приходилось заменять её кодом, иначе получались «кракозябры», если HTML я пишу с помощью обычного блокнота, помня HTML тэги наизусть, то запомнить все эти коды RTF я так и не смог и не стал использовать эту экзотику. Насколько я понимаю, не только я один. 🙂
Crystal (DDF+RPT): Для работы создаются 2 файла: DDF и RPT. От первого зависит набор данных, получаемый из системы, от второго — как документ будет выглядеть. Иными, более техническими словами, на основании DDF файла iScala создаёт набор данных (recordset), вызывает отчёт (RPT файл) и передаёт ему этот набор данных в качестве источника. В отчёте формируется внешний вид документа на основе полученного набора данных.
DDF файл при этом может выглядеть примерно так:
Канал MSRS (DDF+RDL): Для работы создаются 3 файла: DDF, XML и RDL. От первого зависит набор данных, получаемый из системы, от второго — структура временной таблицы в базе данных iScala, куда полученные данные будут помещены на время формирования документа, от третьего — как документ будет выглядеть. Внутри отчёта запрос может делаться не только к создаваемой временной таблице, но и к любым таблицам базы данных iScala, тем самым, вы больше не ограничены отсутствием или наличием требуемого DDF кода 🙂
DDF файл при этом может выглядеть примерно так:
Более подробно описано здесь: «Более тесная интеграция MS SQL Server Reporting Services с iScala версии 2.3 SR2» и «Как добавить шаблон документа для выходного канала MSRS?»
DDF+XSLT: Это не технология, а новое решение на базе знаний об XSL преобразованиях, подробнее здесь: Канал MSRS — что делать, если он недоступен из-за очень старой версии?
Внешний отчёт (без DDF): что тут комментировать? 🙂
Подробнее здесь: Примеры отчётов