Мапсофт - компания, которая производит и обслуживает информационные системы для медицинских и образовательных учреждений, от министерства до аптеки или школы. Включает весь бухгалтерский учет (зарплату и кадры, материальные ценности, финансы) а также специфический учет для медицины (амбулаторные карты, рецепты, исследования, меню-раскладка итд) и для образования (учебные планы, общежития, кружки, итд..). В основе системы база данных Postgres, к ней подключаются рабочие места Windows (написаны на Delphi 2007) и веб-клиенты через веб-сервер на PHP.
Я работал в команде поддержки настольных приложений Windows (Delphi), строго по задачам в Jira. В основном это были исправления ошибок, доработки форм и отчетов под новые требования. Иногда была разработка новых форм и отчетов, улучшение производительности. Еще были доработки приложений, не входящих в основную систему - резервное копирование, сервер DICOM (для рентгеновских снимков и УЗИ), импорт-экспорт данных в другие системы.
Настольное приложение Мапсофт грамотно продумано, состоит из подключаемых модулей и адаптивного меню действий. Например, при открытии рабочего места врача поликлиники, в главное меню попадают только элементы, актуальные для врача. При выборе элемента меню подгружается соответствующий программный модуль. Например, при открытии журнала амбулаторных карт подгружается модуль амбулаторных карт, который содержит визуальные формы амбулаторных карт и их журнала. А если амбулаторная карта содержит лабораторные исследования, то подключается модуль лабораторных исследований. Когда форма закрыта, то подключаемый модуль выгружается из памяти. Получается, что в памяти компьютера находятся только используемые в данный момент формы и функции, а не все подряд. При работе приложение занимает в памяти от 10 до 100 Мб и может работать даже на очень старых и слабых компьютерах.
Другой интересной особенностью является встроенный генератор отчетов. Он основан на FastReport, добавляет на лист бумаги горизонтальные полосы с данными из SQL запроса, имеет экспорт в Excel. Есть довольно сложный интерактивный редактор SQL запросов (похожий на мастер запросов в 1С), редактор формы параметров и редактор макета отчета. Редакторы не вполне удобные, например нет отмены действий и много неочевидных особенностей. Но позволяют делать отчеты любой сложности, хотя это и требует много времени и терпения.
Еще интересен встроенный язык расчетов, по сути это диалект C++, но на русском языке. Компилируется в подключаемый бинарник DLL. Имеет удобный синтаксис для запросов SQL и работы с результатами запросов, работы с динамическими списками, при этом объекты языка совместимы с Delphi. Из недостатков - отсутствие документации, отладчика и удобного редактора кода.
Изначально приложение Мапсофт использовало базу данных Sybase. Все SQL запросы, хранимые процедуры и триггеры были написаны на диалекте Sybase. Когда добавили поддержку Postgres, сделали автоматический конвертер текста PL/SQL из диалекта Sybase в диалект Postgres. Это не только замена ключевых слов и базовых функций, но и подстановка подзапросов вместо имен (Postgres не поддерживает синонимы колонок в условиях WHERE) и много других особенностей. Кроме того, в приложение встроен редактор схемы БД и хранимых процедур, отладчик SQL-запросов. Инструмент очень полезный, но несколько примитивный - не хватает поиска, постраничного чтения результатов запросов, подстановки имен вместо ключей, перехода по ссылкам. Я для себя это все реализовал в отдельном "Браузере БД".
Визуальные формы и элементы управления в основном стандартные, хотя и основаны на AlphaControls и могут менять внешний вид в настройках программы (переключение тем, размер шрифта, масштабирование). Так исторически сложилось, что основная часть работы с предметной областью (бизнес-логики) находится прямо в формах, в обработчиках нажатий кнопок, переключателей и других действий пользователя. Это сильно затрудняет понимание и доработку бизнес-логики модуля, поскольку она "размазана" по нескольким формам и перемешана с логикой визуальных элементов. Проблему усугубляет формат общения между модулями, формами и общими функциями в виде VariantArray - массива параметров. Элементы массива не имеют имен и должны находиться строго по порядку. Хорошо, если есть понятное текстовое описание параметров. Но в большинстве случаев описания нет и нужно каждый раз читать реализацию функции/формы, чтобы понять какие параметры в каком порядке. Я старался добавлять текстовое описание параметров как в исходники, так и в справочную систему Confluence. Также старался выносить бизнес-логику из элементов форм в отдельные функции и объекты.
Основная часть бизнес-логики в виде SQL запросов. Часть запросов находятся на форме в виде компонентов TQuery, часть прописаны в действиях со строками таблиц (INSERT, UPDATE, DELETE). Самые сложные и крупные запросы находятся прямо в коде формы. Это "паровозик" из отдельных строк, которые могут меняться в зависимости от условий. Выглядит это как смесь кода Delphi и кусков SQL. Читать это сложно, код SQL раздроблен и не отформатирован. Ключевые слова и названия полей выглядят одинаково, а подсветка кода SQL внутри кода Delphi не работает. Я старался делать текст SQL читабельным - ключевые слова заглавными буквами, отступы внутри блоков, не разрывать текст SQL, условия оформлять в SQL, а не в Delphi. Для облегчения работы с уже имеющимися запросами SQL я добавил в свой "Браузер БД" функционал для форматирования SQL запросов, очистки текста SQL от кода Delphi и наоборот, экспорт SQL в код Delphi. Это сильно облегчило работу с огромными запросами на сотни строк.