Процесс и сценарии для очистки базы

В ходе внедрения системы, или какого-то процесса, генерируется много "мусорных" данных - экземпляры процессов, документы, папки, сообщения и т.д.

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

Важно!
Используйте представленные ниже сценарии и процесс с осторожностью, удаление объектов и прерывание процессов - необратимые операции. Используйте этот процесс на свой страх и риск. За последствия компания ELMA ответственности не несет.

 Процесс

 Процесс имеет три ветки:

  • поиск и архивирование документов;
  • поиск и прерывание процессов;
  • поиск и удаление папок.

 Процесс условно можно поделить на 4 шага:

  1. Выбор действия.
  2. Ввод параметров поиска.
  3. Просмотр списка найденных объектов.
  4. Подтверждение удаления.

1. Выбор действия

Необходимо выбрать ветку процесса

2. Ввод параметров поиска

Необходимо ввести параметры для поиска объектов. Для процессов это наименование экземпляра


3. Просмотр списка найденных объектов

4. Подтверждение удаления

 

В переменную "Процессы для прерывания" записываются наименования всех найденных по критериям процессов, в данном случае процесс один. После просмотра списка объектов, необходимо удалить их, либо вернуться на предыдущий шаг.


1. Выбор действия



Выбранные процессы были прерваны, процесс можно завершить или перейти на первую задачу выбора действия


Файл импорта этого процесс прикреплен к статье. Подробней о импорте-экспорте.

Сценарии

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

Важно!
Не рекомендуется вносить изменения в данные сценарии, или использовать их отдельно от основного процесса. Использование этих сценариев вне процесса предполагает наличие опыта в программировании и работы с ELMA

 Поиск документов, отправка в архив

		public void FindDocuments(Context context)
		{
			//создание фильтра
			var docFilter = InterfaceActivator.Create<DocumentFilter>();
			//если переменная не пустая - добавляем имя документа в фильтр
			if(context.ImyaDokumenta != null)
			{
				docFilter.Name = context.ImyaDokumenta;
			}
			//и папку
			if(context.Papka != null)
			{
				docFilter.Folder = context.Papka;
			}
			//и авторов
			if(context.Avtor != null)
			{
				foreach(var item in context.Avtor)
				{
					docFilter.CreationAuthor.Add((IUser)item);
				}
			}
			//находим документы по созданному фильтру
			var foundDocuments = DocumentManager.Instance.Find(docFilter, null);
			//записываем наименование найденных документов в переменную
			foreach(var item in foundDocuments)
			{
				context.DokumentyDlyaUdaleniya += item.Name + Environment.NewLine;
			}
		}
		
		public void ToArchiveDocuments(Context context)
		{
			//все аналогично предыдущему сценарию
			var docFilter = InterfaceActivator.Create<DocumentFilter>();
			if(context.ImyaDokumenta != null)
			{
				docFilter.Name = context.ImyaDokumenta;
			}

			if(context.Papka != null)
			{
				docFilter.Folder = context.Papka;
			}

			if(context.Avtor != null)
			{
				foreach(var item in context.Avtor)
				{
					docFilter.CreationAuthor.Add((IUser)item);
				}
			}
			var foundDocuments = DocumentManager.Instance.Find(docFilter, null).ToList();
			//отправляем найденные документы в архив
			DocumentManager.Instance.Archive(foundDocuments);
			//очищаем переменную для повторного использования
			context.DokumentyDlyaUdaleniya = null;
		}

Поиск и прерывание экземпляров процесса

		public void FindProcess(Context context)
		{
			//получаяем текущего авторизованного пользователя
			var user = AuthenticationService.GetCurrentUser<IUser>();
			//создаем фильтр для экземпляров процесса
			var filter = InterfaceActivator.Create<IWorkflowInstanceFilter>();
			//статус - текущий
			List<WorkflowInstanceStatus> statuses = new List<WorkflowInstanceStatus>();
			statuses.Add(WorkflowInstanceStatus.Running);
			filter.Statuses = statuses;
			//имя экземпляра
			filter.Name = context.NaimenovanieEkzemplyara;
			//находим все экземпляру по фильтру, исключая экземпляры совпадающие с текущим процессом - процесс не сможет прервать сам себя
			var processForTerminate = WorkflowInstanceManager.Instance.Find(filter, null).Where(f => f.Name != context.WorkflowInstance.Name);
			//добавляем найденные процесс в контекстную переменную
			foreach(var item in processForTerminate)
			{
				context.ProcessyDlyaPreryvaniya += item.Name + Environment.NewLine;
			}
		}
		
		public void TerminateProcess(Context context)
		{	//аналогично предыдущему сценарию
			var user = AuthenticationService.GetCurrentUser<IUser>();
			var filter = InterfaceActivator.Create<IWorkflowInstanceFilter>();
			List<WorkflowInstanceStatus> statuses = new List<WorkflowInstanceStatus>();
			statuses.Add(WorkflowInstanceStatus.Running);
			filter.Statuses = statuses;
			filter.Name = context.NaimenovanieEkzemplyara;
			var processForTerminate = WorkflowInstanceManager.Instance.Find(filter, null).Where(f => f.Name != context.WorkflowInstance.Name);
			//прерываем найденные экземпляры
			foreach(var item in processForTerminate)
			{
				WorkflowInstanceManager.Instance.Terminate(item, "Автоматическое прерывание", user);
			}
			context.ProcessyDlyaPreryvaniya = null;
		}

Поиск и удаление папок

		public void FindFolders(Context context)
		{
			//создаем фильтр объектов документооборота
			var folderFilter = InterfaceActivator.Create<DmsObjectFilter>();
			folderFilter.Name = context.ImyaPapki;
			var folders = FolderManager.Instance.Find(folderFilter, null);
			//для папок будет работать только один из параметров фильтра. по умолчанию - имя
			if(context.ImyaPapki != null)
			{
				foreach(var item in folders)
				{
					context.DeleteList += item.Name + Environment.NewLine;
				}
			}
			//если папки указаны вручную - добвляем именно их
			if(context.PapkiDlyaUdaleniya.Count > 0)
			{
				foreach(var item in context.PapkiDlyaUdaleniya)
				{
					context.DeleteList += item.Name + Environment.NewLine;
				}
			}
			//тоже для ID папки
			if(context.IdPapki != null)
			{
				context.DeleteList += FolderManager.Instance.LoadOrNull((long)context.IdPapki).Name;
			}

		}

		public void DeleteFolders(Context context)
		{
			//аналогично предыдущему
			var folderFilter = InterfaceActivator.Create<DmsObjectFilter>();
			folderFilter.Name = context.ImyaPapki;
			var folders = FolderManager.Instance.Find(folderFilter, null);
			if(context.ImyaPapki != null)
			{
				foreach(var item in folders)
				{
					FolderManager.Instance.Delete(item);
				}
			}
			if(context.PapkiDlyaUdaleniya.Count > 0)
			{
				foreach(var item in context.PapkiDlyaUdaleniya)
				{
					FolderManager.Instance.Delete(item);
				}
			}
			
			if(context.IdPapki != null)
			{
				FolderManager.Instance.LoadOrNull((long)context.IdPapki).Delete();
			}
			context.DeleteList = null;
		}

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