Общие сведения
Надёжность и безопасность
Покупка лицензии
Начало работы
Роли в системе
Проекты
Концепции
Компоненты
Инструкции
Задачи
Финансы
Ресурсы
Таймшиты
Клиенты
Вики
Затраты
Отчёты и аналитика
FAQ
Типы отчётов
Использование отчётов
Группировка данных источника
Группировка данных в отчёте
Типы виджетов
Общие отчёты и шаблоны
Настройка отчёта
Экспорт отчётов
Пользовательские настройки отчёта
Вычисляемые поля
Выражения вычисляемых полей
Особые колонки отчётов с временными рядами
Использование панелей мониторинга
Публикация панелей
Фильтры источников данных
Настройка и администрирование
Типовой порядок настройки системы
On-premises
API
История изменений
Термины и определения

Обзор и применение динамического кода

Обновлено: 13.03.2026

Примечание

Функция доступна по запросу в поддержку: support@timetta.com.

Важно

Компонента позволяет кастомизировать логику работы с данными:

  • предполагает понимание языка C# и структуры данных Timetta;
  • предназначена для прикладных разработчиков;
  • находится в стадии активного развития.

Если вам нужно переопределение логики, рекомендуем обратиться в поддержку support@timetta.com для платной консультации.

Назначение

Платформа предоставляет механизм динамического кода, позволяющий расширять стандартную логику системы.
Динамический код может выполняться в следующих сценариях:

  • Обработчики сущностей (Entity hooks) — переопределение логики операций CRUD и событий жизненного цикла;
  • Задания по расписанию (Scheduled jobs) — выполнение пользовательского кода по расписанию;
  • Роли жизненного цикла (Lifecycle roles) — вычисление ролей, участвующих в переходах жизненного цикла и логике workflow.

Все эти сценарии используют единый базовый контекст — DynamicCodeContext.

Ограничения динамического кода

Динамический код компилируется и выполняется не как обычный проект C#, а в ограниченном окружении.

Это означает, что в обработчиках, резолверах ролей и заданиях по расписанию доступно только разрешённое подмножество API платформы и .NET.

Что разрешено

В динамическом коде можно:

  • объявлять классы и реализовывать требуемые интерфейсы платформы;

  • использовать базовые типы .NET:

    • System;
    • System.Collections.Generic;
    • System.Linq;
    • System.Linq.Expressions;
    • System.Threading.Tasks;
    • System.Text.Json;
  • выполнять асинхронный код через async/await;

  • использовать API контекста:

    • GetEntityService;
    • GetLifecycleService;
    • GetNotificationService;
    • GetHttpClient;
    • Log;
    • другие методы DynamicCodeContext.

Что запрещено

  • нельзя объявлять using;
  • нельзя объявлять namespace;
  • нельзя использовать произвольные API .NET. Динамический код должен использовать только доступные платформенные API и разрешённые сборки. Не следует рассчитывать, что любой тип из .NET будет доступен при компиляции.

Дополнительные ограничения безопасности

В платформе предусмотрен механизм проверки запрещённых API. Даже если часть проверок сейчас не применяется на этапе компиляции, на динамический код распространяются ограничения по архитектуре и безопасности.

При публикации код проходит проверку ИИ-агентом для предотвращения системных ошибок.

Ограничения на сложность кода

Динамический код должен оставаться компактным и предсказуемым. Следующие конструкции не рекомендуются и могут не скомпилироваться:

  • слишком большие методы;
  • сложная вложенная логика;
  • большое количество циклов;
  • глубокая вложенность циклов;
  • рекурсия;
  • искусственные задержки (Task.Delay).

На практике это означает, что динамический код должен содержать простую прикладную логику, а не сложные вычислительные алгоритмы.

Рекомендации

Хороший динамический код:

  • решает одну прикладную задачу;
  • использует API платформы, а не низкоуровневые .NET API;
  • не использует собственную инфраструктурную многопоточность;
  • остаётся коротким и читаемым.

Итого

Динамический код — это не полноценная замена обычной серверной разработки, а механизм для безопасного расширения бизнес-логики платформы.

Подходящие сценарии:

  • проверить данные;
  • изменить поля сущности;
  • выбрать связанные записи;
  • отправить уведомление;
  • вызвать внешний HTTP API через GetHttpClient().

Неподходящие сценарии:

  • работа с файлами;
  • запуск потоков;
  • использование рефлексии;
  • произвольные сетевые подключения;
  • сложные долгие вычисления.

Содержание

Назначение Ограничения динамического кода Что разрешено Что запрещено Дополнительные ограничения безопасности Ограничения на сложность кода Рекомендации Итого
Ничего не найдено

Перейти на русскую версию?