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