Добрый день! Уверен данный пример вас полностью устроит
см. коментарии
и перед прочтением кода
см. администрирование системы\ системные справочники\пороцедуры
см. администрирование системы\ системные справочники\процессы
см. администрирование системы\ системные справочники\текущие действия процессов
внимательно на базовые типы справочников их группы параметров(перекликаются с api) и связи с действиями
т.к справка по api для процедур отсутствует
этот макрос используется в процедуре "проведение ИИ" по сути не важно на каком этапе его вставить в схему, так как он смотрит запущенные процесс и прикрепленные к нему документы
Удачи!
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using TFlex.DOCs.Model.Macros;
using TFlex.DOCs.Model.Macros.ObjectModel;
using TFlex.DOCs.Model.References.ActiveAction; //обязательно объявлять
using TFlex.DOCs.Model.References.ActiveActions; //обязательно объявлять
using TFlex.DOCs.Model.Processes.Events.Contexts; //обязательно объявлять, базовый класс для управления процессами
using TFlex.DOCs.Model.Processes.Events.Contexts.Data; //обязательно объявлять
using TFlex.DOCs.Model.References;
using TFlex.DOCs.Model.References.Procedures; //обязательно объявлять
using TFlex.DOCs.Model.References.Nomenclature.ModificationNotices;
using System.Text;
using System.IO;
public class Macro : MacroProvider
{
public Macro(MacroContext context)
: base(context)
{
}
private EventContext КонтекстСобытияБП //инициализируем данные процесса
{
get; set;
}
private StateObject Этап //инициализируем //инициализируем данные процесса
{
get; set;
}
private StateContextData ДанныеЭтапа //инициализируем данные процесса
{
get; set;
}
private ActiveActionData ДанныеТекущегоДействия //инициализируем данные процесса
{
get; set;
}
private ActiveActionReferenceObject ТекущееДействие //инициализируем данные процесса
{
get; set;
}
private ReferenceObject[] ОсновныеОбъекты // вспомогательные переменные для хранения интересующих вас объектов
{
get; set;
}
private ReferenceObject[] ВспомогательныеОбъекты
{
get; set;
}
public override void Run()
{
КонтекстСобытияБП = Context as EventContext;//контекст событий по БизнесПроцессу
if (КонтекстСобытияБП != null)
// получение списка объектов из процесса
{
ДанныеЭтапа= КонтекстСобытияБП.Data as StateContextData;
Этап = ДанныеЭтапа.State;
ТекущееДействие = ДанныеЭтапа.ActiveAction;
ДанныеТекущегоДействия = ТекущееДействие.GetData<ActiveActionData>();
ОсновныеОбъекты = ДанныеТекущегоДействия.GetReferenceObjects().ToArray(); // список объектов(указанных при запуске) вашего процесса.
// Конец
List<ReferenceObject> nomenclatureObjects = new List<ReferenceObject>();
List<ReferenceObject> undoCheckOutObjects = new List<ReferenceObject>();
bool needcheckIn = false;
foreach (ModificationNoticeWithActionsReferenceObject ro in ОсновныеОбъекты.OfType<ModificationNoticeWithActionsReferenceObject >())
foreach (ActionReferenceObject action in ro.ActionObjects)
{
try
{
if (action.Apply(out needcheckIn))
{
if (needcheckIn)
{
ReferenceObject changingObject = action.GetChangingObject();
if (!nomenclatureObjects.Contains(changingObject))
nomenclatureObjects.Add(changingObject);
}
}
else
if (needcheckIn)
{
ReferenceObject changingObject = action.GetChangingObject();
if (!undoCheckOutObjects.Contains(changingObject))
undoCheckOutObjects.Add(changingObject);
}
}
catch (Exception e)
{
TFlex.DOCs.Model.Processes.Objects.ExceptionManager.RegisterException(e);
if (needcheckIn && action != null)
{
ReferenceObject changingObject = action.GetChangingObject();
if (!undoCheckOutObjects.Contains(changingObject))
undoCheckOutObjects.Add(changingObject);
}
}
}
TFlex.DOCs.Model.Desktop.Desktop.CheckIn(nomenclatureObjects, "Выполнение автоматических действий", false);
TFlex.DOCs.Model.Desktop.Desktop.UndoCheckOut(undoCheckOutObjects.Where(o=>o!=null && o.CanUndoCheckOut));
}
}
}