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

Обработчик событий сущностей

Обновлено: 06.05.2025

Примечание

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

Важно

Компонента предназначена для кастомизации логики работы с данными. Предполагает понимание языка C# и структуры данных Timetta. Предназначена только для прикладных разработчиков. Находится в стадии активного развития. Если вам требуется переопределение логики, то рекомендуется обратиться в поддержку support@timetta.com для платной консультации.

Назначение и общая логика

Основные сценарии применения:

  • исходящие интеграции (отправить проект в 1С);
  • манипуляция данными (предварительно заполнить свойства, выполнить проверки);
  • взаимодействие с пользователями (отправить уведомление, поставить задачу на выполнение).

Обработчик представляет собой класс на C# для каждого типа сущности. В классе доступны четыре переопределяемых метода (хука):

  • BeforeUpsert — вызывается до операции вставки или обновления сущности. Предназначен для выполнения базовых проверок сущности. Имеет detachedEntity.
  • AfterUpsert — вызывается после операции вставки или обновления сущности. Предназначен для добавления бизнес-логики — предзаполнение свойств, добавление исходящих интеграций и пр. Имеет contextEntity и detachedEntity.
  • BeforeDelete — вызывается до удаления сущности. Имеет detachedEntity.
  • AfterDelete — вызывается до удаления сущности. Имеет contextEntity.

В методы передаются параметры:

  • context — контекст обработчика, представляет собой SDK для ограниченной работы с приложением.
  • detachedEntity — сущность, переданная через API (пользователем).
  • contextEntity — сущность, извлеченная из БД для обновления (в момент вставки идентична detachedEntity).

Доступ к обработчику

Примечание

Для доступа требуются права на гранулу Настройки менеджера объектов.

Для изменения обработчика перейдите в компоненту Менеджер сущностей, найдите требуемую сущность и перейдите на вкладку Обработчик:

CustomHooksContext

Объект предоставляет доступ к базовому API системы:


public interface DynamicCodeContext
{
    /// <summary>
    /// Gets Entity service instance.
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public IContextEntityService<TEntity> GetEntityService<TEntity>();

    /// <summary>
    /// Logs message.
    /// </summary>
    public void Log(string msg);
}
public interface IContextEntityService<TEntity>
    where TEntity : Entity
{
    /// <summary>
    /// Inserts detached entity into context.
    /// </summary>
    /// <param name="detachedEntity">New detached entity.</param>
    /// <param name="checkRights">Determines whether to check the current user's permissions.</param>
    /// <returns>Inserted context entity.</returns>
    Task<TEntity> InsertAsync(TEntity detachedEntity, bool checkRights = true);

    /// <summary>
    /// Updates existing entity in context by detached entity.
    /// </summary>
    /// <param name="detachedEntity">Detached entity.</param>
    /// <param name="checkRights">Determines whether to check the current user's permissions.</param>
    /// <returns>Updated context entity.</returns>
    Task<TEntity> UpdateAsync(TEntity detachedEntity, bool checkRights = true);

    /// <summary>
    /// Deletes context entity.
    /// </summary>
    /// <param name="entityId">Entity Id.</param>
    /// <param name="checkRights">Determines whether to check the current user's permissions.</param>
    /// <returns></returns>
    Task<TEntity> DeleteAsync(Guid entityId, bool checkRights = true);

    /// <summary>
    /// Gets context entity.
    /// </summary>
    /// <param name="entityId">Entity Id.</param>
    /// <param name="checkRights">Determines whether to check the current user's permissions.</param>
    /// <returns>Context entity</returns>
    Task<TEntity> GetAsync(Guid entityId, bool checkRights = true);

    /// <summary>
    /// Get Non Tracking IQueryable to context filtered by condition.
    /// </summary>
    /// <param name="condition">Predicate to filter.</param>
    /// <param name="checkRights">Determines whether to check the current user's permissions.</param>
    /// <returns>Context entity</returns>
    IQueryable<TEntity> Get(
        Expression<Func<TEntity, bool>> condition = null,
        bool checkRights = true
    );
}

Пример исходящего HTTP-вызова

    public override async Task AfterUpsert(CustomHooksContext context, Activity contextEntity, Activity detachedEntity) 
    {
        const string url = "https://api.timetta.com/odata";
        const string token = "***";

        using var httClient = new HttpClient();
        httClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

        var newActivity = new { Name = "New Activity" };
        var payload = JsonContent.Create(newActivity);
            
        var response = await httClient.PostAsync($"{url}/Activities", payload);
        var responseContent = await response.Content.ReadFromJsonAsync<JsonElement>();

        var idOfCreatedEntity = responseContent.GetProperty("id").GetGuid();
        
    }

Содержание

Назначение и общая логика Доступ к обработчику CustomHooksContext Пример исходящего HTTP-вызова
Ничего не найдено

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