Главная инженерная задача: Создать эргономичный графический интерфейс (UI), который берет на себя рутину форматирования и валидации, безопасно транслируя действия пользователя в атомарные изменения реляционной базы данных.
Прямой доступ пользовательского интерфейса к базе данных категорически запрещен в промышленных решениях.
Классическое разделение: View отображает интерфейс и ловит клики; Controller обрабатывает действия пользователя и обновляет Model; Model инкапсулирует бизнес-данные и уведомляет View об изменениях.
View полностью пассивен и изолирован за интерфейсом. Presenter берет на себя всю координацию взаимодействия и синхронизацию с моделью.
Стандарт современного веб- и настольного фронтенда. ViewModel хранит реактивное состояние формы, синхронизируясь через Data Binding.
Data Binding — программный механизм автоматической синхронизации свойств элементов графического интерфейса со структурами данных приложения.
Золотое правило архитектуры: UI связывается с DTO / ViewModel, а не с таблицами базы данных напрямую!
VARCHAR(n) или CHAR(n) фиксированной длины.CHECK (col ~ '^[0-9]+$').UI: +7 (922) 123-45-67 → DTO: "79221234567" → DB: client_phone VARCHAR(15)
Выпадающий список — основной элемент выбора связанных сущностей из справочников (связь «многие к одному»).
client_id INT).Value Member.<select>.LIMIT 20 при вводе от 3 символов.ENUM, VARCHAR(15) с предикатом CHECK (val IN (...)).BOOLEAN NOT NULL DEFAULT FALSE.checked конвертируется строго в TRUE или FALSE.min / max).DATE, TIMESTAMP, TIMESTAMPTZ.YYYY-MM-DD или YYYY-MM-DD"T"HH:mm:ss.Используется для оформления документов, содержащих заголовок и табличную часть спецификации (отношение 1:M).
Одиночные реквизиты документа: Номер, Дата оформления, Выбор контрагента (FK), Склад отгрузки (FK), Комментарий.
Динамический список строк спецификации: Выбор товара (FK Combobox), Количество (Number Input), Цена, Скидка, Расчетная сумма строки. Кнопки добавления и удаления строк.
Недопустимо сохранять строки спецификации отдельными несвязанными HTTP-запросами!
-- Серверный транзакционный блок сохранения заказа
BEGIN;
-- 1. Создание шапки заказа и получение сгенерированного ID
INSERT INTO orders (client_id, order_date, status)
VALUES (104, '2026-10-01', 'draft') RETURNING order_id;
-- 2. Вставка всех строк спецификации с привязкой к полученному order_id
INSERT INTO order_items (order_id, product_id, quantity, unit_price)
VALUES
(4812, 301, 5, 4500.00),
(4812, 814, 2, 18200.00);
-- 3. Если хотя бы одна позиция вызвала ошибку (CHECK/FK) — откат ВСЕГО заказа!
COMMIT;
required, JS-события blur, input).PRIMARY KEY, FOREIGN KEY, NOT NULL, CHECK, UNIQUE, EXCLUDE.Клавиша Tab перемещает фокус логично: сверху вниз, слева направо. Оператор должен уметь заполнить и отправить форму без использования мыши.
Обязательные поля помечаются видимой звездочкой. Необязательные поля не должны блокировать отправку формы.
Кнопка «Сохранить» блокируется (disabled) сразу после клика с показом спиннера, исключая дубликаты записей в БД.
Текст ошибки выводится прямо под проблемным полем с четким объяснением, как исправить введенное значение.
Запись наименования категории или имени клиента прямо в дочернюю таблицу вместо FK ID разрушает нормализацию и ломает реляционные связи.
Внедрение SQL в клиентский код приводит к критическим SQL-инъекциям и невозможности разграничения прав доступа.
Построчное несогласованное сохранение порождает в базе данных «зависшие» пустые шапки документов без строк спецификации.