logo

Регистрация документа в сценарии

В данной статье рассмотрен сценарий для регистрации созданного ранее документа.
Предварительно необходимо в веб-части в разделе Администрирование – Документооборот – Варианты регистрации документов создать вариант регистрации, в котором необходимо указать его название, тип регистрируемого документа, документопоток, место регистрации и дело. Этот вариант регистрации будет использоваться в сценарии.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
Контекстные переменные:

context.Dokument – переменная типа Документ, который нужно зарегистрировать;
context.VariantRegistracii – переменная типа Вариант регистрации;
context.Delo – переменная типа Дело.

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

1
using EleWise.ELMA.API;

Текст сценария:

1
2
PublicAPI.Docflow.Document.Register(context.Dokument, context.VariantRegistracii);
PublicAPI.Docflow.Document.Register(context.Dokument, context.Delo , PublicAPI.Enums.Documents.DocumentFlowType.Incoming); //DocumentFlowType.Incoming - документопоток входящие

Определить UID для DepositoryGroup можно с помощью следующего запроса в БД:

1
select [GroupUid] from [DepositoryGroup] where [Name] = ’Наименование_дела’

Данный запрос можно выполнить в СУБД (например, в MS SQL Server Management Studio для версии ELMA Standart или в IBExpert для версии ELMA Express).
При невозможности использования СУБД, результат запроса можно посмотреть в самой ELMA. Для этого необходимо создать новый отчет и  использовать в нем приведенный выше запрос. На макет отчета (в FastReport) следует переместить поле GroupUid и запустить отладку. На странице отчета Вы увидите искомый Uid.
Альтернативный способ определения GroupUid:

  • зайти на страницу нужного дела в веб-части (Администрирование - Документооборот - Номенклатура), в котором следует регистрировать документ, и выяснить его id (поле в карточке);
  • в отдельном сценарии написать строку Console.WriteLine(DepositoryManager.Instance.Load(4).GroupUid.ToString()). Вместо числа 4 следует указать выясненный ранее id дела.

Запустите эмуляцию этого сценария: на консоли на странице эмуляции Вы увидите нужный Uid, скопируйте его в сценарий регистрации документа.

Пример сценария без использования PublicAPI

Используемые контекстные переменные:
context.Dok – хранит документ, подлежащий регистрации.

Для его корректной работы необходимо подключить сборки:

EleWise.ELMA.Documents;
EleWise.ELMA.Documents.Docflow;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using EleWise.ELMA.Documents.Managers;
using EleWise.ELMA.Documents.Models;
using EleWise.ELMA.Documents.Models.Nomenclature;
using EleWise.ELMA.Extensions;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Entities.EntityReferences;
using EleWise.ELMA.Model.Entities.ProcessContext;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Metadata;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.Services;
using EleWise.ELMA.Documents.Contracts.Models;
Текст сценария:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//определим тип сущности на основе типа документа.
//Вместо "DocType" необходимо ввести имя класса Вашего документа. Обратите внимание что в конструкции используется его интерфейс
var docType =  new ReferenceOnEntityType { TypeUid = InterfaceActivator.UID<IDokType>(false) };
//найдем вариант регистрации
var reg_variant = RegistrationVariantManager.Instance
    .Find(new InstanceOf<IRegistrationVariantFilter>(){New =
    {
        //укажем тип документопотока "Входящие"
        Docflow = DocumentFlowType.Incoming,
        //зададим тип документа
        DocumentType = docType,
        //укажем UID для DepositoryGroup. Как определить его значение описано ниже
        DepositoryGroupUid = new Guid("64AEC71A-D9F3-488E-8E4F-1AD47E31D373"),
        //зададим имя варианта регистрации
        Query = "Name = ’Вариант1’"
        }}.New, new FetchOptions(0, 1))
    .FirstOrDefault();
//если вариант регистрации не найден - выход из сценария
if (reg_variant == null) {
        Console.Write("Variant not found");
        return;
    }
//найдем дело
var depository = (IDepository)DepositoryGroupManager.Instance.GetByGroupUid(reg_variant.DepositoryGroupUid, true)
    .CastAsRealType();
//если дело не найдено - выход из сценария
if (depository == null)
    {
        Console.Write("Depository not found");
        return;
    }
//поиск типа РКК в опубликованной номенклатуре
var filter = InterfaceActivator.Create<INomenclatureCacheFilter>();
filter.Depository = depository;
filter.DocumentType = docType;
filter.Flow = reg_variant.Docflow;
filter.RegistrationPlace = reg_variant.RegistrationPlace;          
//если в опубликованной номенклатуре тип РКК не найден - выход из сценария
var cacheItem = NomenclatureCacheManager.Instance.Find(filter, FetchOptions.All).FirstOrDefault();
if (cacheItem == null)
    {
        Console.Write("Cache item not found");
        return;
    }
//создадим РКК найденного типа
var rkk = (IRegistrationCard)InterfaceActivator.Create(cacheItem.RegistrationCard.EntityType);
//запишем в нее регистрируемый документ
rkk.Document = context.Dok;
//укажем дело, в котором регистрируется документ
rkk.Depository = depository;
//укажем документопоток, в котором регистрируется документ (в данном случае "Входящие")
rkk.Flow = reg_variant.Docflow;
//укажем место регистрации
rkk.RegistrationPlace = reg_variant.RegistrationPlace;
//и укажем в РКК тип регистрируемого документа:
rkk.DocumentType = docType;         
context.Dok.RegistrationCard.Add((RegistrationCard)rkk);
rkk.Save();
//Сама регистрация. Внутри сгенерируется номер
RegistrationCardManager.Instance.Register(rkk, false, null);

Прикрепленные файлы