СвойстваФоновыхЗаданий (БСП)

Автор: 1С
ОбщийМодуль.РегламентныеЗаданияСлужебный
БСП

Свойства фоновых заданий. Возвращает таблицу свойств фоновых заданий.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ЗаполнитьТаблицуСвойствФоновыхЗаданийВФоне (БСП)

ПолучитьСвойстваФоновогоЗадания (БСП)

ЗапуститьФоновоеЗадание (БСП)

ФоновоеЗаданиеЗагрузкиКлассификатораАдресов (БСП)

ФоновоеЗаданиеОчисткиКлассификатораАдресов (БСП)

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

ОтменитьФоновоеЗадание (БСП)

ЗаданиеВыполнено (БСП)

СостояниеЗадания (БСП)

TurboConf 6 - расширение Конфигуратора 1С