Как регистрировать документ

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

Регистрация элемента приложения

Рассмотрим, как в рамках пользовательского сценария можно выполнить регистрацию документа во всех делах, настроенных для приложения. Чтобы это сделать, необходимо получить идентификаторы всех дел, в которых можно зарегистрировать элемент данного приложения. Сначала получим элемент приложения. Это можно сделать либо через контекст, либо с помощью глобальных констант Global или Namespace.

Пример того, как получить элемент приложения из контекста:

// Получение элемента через контекст
const agreement = Context.data.agreement!;

Пример того, как найти элемент приложения с помощью Global:

// Получение элемента через поиск
const agreement = Global.ns.documents.app.agreement.search().first();

Для регистрации элемента приложения в пользовательском сценарии требуется передать идентификатор дела в метод DocflowApplicationItemRef.register. Идентификатор дела можно получить из RegistrationSettings.nomenclatureIds. В данном свойстве хранятся все дела, доступные для элемента приложения. Получим список доступных дел для элемента, полученного в примере выше:

// Получение настроек
const settings = await agreement.getSettings();

// Получение идентификаторов дел
// В дальнейшем их можно использовать для регистрации
const registrationIds = settings.registrationSettings.nomenclatureIds;

Затем извлеченные идентификаторы можно использовать для регистрации документа во всех делах:

// Элемент приложения регистрируется во всех делах
const registrations = registrationIds.map(registerId => agreement.docflow().register(nomenclatureId))
// Ожидание завершения всех регистраций
const registrationsResult = await Promise.all(registrations);

// Проверка, что все регистрации завершены успешно
const allRegistrationsComplited = registrationsResult.every(registrationResult => registrationResult);
if (!allRegistrationsComplited) {
    // Если не все регистрации завершены успешно, выполнение прерывается
    throw new Error('Документ не зарегистрирован');
}

Регистрация с резервированием номера

В компании может существовать порядок присвоения регистрационных номеров, который не совпадает с порядком регистрации документов в пользовательском сценарии или бизнес-процессе. В таких случаях можно использовать резервирование номеров. Чтобы зарезервировать номер для документа до его непосредственной регистрации, используется метод DocflowApplicationItemRef.reserve. Результатом выполнения процедуры является зарезервированный для элемента приложения номер.

Резервирование отменяется методом DocflowApplicationItemRef.deleteReservation.

Ниже представлен пример, который иллюстрирует применение методов для резервирования номера и отмены резервирования:

// Приложение, хранимое в контексте
const item = Context.data.document!;
// Получение настроек приложения
const settings = await item.getSettings();
const nomenclatures = [];

// Получение информации о делах, для которых доступна регистрация в приложении
for (const nomenclatureId of settings.registrationSettings.nomenclatureIds) {
    const nomenclature = await item.docflow().getNomenclature(nomenclatureId);
    if (nomenclature !== undefined) {
        nomenclatures.push(nomenclature);
    }
}

// Поиск нужного дела для резервирования номера
const nomenclatureName = 'Название нужного дела';
const nomenclatureForReservation = nomenclatures.find(nom => nom.name === nomenclatureName);

if (nomenclatureForReservation !== undefined) {
    // Если дело для резервирования найдено, выполняем резервирование номера для элемента приложения
    const reservedNumber = await item.docflow().reserve(nomenclatureForReservation.__id);
}