.. _aspects: Аспекты ================ .. contents:: :depth: 3 **Аспект** — механизм расширения функционала :ref:`типа данных` без изменения самого типа. Аспект добавляет к сущностям дополнительные атрибуты, форму конфигурации и связанное поведение, при этом тип данных остаётся неизменным. Один и тот же аспект можно подключить к нескольким типам данных, что позволяет переиспользовать логику без дублирования. Аспект может быть добавлен к типу явно — через вкладку **Аспекты** в настройках типа, или автоматически — в зависимости от конфигурации. Атрибуты аспекта доступны через префикс в формате ``{prefix}:{attribute.id}``, что позволяет однозначно идентифицировать их в формах, журналах, конфигурациях действий и мутациях записей. В Citeck представлены системные аспекты для типовых задач: учёт времени, управление связями между документами, генерация штрихкода, конфигурация истории событий, импорт данных и обработка активностей. Журнал аспектов доступен по адресу: ``v2/journals?journalId=ecos-aspects&viewMode=table&ws=admin$workspace`` Модель аспекта -------------------------------- .. code-block:: text id: String // Идентификатор аспекта name: MLText // Имя аспекта (справочная информация) prefix: String // Префикс аспекта. Будет добавляться перед идентификатором каждого атрибута, которые описаны в attributes и systemAttributes configFormRef: EntityRef // Ссылка на форму, которую следует использовать для редактирования конфигурации аспекта в типе ECOS attributes: List // Атрибуты аспекта, которые будут добавлены к сущностям с данным аспектом systemAttributes: List // Системные атрибуты аспекта, которые будут добавлены к сущностям с данным аспектом. Системные атрибуты могут быть изменены только под пользователем system. В конфигурации типа предусмотрено поле ``aspects``, которое содержит список аспектов и их конфигурацию: .. code-block:: text TypeDef ... aspects: List ... TypeAspectDef ref: EntityRef // ссылка на аспект config: ObjectData // конфигурация аспекта API ---- Проверить наличие аспекта у сущности ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: javascript await Records.get('emodel/some-id@local-id').load('_aspects._has.aspectToTest?bool!') где, ``emodel/some-id@local-id`` - идентификатор сущности, у которой мы хотим проверить наличие аспекта ``aspectToTest`` - идентификатор аспекта, наличие которого мы проверяем Получить конфиг аспекта из сущности ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: javascript await Records.get('emodel/some-id@local-id').load('_type.aspectById.you-aspect-id.config') Добавить аспект к сущности ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: Добавление так же происходит автоматически, когда мы проставляем для сущности атрибут из аспекта .. code-block:: javascript var rec = Records.get('emodel/some-id@local-id'); rec.att('att_add__aspects', 'emodel/aspect@aspectToAdd'); await rec.save(); где, ``emodel/some-id@local-id`` - идентификатор сущности, к которой мы хотим добавить аспект ``aspectToAdd`` - идентификатор аспекта, который мы добавляем Удаление аспекта ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: javascript var rec = Records.get('emodel/some-id@local-id'); rec.att('att_rem__aspects', 'emodel/aspect@aspectToRemove'); await rec.save(); где, ``emodel/some-id@local-id`` - идентификатор сущности, у которой мы хотим удалить аспект ``aspectToRemove`` - идентификатор аспекта, который мы удаляем. :ref:`Пользовательское описание работы с аспектами `