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

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

# Код реализации

```1c
Процедура ВыполнитьУдалениеДокументов(НачальнаяДата, КонечнаяДата, Организация) Экспорт

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("НачальнаяДата", НачальнаяДата);
	Запрос.УстановитьПараметр("КонечнаяДата", КонечнаяДата);
	Запрос.УстановитьПараметр("Организация", Организация);

	Для Каждого МетаДокумент из Метаданные.Документы Цикл

		ОбработкаПрерыванияПользователя();

		Если МетаДокумент.Реквизиты.Найти("Организация") = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Запрос.Текст = "ВЫБРАТЬ
		|	УдаляемыйДокумент.Ссылка
		|ИЗ
		|	Документ.ЧекККМ КАК УдаляемыйДокумент
		|ГДЕ
		|	УдаляемыйДокумент.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
		|	И УдаляемыйДокумент.Организация = &Организация
		|	И НЕ УдаляемыйДокумент.ПометкаУдаления
		|
		|УПОРЯДОЧИТЬ ПО
		|	УдаляемыйДокумент.Дата";
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЧекККМ", МетаДокумент.Имя);
		Выборка = Запрос.Выполнить().Выбрать;

		Если Не Выборка.Количество() Тогда
			Продолжить;
		КонецЕсли;

		МассивДокументов = Новый Массив;

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

	КонецЦикла;	 //по документам из метаданных

КонецПроцедуры

// Процедура общего модуля для запуска фонового задания
Процедура УдалитьДокументы(СтруктураПараметров) Экспорт

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

КонецПроцедуры
```