Примеры запросов Citeck Records

Пример работы с рекордами из javascript

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

let rec = Records.get('emodel/person@someuser'); // пользователь или группа, которого(ую) нужно добавить в группу
rec.att('att_add_authorityGroups', 'emodel/authority-group@accountant'); // группа, в которую нужно добавить
rec.save();

Удаление пользователя или группы из группы

let rec = Records.get('emodel/person@someuser'); // пользователь или группа, которого(ую) нужно удалить из группы
rec.att('att_rem_authorityGroups', 'emodel/authority-group@accountant'); // группа, из которой нужно удалить
rec.save();

Проверка вхождения пользователя или группы в группу

Проверка вхождения текущего пользователя в группу:

await Citeck.Records.get('emodel/person@CURRENT').load('authorities._has.GROUP_ECOS_ADMINISTRATORS?bool!')

Проверка вхождения конкретного пользователя в группу:

await Citeck.Records.get('emodel/person@someuser').load('authorities._has.GROUP_testers?bool!')

Проверка вхождения группы в группу пока не поддерживается.

Получение списка assignee (authority, реципиентов) из роли документа

await Citeck.Records.get('emodel/sd-request-type@you-doc').load('_roles.assigneesOf.impl-first-line-role[]?str', true)

Диагностика вычисления ролей

Проверить, кто вычислен в роль, можно через атрибут _roles.assigneesOf:

// Проверить, кто вычислен в роль
await Records.get('emodel/your-type@doc-id').load('_roles.assigneesOf.myRole[]?raw')

Если роль вычисляется на основе ассоциации, можно сравнить содержимое ассоциации с результатом вычисления роли для диагностики:

// Загрузить содержимое ассоциации и результат вычисления роли одновременно
await Records.get('emodel/your-type@doc-id').load([
  'myAssocAttr[]?raw',
  '_roles.assigneesOf.myRole[]?raw'
])

Загрузка идентификаторов из ассоциаций: .id и ?id

При работе с ассоциациями в системе важно понимать разницу между способами получения идентификатора:

Атрибут .id — возвращает часть ссылки после @ (localId):

// emodel/person@ivan.petrov → "ivan.petrov"
// emodel/authority-group@accountant → "accountant"
document.load('myAssoc.id')

Скаляр ?id — возвращает полную ссылку на сущность:

// → "emodel/person@ivan.petrov"
// → "emodel/authority-group@accountant"
document.load('myAssoc?id')

Важно

Для передачи ссылок в другие ассоциации используйте полные ссылки через ?id.

Поиск записей и их изменение в цикле

var typeId = 'deal';

var typeRef = "emodel/type@" + typeId;

var sourceId = await Records.get(typeRef).load('sourceId');
var queryResult = await Records.query({
    sourceId,
    query: { t: 'eq', att: '_type', val: typeRef },
    language: 'predicate',
    page: { maxItems: 4000 }
});
var records = queryResult.records;

console.log("Found " + records.length);

var newStatus = 'old';
for (let i = 0; i < records.length; i++) {
    let record = Records.get(records[i]);
    let currentStatus = await record.load('_status?str', true);
    if (currentStatus == 'new') {
        console.log('change status for ' + record.id + " from " + currentStatus + " to " + newStatus);
        record.att('_status', newStatus);
        await record.save();
    }
}

Здесь скрипт ищет объекты (max = 4000) с типом данным deal и статусом new, и меняет статус на old (такие статусы должны быть заданы для типа deal).

Получение значения из конфига (ecos config)

Citeck.Records.get('eapps/meta@').load('$cfg.service-desk-groups')
// либо
Citeck.Records.get('eapps/cfg@service-desk-groups').load('value')

Скоуп нужен если цель — вытащить из одного микросервиса конфиг, который определён в другом микросервисе

Получение разных локализованных значений у атрибута Статус (_status)

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('_status._disp?json', true)

Ответ:

{
    "ru": "Новый",
    "en": "New"
}

Либо можно получить значение на конкретном языке:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('_status._disp.en', true)

Проверка, существует ли конкретный record

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('_notExists?bool!', true)

Проверить, что record это подтип определенного типа

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('_type.isSubTypeOf.case?bool!', true)

Проверка прав доступа к записи

// Проверка права на чтение
await Citeck.Records.get('emodel/ecos-contract@you-doc').load('permissions._has.Read?bool!', true)

// Проверка права на запись
await Citeck.Records.get('emodel/ecos-contract@you-doc').load('permissions._has.Write?bool!', true)

// Проверка кастомного права
await Citeck.Records.get('emodel/ecos-contract@you-doc').load('permissions._has.bpmn-process-instance-read?bool!', true)

Проверка связи между микросервисами, notifications -> eproc -> uiserv

await Citeck.Records.get('notifications/meta@').load('rec.eproc/meta@.rec.uiserv/meta@.time', true)

Получение атрибутов напрямую через ассоциацию

У объекта контракт, получаем контрагента и у него ИНН, дату создания и отображаемое имя:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('counterparty{?disp,inn,_created}', true)

Пример ответа:

{
    "?disp": "ООО Стальпром",
    "inn": "111111111111",
    "_created": "2023-08-03T09:28:49.071Z"
}

Если ассоциация множественная, то можно получить атрибуты всех объектов:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('payments[]{plannedPaymentDate,amount?num}', true)

Пример ответа:

[
    {
        "plannedPaymentDate": "2025-02-10T00:00:00Z",
        "amount": 1000
    },
    {
        "plannedPaymentDate": "2025-02-20T00:00:00Z",
        "amount": 10500
    }
]

Если ассоциация множественная и нужно получить атрибуты только первого объекта:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load('payments{plannedPaymentDate,amount?num}', true)

Пример ответа:

{
  "plannedPaymentDate": "2025-02-10T00:00:00Z",
  "amount": 1000
}

Получение нескольких атрибутов вместе c вложенными атрибутами

Получить несколько атрибутов вместе с атрибутами из ассоциации:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load(['?disp', 'payments[]{plannedPaymentDate,amount?num}'], true)

Пример ответа:

{
  "?disp": "Договор №16808",
  "payments[]{plannedPaymentDate,amount?num}": [
    {
      "plannedPaymentDate": "2025-02-10T00:00:00Z",
      "amount": 1000
    },
    {
      "plannedPaymentDate": "2025-02-20T00:00:00Z",
      "amount": 10500
    }
  ]
}

Так же можно задать имена получаемых атрибутов:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load({'contractName': '?disp', 'payments': 'payments[]{plannedPaymentDate,amount?num}'}, true)

Пример ответа:

{
  "contractName": "Договор №16808",
  "payments": [
    {
      "plannedPaymentDate": "2025-02-10T00:00:00Z",
      "amount": 1000
    },
    {
      "plannedPaymentDate": "2025-02-20T00:00:00Z",
      "amount": 10500
    }
  ]
}

Получать вложенные атрибуты можно не только у ассоциаций, но и у всех атрибутов, которые представляют собой объекты, например, у атрибута _content:

await Citeck.Records.get('emodel/ecos-contract@you-doc').load({'name': '?disp', 'content': '_content{size,mimeType}'}, true)

Пример ответа:

{
  "name": "Договор №16808",
  "content": {
    "size": "248446",
    "mimeType": "application/pdf"
  }
}

Работа с файлами

Работа с файлами из UI возможна либо через загрузку контента в виде base64 строки, либо через получение ссылки для скачивания.
Скрипт получает контент файла в виде base64 строки из атрибута _content:

await Records.get('emodel/ecos-contract@3a4e11cf-4227-44f4-98dd-1eeefba30e28').load('_content.bytes')

Скрипт получает ссылку для скачивания файла из атрибута _content:

await Records.get('emodel/ecos-contract@3a4e11cf-4227-44f4-98dd-1eeefba30e28').load('_content.url')

Можно загрузить файл в виде formData по адресу:

/gateway/emodel/api/ecos/webapp/content

или через base64 (подходит только для небольших файлов).

Старт бизнес-процесса для документа

let rec = Records.get('eproc/bpmn-proc@some-process-id'); // id процесса
rec.att('action', 'START');
rec.att('document', 'emodel/contract@0b54aed0-d288-4d29-aec3-c1ff37cfa089'); // Документ, для которого стартуем процесс
rec.save();