Руководство прикладника по разработке
Документ для тех, кто пишет прикладную логику на платформе: модули, события, формы, справочники, меню, HTTP/SQL и обновления приложений.
Цель руководства: чтобы можно было без захода в исходники Win32 начать и
довести до рабочего флоу изменения в приложении.
Быстрый вход для новых приложений
- Выгрузить текущее приложение в архив:
python3 docs/downloads/tma_app_archive.py export-db \
--database suvr_new \
--output suvr_new.tma-source.zip
- Распаковать архив:
python3 docs/downloads/tma_app_archive.py unpack \
--input suvr_new.tma-source.zip \
--output suvr_new-source
-
Редактировать файлы
module.xml,form.xml,program.pas, триггеры. -
Проверить структуру:
python3 docs/downloads/tma_app_archive.py verify --input suvr_new-source
- Собрать XML обновления:
python3 docs/downloads/tma_app_archive.py pack \
--input suvr_new-source \
--output suvr_new-update.xml
- Загрузить в приложение через меню.
Где учиться дальше
- Модель приложения и модулей
- Скриптовый API и функции
- Формы и справочники
- Кастомная боковая навигация (SideMenu)
- Выгрузка/загрузка исходников и частичные обновления
Быстрые правила для прикладника
- Не смешивайте режимы кодировок: XML и cp1251 — это legacy кодовая база,
но для удобства редактирования берите UTF-8 в скриптах и репозитории
(конвертируется через
tma_app_archive.py). - Имена обработчиков всегда привязаны к объектам из
module.xml: Name="SaveBtn"у кнопки →OnSaveBtnClickName="Refresh",OnClickуже не нужен, движок добавляетOnRefreshClick- Для пунктов меню используйте
Command: Command="OnOpenCardClick"илиCommand="OpenCard"- если без
Command, платформа строитOn<name>Clickсама - Любой изменённый модуль должен проходить проверку через
verifyи только потом черезpack. - Критично: если в XML-структуре меню вы потеряли корневой элемент, приложение перестаёт определять обработчики и падает на инициализации.
Что важно понимать о runtime и отладке
- Временный баг в логике (непойманное исключение) обычно останавливает сценарий целиком и показывает popup/trace из движка.
- Для HTTP/внешних вызовов всегда проверяйте статусный код, не только текст тела ответа.
- В SQL и скриптах для отладки полезны:
- запись в лог через
Warning/Raise(проверьте, какие системные функции доступны в вашем окружении; для плагинных сборок это может отличаться), - временные таблицы для проверки промежуточных значений.
Карта задач по задачнику прикладника
- Добавить новый справочник:
- создать
Table(метаданные),FormиReference. - проставить
PrimaryKeyField,DescriptionField,Parentдля справочника. -
завести события и триггеры по нуждам.
-
Добавить новый пункт меню:
- править
MainMenu, указываяCommand. -
либо
Name, либоCommandдолжны совпадать с обработчиком. -
Изменить бизнес-логику существующего процесса:
- править
Programмодуля или модульные скрипты, - собрать частичный архив для конкретных модулей,
-
собрать и загрузить через
pack-db. -
Перенос на headless/web:
- использовать тот же XML-модельный контракт,
- запускать сервер и прогонять
smokeпо формам/справочникам.
Набор источников, которые нужно держать под рукой
docs/development/source-archive.md— как экспортировать и собирать архив.docs/development/application-model.md— что внутриmodule.xmlиform.xml.docs/development/runtime-api.md— все практичные функции для скриптов.docs/development/sidemenu-component.md— объектная модельSideMenu.docs/development/forms-references.md— формы, таблицы, справочники.
Полный рабочий конвейер изменений
1) Подготовка исходников
- Определи задачу и минимальный список модулей, которые меняются.
- Проверь, какие модули реально участвуют (например,
Table,Reference,Form, иногда триггерыbefore_*,after_*иStored). - Если меняются только отдельные модули — делай выборочную выгрузку, а не полный export для ускорения.
Рекомендуемый порядок:
# Полная выгрузка
python3 docs/downloads/tma_app_archive.py export-db --database my1 --output app.tma-source.zip
# Выборочная выгрузка только нужных модулей
python3 docs/downloads/tma_app_archive.py export-db --database my1 --module task --module taskForm --module taskReference --output task-pack.tma-source.zip
2) Редактирование и единообразие
- Не трогай одновременно один и тот же объект в двух модулях (например
Referenceи связанный с нимTable) без необходимости. - Если редактируешь
MainMenu— поддерживай один источник истины:Item Command,Name,Caption, иерархию. Дублирование веток в нескольких файлах почти всегда приводит к «схлопыванию» и некорректным обработчикам. - Для больших изменений делай правки в порядке:
module.xml→program.pas→form.xml.
3) Проверки перед сборкой
python3 docs/downloads/tma_app_archive.py verify --input unpacked-dir
Что проверять до pack:
Moduleуникальность имён по типу.- Корректность
ParentдляReference/Form. - Наличие и валидность
Nameу элементов интерфейса. - Отсутствие невалидных ссылок на таблицы и поля (
DataType="*Table"). - Формат команд:
OnXClickдля кнопок и меню, если событие в Pascal используется.
4) Сборка и нагрузка в тестовую БД
- Для частичных изменений делай
pack-db, чтобы не потерять общие секции приложения:
python3 docs/downloads/tma_app_archive.py pack-db --database my1 --input task-pack --output task-update.xml
- Загрузи обновление в тестовый стенд/БД и только после проверки — в прод.
5) Приёмка после изменения
Минимальный smoke:
- Открыть главное меню.
- Открыть измененный справочник/форму.
- Проверить создание/изменение/сохранение записи.
- Проверить закрытие формы и перезапуск окна после ошибки.
- Проверить сетевые/HTTP сценарии с явной проверкой
StatusCode.
Чек-лист для форм и справочников
Для Form и Reference держи этот список как обязательный:
Parentуказывает на корректнуюTable.- У таблицы есть
PrimaryKeyFieldиDescriptionField. Permissions(Select/Insert/Update/Delete) разрешены роли пользователя.- Имена контролов уникальны.
- Ключевые lookup-поля (
DataType="*Table") указывают на существующие таблицы. - Обработчики событий объявлены в
program.pasс точной сигнатурой (Procedure). - Проверены
Filter/ExtFilter/ResultFilterна конфликты. - Для действий по кнопкам:
On<Имя>Clickреально существует.
Частые ошибки и быстрые причины
SideMenu.Command: ... не найден:Commandне указан или опечатка.- Обработчик не объявлен как
Procedure OnXClick. CommandиNameне согласованы с тем, что реально ожидает скрипт.Неверный тип поля / пустая форма:- неправильный
Parentили расхождениеDataType. Форма открывается, но не сохраняется:- используется
transaction/SQL сценарий с исключением вTry/Except; - отсутствует фактический
Apply. Ошибки при импорте/выгрузке:- есть конфликт кодировок при ручном редактировании legacy-пакета;
- невалидный XML или битая структура
module.xml.
Типовые шаблоны кода (Pascal)
1) Проверить создание и применить запись
Procedure OnSaveClick;
Begin
If Trim(Form.Item('Header').Text) = '' Then
Raise('Тема должна быть заполнена');
Form.Apply;
Form.Close;
End;
2) Безопасный HTTP вызов
Procedure SendDoc;
Var r : Record;
Begin
r = HttpPostEx('https://api.internal.local/send', payload, headers);
If Not r.Ok Then
Raise('HTTP_' + r.StatusCode);
End;
3) Защищенный SQL-сценарий
Procedure OnCreate;
Var sqlText : String;
Begin
sqlText = 'Select * From task Where project_id = ' + SqlArg_i(projectId);
Query(sqlText);
End;
Протоколирование и диагностика
- Используй
Warning(...)для трассировки шагов в UI-трассах. - Для критичных ошибок —
Raiseс коротким кодом и контекстом: Raise('ERR_SAVE_FAILED: ' + GetExceptionText()).- Для отладки больших ветвей лучше добавлять минимальные маркеры в начале ветвления и фиксировать вход/выход.
Рекомендации по подготовке релизного архива
- Для изменений, которые затрагивают только одну бизнес-секцию, используй
pack-db, чтобы исключить риск перезаписать нецелевые модули. - Перед финальной загрузкой:
- снять дамп/экспорт текущего состояния;
- проверить
packи размер итогового файла; - зафиксировать ticket/задачу и список изменённых модулей.
Что читать после этого
- application-model.md — глубже про структуру XML.
- runtime-api.md — что делать в коде.
- forms-references.md — как чинить UI и dataset-поведение.
- source-archive.md — как собирать и доставлять обновления.
- headless-web-runtime.md — что будет в следующем релизе.