Многопоточная пометка удаления документов по организации за период

Алгоритм поиска и установки пометки удаления документов по организации (по реквизиту "Организация"), используя многопоточность (фоновые задания). Из минусов - возможны блокировки, поскольку одновременно в работу идут все виды документов. Алгоритм писался как срочное вынужденное решение, на изящность не претендует.

Основано на публикации - https://infostart.ru/1c/articles/370384/

Процедура ВыполнитьУдалениеДокументов(НачальнаяДата, КонечнаяДата, Организация) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("НачальнаяДата", НачальнаяДата);			   
	Запрос.УстановитьПараметр("КонечнаяДата", КонечнаяДата);
	Запрос.УстановитьПараметр("Организация", Организация);
	
	Для Каждого МетаДокумент из Метаданные.Документы Цикл
		
		ОбработкаПрерыванияПользователя();
		
		Если МетаДокумент.Реквизиты.Найти("Организация") = Неопределено Тогда
			Продолжить;
		КонецЕсли;	
		
		Запрос.Текст = "ВЫБРАТЬ
		|	УдаляемыйДокумент.Ссылка
		|ИЗ
		|	Документ.ЧекККМ КАК УдаляемыйДокумент
		|ГДЕ
		|	УдаляемыйДокумент.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
		|	И УдаляемыйДокумент.Организация = &Организация
		|	И НЕ УдаляемыйДокумент.ПометкаУдаления
		|
		|УПОРЯДОЧИТЬ ПО
		|	УдаляемыйДокумент.Дата";
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЧекККМ", МетаДокумент.Имя);
		Выборка = Запрос.Выполнить().Выбрать;
		
		Если Не Выборка.Количество() Тогда
			Продолжить;
		КонецЕсли;	
		
		МассивДокументов = Новый Массив;
		
		МассивФЗ = Новый Массив;
		КоличествоЗаданий = 20; // количество фоновых заданий для каждого вида документа 
		КоличествоДанныхДляЗадания = 800; // количество документов, обрабатываемых одним фоновым заданием
		МассивДанныхЗадания = Новый Массив;
		Пока Выборка.Следующий() Цикл
			МассивДанныхЗадания.Добавить(Выборка.Ссылка);
			// если набралось достаточно документов для запуска ФЗ - идем дальше
			Если МассивДанныхЗадания.Количество() = КоличествоДанныхДляЗадания Тогда
				// проверяем есть ли свободные ФЗ, иначе ждем
				Пока МассивФЗ.Количество() = КоличествоЗаданий Цикл
					Для Каждого ФЗ ИЗ МассивФЗ Цикл
						ОтборФЗ = Новый Структура;
						ОтборФЗ.Вставить("УникальныйИдентификатор", ФЗ); 
						МассивАктивныхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборФЗ);
						Для Каждого Задание Из МассивАктивныхЗаданий Цикл
							Если НЕ Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
								МассивФЗ.Удалить(МассивФЗ.Найти(ФЗ));
								Прервать; // выйдем из "бесконечного" цикла, когда хотя бы одно из заданий закончилось
							КонецЕсли;
						КонецЦикла;
					КонецЦикла; 
				КонецЦикла;
				// запускаем ФЗ
				МассивПараметров = Новый Массив;
				МассивПараметров.Добавить(МассивДанныхЗадания);
				ФЗ = ФоновыеЗадания.Выполнить("СлужебныйМодуль.УдалитьДокументы", МассивПараметров, Новый УникальныйИдентификатор);
				МассивФЗ.Добавить(ФЗ.УникальныйИдентификатор);
				МассивДанныхЗадания = Новый Массив;
			КонецЕсли; // КоличествоДанныхДляЗадания
		КонецЦикла;
		// если не дошли до ограничения по количеству документов в ФЗ - запускаем единственное
		Если МассивДанныхЗадания.Количество() > 0 Тогда
			МассивПараметров = Новый Массив;
			МассивПараметров.Добавить(МассивДанныхЗадания);
			ФЗ = ФоновыеЗадания.Выполнить("СлужебныйМодуль.УдалитьДокументы", МассивПараметров, Новый УникальныйИдентификатор);
		КонецЕсли;
		
	КонецЦикла;	 //по документам из метаданных
	
КонецПроцедуры

// Процедура общего модуля для запуска фонового задания
Процедура УдалитьДокументы(СтруктураПараметров) Экспорт
	
	Для Каждого Документ Из СтруктураПараметров Цикл
		ДокументОбъект = Документ.Ссылка.ПолучитьОбъект();
		ДокументОбъект.УстановитьПометкуУдаления(Истина);
	КонецЦикла;
	
КонецПроцедуры
0
Орфографическая ошибка в многопоточность: многопоточность

См. также

УстановитьСтатусИзмененияПометкиУдаленияДокумента (БСП)

УстановитьПометкуУдаленияФайловДокументовПередЗаписью (БСП)

УстановитьПометкуУдаленияПрисоединенныхФайловДокументов (БСП)

УстановитьСнятьПометкуУдаленияЗаметок (БСП)

УстановитьСтатусИзмененияПометкиУдаления (БСП)

ОтработатьПризнакИзмененияПометкиУдаленияПриЗаписиПисьма (БСП)

УстановитьСтатусИзмененияПометкиУдаленияОбъекта (БСП)

УстановитьПометкуУдаленияУВложенийПисьма (БСП)

ПриПометкеУдаленияЗадачи (БСП)

Модератору