Прикладные решения
Простая и быстрая разработка прикладных решений.
Шаблоны для быстрого создания новых сущностей и полей сущностей
На нашем сайте вы найдете готовые примеры реализации всех частей приложения: моделей, событий, операций, действий, фильтров, нумераторов, форм, виджетов.
Простой и ясный код
Запросы к БД, составляющие 50% прикладного кода, пишутся на Linq и выглядят лаконичней SQL.
Все задачи по взаимодействию прикладного кода с пользователем, БД, кэшированием, безопасностью и другими важными, но не профильными для бизнеса вещами взяла на себя платформа.
В системе есть богатый API для прикладной разработки.
XML комментарии
XML комментарии из кода попадают в систему как название сущностей, полей и других объектов. Например:
- ///<summary>
- /// Операционные дни
- ///</summary>
- [HierarchyRoot]
- [Id(«19C4245B-4DF8-460E-0000-000000000000″)]
- public partial class OperatingDay : DocumentBase, IWithRevision
- {
- ///<summary>
- /// Открыл
- /// Пользователь, создавший операционный день
- ///</summary>
- [Field(Nullable = false)]
- [Id(«00000000-0000-0000-9D6C-E34DD7D025FF»)]
- public User EmployeeOpen { get; set; }
По такому классу у вас в системе появится документ, который будет называться “Операционные дни”. У него будет не обязательное поле “Открыл” с подсказкой по наведению “Пользователь, создавший операционный день”.
Вычисляемые поля
В платформе есть возможность добавить к документу поле, которое не будет хранится в базе данных, но будет “вытягивать” дополнительную информацию по уже имеющимся данным. Например, в документе Договор есть поле Юридическое лицо и “виртуальное” поле “Адрес юр.лица”.
- public partial class MyDocument : DocumentBase
- {
- /// Выражение, по которому “вытягивается” вычисляемое поле
- protected static Expression<Func<MyDocument, string>> Cont = a => a.Contragent.Address.FullAddress;
- ///<summary>
- /// Юридическое лицо
- /// Поле-ссылка на справочник юридических лиц
- ///</summary>
- [Field]
- public JuridicalPerson Contragent { get; set; }
- ///<summary>
- /// Адрес юр. лица
- /// Виртуальное (вычисляемое) поле, отображающее полный адрес юридического лица
- ///</summary>
- [VirtualField(«Cont»)]
- [Id(«00000000-0000-0000-BBE3-ED380003A0B1″)]
- public string Address { get; set; }
- }
Нумераторы
При создании документа его поля должны предзаполняться по какому-то алгоритму. Готовое решение — нумератор. Это специальный код, заполняющий значение по умолчанию для поля сущности.
Примеры использования: текущая дата, текущий пользователь, номер по порядку. Однажды разработанный нумератор можно использовать для различных документов.
Заполнятор :)
А если нужно предзаполнить несколько полей сущности связанным общим алгоритмом? Default-ы (заполняторы) — готовый шаблон для этой возможности. Входными данными для алгоритма являются данные о пользователе, о том, из какого места системы он пытается создать документ, и т.д.
Например: можно разработать Default, который будет заполнять поля Документа аналогично ранее выделенному элементу в системе. Своеобразный способ «клонировать» документ.
События форм
Позволяет добавить динамическое поведение для веб форм без знания JavaScript.
Нравится WEB 2.0, но пугает JavaScript? Создавайте интерактивные формы на C# с интуитивно понятным кодом.
Предположим, у вас на форме есть три поля: количество, цена и сумма. Вам нужно вычислять одно значение в зависимости от другого.
<Пример>
При этом отладку можно проводить прямо в VS для C# кода.
События сущности
Вы можете обработать события создания, изменения и удаления сущностей, чтобы определить набор бизнес-правил, проверяющих корректность изменений. Для разных групп пользователей можно установить разный набор проверок.
Например, при сохранении Договора проверить корректность заполнения ИНН и проверить, что данная организация не находится в «черном списке».
Workflow документа
Рабочий процесс над документом можно создавать и изменять прямо из интерфейса. На каждое действие можно назначить права доступа и обработку из кода.
Похожие рабочие процессы можно создавать наследованием от основного процесса.
Сложная фильтрация из кода
Мы считаем, что пользователь должен видеть в списках только то, что может реально выбрать. Если пользователь выбирает сперва отдел, потом сотрудника, то в выпадающем списке он видит только сотрудников выбранного отдела. А если сперва сотрудника, то отдел он вообще может не выбирать, он должен заполниться автоматически.
Вы можете задать сколь угодно сложное поведение фильтров на полях форм. При этом, если у пользователя останется для выбора единственное значение, то система выберет это значение самостоятельно.
Разработка деревьев навигации, кнопок и контекстных меню
Разработка действий (кнопок)
Кнопка — это класс, указывающий месторасположение, входящие параметры и доступные действия (всё вместе это называется контекст)
Например, кнопка на гриде имеет доступ до выделенных записей грида, всех записей грида и т.п.
Кнопка на форме — до текущего элемента сущности, отображаемого на форме. Пример кнопки:
- ///<summary>
- /// Копировать
- /// Кнопка копирует значение SysName в поле Name и переводит его в верхний регистр
- ///</summary>
- [Icon(ExtIcon.Edit)]
- [Id(«236B2DB4-ABF9-43BA-B95E-9CB8BA55AB67″)]
- public class SimpleAction : IAction<IFormContext<SomeEntity>>
- {
- public void Execute(IFormContext<SomeEntity> context)
- {
- var item = context.Item;
- item.Name = item.SysName.ToUpper();
- context.ShowMsgBox(«Выполнили изменение поля Name»);
- context.Refresh();
- }
- }
Кнопки могут декларативно (через атрибут) и программно (реализация интерфейса) конфигурироваться. Могут задаваться статические и динамические доступности/видимости/наименования и иконки.