
Замена Crystal Reports в VB6 и .NET-приложениях: RDLC, SSRS, FastReport и генерация PDF кодом
Отчёты на Crystal Reports часто оказываются последним, что держит приложение на старой платформе. Разбираем, где проходят границы поддержки движка, какие есть замены и как переносить сотню .rpt-файлов без потери печатных форм.
Почему Crystal Reports тормозит миграцию
Crystal Reports десятилетиями шёл в комплекте с Visual Basic и Visual Studio, поэтому в старых приложениях он почти везде. В VB6 отчёты вызывались через Report Designer Component (RDC, библиотека craxdrt.dll). SAP прекратил развитие RDC после версии XI R2, и в Crystal Reports 2008 его уже не было. Приложения на VB6 продолжают работать с последним установленным runtime, но обновлять его некуда.
Для .NET существует SAP Crystal Reports for Visual Studio, бесплатный дизайнер и runtime для .NET Framework. SAP выпускает к нему пакеты обновлений, но движок работает только на .NET Framework: проекты на .NET 8 и .NET 10 его не подключат. Получается, что любой перенос приложения на современный .NET упирается в отчёты, а их бывает больше сотни.
Инвентаризация отчётов
До выбора замены нужно понять, что именно переносить. Соберите все .rpt-файлы из репозитория, с файловых шар и из ресурсов сборок, и для каждого зафиксируйте источник данных, параметры, наличие подотчётов, формулы и частоту использования. Частоту лучше брать из журналов приложения, а не со слов пользователей.
Обычно картина такая: треть отчётов не запускалась годами и удаляется, половина это простые табличные выгрузки, а оставшаяся часть это сложные печатные формы с подотчётами и формулами на языке Crystal. Именно последняя группа и определяет выбор инструмента.
- табличные выгрузки часто проще заменить экспортом в Excel, чем переносить как отчёт;
- формулы Crystal переносите в SQL-представления или код, а не в выражения нового движка: так их можно протестировать;
- сохраните эталонные PDF каждого отчёта на фиксированных данных, они понадобятся для сверки.
RDLC и ReportViewer: самый близкий вариант
Формат RDLC от Microsoft это локальная версия отчётов Reporting Services: файл описывает макет, а данные приложение передаёт само в виде DataTable или коллекции объектов. Для .NET Framework есть официальные пакеты Microsoft.ReportingServices.ReportViewerControl.WinForms и WebForms, дизайнер ставится расширением Microsoft RDLC Report Designer для Visual Studio.
Модель очень похожа на Crystal: группы, подотчёты, параметры, экспорт в PDF, Excel и Word. Ограничение то же: официальный ReportViewer работает на .NET Framework. Для современного .NET существует неофициальный порт ReportViewerCore с открытым исходным кодом, который умеет рендерить RDLC в PDF и Excel без визуального просмотрщика. Перед выбором проверьте, устраивает ли вас поддержка силами сообщества.
Imports Microsoft.Reporting.WinForms
Public Function RenderInvoicePdf(lines As DataTable, invoiceNo As String) As Byte()
Dim report As New LocalReport()
report.ReportPath = IO.Path.Combine(AppContext.BaseDirectory, "Reports", "Invoice.rdlc")
' Имя источника должно совпадать с DataSet внутри .rdlc
report.DataSources.Add(New ReportDataSource("InvoiceLines", lines))
report.SetParameters(New ReportParameter("InvoiceNo", invoiceNo))
Return report.Render("PDF")
End FunctionСерверные отчёты: Reporting Services и Power BI Report Server
Если отчёты нужны многим пользователям и их строят по корпоративной базе, логично вынести их из приложения на сервер. Классический вариант это SQL Server Reporting Services: отчёты в формате RDL, публикация на сервере, доступ по URL, подписки на рассылку. Приложение просто открывает ссылку с параметрами или получает готовый PDF через веб-сервис.
Microsoft объявила, что начиная с SQL Server 2025 новые выпуски SSRS не выходят, а функции локальных отчётов консолидируются в Power BI Report Server, который умеет публиковать те же разбитые на страницы RDL-отчёты. Если вы выбираете серверную схему сейчас, планируйте её на Power BI Report Server и уточните условия лицензирования для своей редакции SQL Server.
Сторонние генераторы и отчёты кодом
Коммерческие движки FastReport .NET, Stimulsoft Reports, DevExpress Reports и Telerik Reporting поддерживают современный .NET, имеют визуальные дизайнеры и в разной степени умеют импортировать .rpt. Импорт никогда не бывает идеальным, но для простых отчётов экономит время. У FastReport есть бесплатная редакция FastReport Open Source с ограниченным набором функций.
Отдельный путь это описывать документы кодом. Библиотека QuestPDF собирает PDF через текучий API, хорошо подходит для счетов, актов и накладных, где макет стабилен, а данные меняются. Её распространяет лицензия Community бесплатно для компаний с годовым доходом до миллиона долларов, остальным нужна платная. Отчёт в коде легко версионировать и тестировать, но править его может только разработчик.
- много отчётов, которые правят аналитики: серверный вариант или движок с дизайнером для конечных пользователей;
- приложение на .NET Framework остаётся надолго: RDLC с официальным ReportViewer;
- перенос на .NET 8+ и десяток печатных форм: QuestPDF или FastReport;
- сотни отчётов и бюджет на лицензии: коммерческий движок с импортом .rpt.
Как переносить без сюрпризов
Сначала отделите данные от макета. В Crystal отчёт часто сам ходит в базу через собственное подключение, иногда с паролем внутри .rpt. Перенесите запросы в хранимые процедуры или представления, а отчёт заставьте получать готовый набор данных. Это полезно даже до смены движка: исчезает зависимость от драйверов, которые настроены в отчёте.
Затем переносите по одному отчёту и сверяйте результат с эталонным PDF на тех же данных: итоги, округления, разрывы страниц, пустые группы. Самые частые расхождения связаны с округлением денежных сумм и с тем, как движки обрабатывают NULL в формулах. Держите старый и новый отчёт рядом в приложении, пока пользователи не подтвердят, что новая версия совпадает.
Как это делают сегодня
Вопросы и ответы
Можно ли открыть .rpt без Crystal Reports?
Нет, формат закрытый. Чтобы перенести макет, нужен дизайнер Crystal Reports или импорт в стороннем движке, который поддерживает .rpt.
Работает ли Crystal Reports for Visual Studio с .NET 8?
Нет, движок поддерживает только .NET Framework. Приложение на .NET 8 не сможет напрямую загрузить его сборки.
Что делать с отчётами в приложении на VB6?
Пока приложение живо, оставьте RDC и зафиксируйте runtime. Новые отчёты делайте вне Crystal, например в Excel через автоматизацию или на сервере отчётов, чтобы не увеличивать долг.