Какого «Убийцу 1С» я хочу?
В статье я распишу своё видение «убийцы 1С» — т.е. инструмента для быстрой разработки приложений баз данных (Rapid Application Development). Далее я буду называть эту гипотетическую платформу Free RAD.

Архитектура
Исполнимое приложение может быть бинарным (EXE) или Java, не особо критично.
Инструмент должен одинаково хорошо подходить для работы с большими и маленькими базами данных, поэтому в идеале он должен работать в нескольких режимах.
Однопользовательское решение
Локальное приложение с базой данных в файле. База данных хранится в одном файле. Приложение состоит из исполнимого файла и набора библиотек, некоторые из которых отвечают за обработку данных в SQL.
Многопользовательское решение
Сервер приложений + SQL-сервер + клиентское приложение. Клиентским приложением может быть браузер, сервером приложений — веб сервер.
Лицензии и стоимость
Вообще предпочтителен полный Open Source, чтобы не зависеть от воли разработчика платформы. Если платформа и должна стоить денег, то она должна быть дешевле продуктов, которых я на ней разрабатываю. Т.е. если я продаю продукт за 5.000 рублей, то платформа не должна стоить пользователю дороже 2.000 рублей. Тогда я могу включить ее в стоимость продукта.
В идеале, конечно, бесплатная платформа.
Прикладные объекты
В 1с существует большое разнообразие таблиц — справочники, документы, регистры, планы обмена. Для RAD достаточно буквально нескольких объектов.
Таблица
Справочники и документы можно представить в виде таблицы. Можно (но не обязательно) добавить признак того, что это таблица документа или справочника для автоматического появления полей — наименование, номер, дата.
Для таблицы необходима возможность включения внешнего ключа и указания состава ключей таблицы.
Таким образом мы сможем составить таблицы для табличных частей, регистров сведений, регистров накопления.
Также нужна возможность использования временных таблиц, аналогов таблиц значений в 1С. Можно хранить их в памяти или в базе данных, лучше чтобы система сама принимала решение о том, где, или с помощью директив.
Примеры таблиц
В примерах ключевые поля таблиц выделены жирным.
Справочник «Номенклатура» будет представлен таблице с полями:
- Код — код товара
- Наименование — наименование товара
Табличная часть товаров у документа «Приходная накладная» будет представлена таблицей с полями:
- Документ — ссылка на приходную накладную
- Номер — счетчик, номер строки
- Товар — ссылка на номенклатуру
- Количество
- Цена
- Сумма
Регистр сведений «Курсы валют» будет представлен таблицей с полями:
- Дата — дата курса
- Валюта — валюта
- Курс — курс валюты
Регистр накопления «Товары на складах» будет представлен таблицей с полями:
- Дата — дата движения
- Документ — документ движения
- Склад
- Товар
- Количество — количество движения товара, приход с плюсом, расход с минусом
Представления или виды (views)
На основе таблиц нужно получать виды. Для работы достаточно видов из требуются для одной таблицы, но если будет возможность объединять таблицы, будет еще лучше.
Виды для регистров сведений
Для регистров сведений нужен срез первых, срез последних на определенную дату. А также срез на каждую дату в заданном интервале дат.
Виды для регистров накопления
Для регистров сведений нужен итоговый начальный и конечный остаток на определенную дату. А также итоговый и начальный остаток на каждую дату/документ в заданном интервале дат.
При этом не так важно, будут ли на уровне платформы использоваться промежуточные итоги по таблицам, программист прикладного уровня потребляет только представление.
Метаданные
Метаданные содержат описание всех прикладных объектов, т.е. в нашем случае таблиц.
Желательно, чтобы каждая таблица и поле таблицы имели уникальный guid, тогда операция переименования объектов таблицы происходит автоматически. Но можно обойтись и без этого. Guid можно хранить в атрибуте описания поля, как вариант.
Обязательно должна быть процедура, которая обновляет структуру текущей базы в соответствии с новыми метаданными.
При этом код может поставляться просто в виде нового файла кода.
Формы
Формы описываются в виде иерархии, как управляемые формы. Для каждого элемента указывается связь с данными. Динамические списки в качестве источника данных используют SQL-запросы или представления.
Желателен визуальный конструктор форм или возможность проверить, как форма выглядит визуально, без запуска приложения.
Все формы рассчитываются на сервере, на клиент только отображаются.
Однако на клиенте должна быть возможность выполнения кода и хранения клиентского контекста, например для создания COM-объектов, печати на локальные принтеры и использования другого локального оборудования, например, издания звука.
Манипуляция данными и процессом выполнения
Манипуляция данных осуществляется за счет отправки SQL-запросов или команд на создание/изменение объектов.
В платформе должны существовать объекты для работы с выборкой, записью таблицы (добавление/изменение).
В качестве прикладного языка может использоваться любой, можно не типизированный язык, например Java.
Задача языка — управление объектами манипуляции данными (выборки, записи), управление элементами формы, формирование отчетов и т.п.
Отчеты
Достаточно инструмента, который будет показывать данные в MXL-таблицах, т.е. таблицах, где каждая строка/несколько строк могут иметь свою разбивку по колонкам и свою ширину колонки.
Отчеты можно сначала писать программно, а потом уже реализовать что-то вроде СКД.
Отчеты должны быть интерактивными, т.е. при щелчке на ячейке должно обрабатываться событие.
Механизм отчетов, соответственно, будет использоваться и для печатных форм.
Модульность и расширяемость
В базу данных можно добавлять свои поля и таблицы. При загрузке новой конфигурации поставщика происходит объединение полей и их таблиц.
Что касается прикладного кода, то локальный код, который должен сохраняться при обновлениях кода от поставщика, пишется в виде расширений.
При этом используются стандартные приемы аспектно-ориентированного программирования — выполнение до, после, вместо.
Привязывать свои доработки можно к определенной функции внутри определенного модуля. Также можно делать привязки к определенной метке внутри функции. Если же разработчики типового решения не озаботились о введении метки, то к определенному шаблону кода.