logo

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

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

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

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

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

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

using EleWise.ELMA.API;

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

PublicAPI.Docflow.Document.Register(context.Dokument, context.VariantRegistracii); //Регистрация документа по варианту регистрации
PublicAPI.Docflow.Document.Register(context.Dokument, context.Delo , PublicAPI.Enums.Documents.DocumentFlowType.Incoming); //Регистрация документа через дело и документопоток. DocumentFlowType.Incoming - документопоток "Входящие"

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

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

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

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

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

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;
Текст сценария:
//определим тип сущности на основе типа документа. 
//Вместо "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);

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

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, скопируйте его в сценарий регистрации документа.

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