Files
SSL/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl
T
2020-04-02 22:37:00 +03:00

1116 lines
76 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2020, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Проверяет, включено ли регламентное задание по функциональным опциям.
//
// Параметры:
// Задание - ОбъектМетаданных: РегламентноеЗадание - регламентное задание.
// ЗависимостиЗаданий - ТаблицаЗначений - таблица зависимостей регламентных
// заданий, полученная методом РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций.
// Если не указано, получается автоматически.
//
// Возвращаемое значение:
// Использование - Булево - Истина, если регламентное задание используется.
//
Функция РегламентноеЗаданиеДоступноПоФункциональнымОпциям(Задание, ЗависимостиЗаданий = Неопределено) Экспорт
Если ЗависимостиЗаданий = Неопределено Тогда
ЗависимостиЗаданий = РегламентныеЗаданияЗависимыеОтФункциональныхОпций();
КонецЕсли;
ОтключитьВПодчиненномУзлеРИБ = Ложь;
ОтключитьВАвтономномРабочемМесте = Ложь;
Использование = Неопределено;
ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
ЭтоРазделенныйРежим = ОбщегоНазначения.РазделениеВключено();
ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто();
НайденныеСтроки = ЗависимостиЗаданий.НайтиСтроки(Новый Структура("РегламентноеЗадание", Задание));
Для Каждого СтрокаЗависимости Из НайденныеСтроки Цикл
Если ЭтоРазделенныйРежим И СтрокаЗависимости.ДоступноВМоделиСервиса = Ложь Тогда
Возврат Ложь;
КонецЕсли;
ОтключитьВПодчиненномУзлеРИБ = (СтрокаЗависимости.ДоступноВПодчиненномУзлеРИБ = Ложь) И ЭтоПодчиненныйУзелРИБ;
ОтключитьВАвтономномРабочемМесте = (СтрокаЗависимости.ДоступноВАвтономномРабочемМесте = Ложь) И ЭтоАвтономноеРабочееМесто;
Если ОтключитьВПодчиненномУзлеРИБ Или ОтключитьВАвтономномРабочемМесте Тогда
Возврат Ложь;
КонецЕсли;
Если СтрокаЗависимости.ФункциональнаяОпция = Неопределено Тогда
Продолжить;
КонецЕсли;
ЗначениеФО = ПолучитьФункциональнуюОпцию(СтрокаЗависимости.ФункциональнаяОпция.Имя);
Если Использование = Неопределено Тогда
Использование = ЗначениеФО;
ИначеЕсли СтрокаЗависимости.ЗависимостьПоИ Тогда
Использование = Использование И ЗначениеФО;
Иначе
Использование = Использование Или ЗначениеФО;
КонецЕсли;
КонецЦикла;
Если Использование = Неопределено Тогда
Возврат Истина;
Иначе
Возврат Использование;
КонецЕсли;
КонецФункции
// Формирует таблицу зависимостей регламентных заданий от функциональных опций.
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица значений с колонками:
// * РегламентноеЗадание - ОбъектМетаданныхРегламентноеЗадание - регламентное задание.
// * ФункциональнаяОпция - ОбъектМетаданныхФункциональнаяОпция - функциональная опция,
// от которой зависит регламентное задание.
// * ЗависимостьПоИ - Булево - если регламентное задание зависит более, чем
// от одной функциональной опции и его необходимо включать только тогда,
// когда все функциональные опции включены, то следует указывать Истина
// для каждой зависимости.
// По умолчанию Ложь - если хотя бы одна функциональная опция включена,
// то регламентное задание тоже включено.
// * ВключатьПриВключенииФункциональнойОпции - Булево, Неопределено - если Ложь, то при
// включении функциональной опции регламентное задание не будет включаться. Значение
// Неопределено соответствует значению Истина.
// По умолчанию - неопределено.
// * ДоступноВПодчиненномУзлеРИБ - Булево, Неопределено - Истина или Неопределено, если регламентное
// задание доступно в РИБ.
// По умолчанию - неопределено.
// * ДоступноВМоделиСервиса - Булево, Неопределено - Истина или Неопределено, если регламентное
// задание доступно в модели сервиса.
// По умолчанию - неопределено.
// * РаботаетСВнешнимиРесурсами - Булево - Истина, если регламентное задание работает
// с внешними ресурсами (получение почты, синхронизация данных и т.п.).
// По умолчанию - Ложь.
//
Функция РегламентныеЗаданияЗависимыеОтФункциональныхОпций() Экспорт
Зависимости = Новый ТаблицаЗначений;
Зависимости.Колонки.Добавить("РегламентноеЗадание");
Зависимости.Колонки.Добавить("ФункциональнаяОпция");
Зависимости.Колонки.Добавить("ЗависимостьПоИ", Новый ОписаниеТипов("Булево"));
Зависимости.Колонки.Добавить("ДоступноВМоделиСервиса");
Зависимости.Колонки.Добавить("ДоступноВПодчиненномУзлеРИБ");
Зависимости.Колонки.Добавить("ВключатьПриВключенииФункциональнойОпции");
Зависимости.Колонки.Добавить("ДоступноВАвтономномРабочемМесте");
Зависимости.Колонки.Добавить("РаботаетСВнешнимиРесурсами", Новый ОписаниеТипов("Булево"));
Зависимости.Колонки.Добавить("Параметризуется", Новый ОписаниеТипов("Булево"));
ИнтеграцияПодсистемБСП.ПриОпределенииНастроекРегламентныхЗаданий(Зависимости);
РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий(Зависимости);
Зависимости.Сортировать("РегламентноеЗадание");
Возврат Зависимости;
КонецФункции
// Устанавливает признак использования регламентных заданий в информационной базе
// в зависимости от значений функциональных опций.
//
// Параметры:
// ВключатьЗадания - Булево - если Истина, отключенные регламентные задания будут включаться
// при доступности по функциональным опциям. По умолчанию Ложь.
//
Процедура УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(ВключатьЗадания = Ложь) Экспорт
ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто();
ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций();
Задания = ЗависимыеРегламентныеЗадания.Скопировать(,"РегламентноеЗадание");
Задания.Свернуть("РегламентноеЗадание");
Для Каждого СтрокаЗадание Из Задания Цикл
Использование = Неопределено;
ОтключитьЗадание = Истина;
ОтключитьВПодчиненномУзлеРИБ = Ложь;
ОтключитьВАвтономномРабочемМесте = Ложь;
НайденныеСтроки = ЗависимыеРегламентныеЗадания.НайтиСтроки(Новый Структура("РегламентноеЗадание", СтрокаЗадание.РегламентноеЗадание));
Для Каждого СтрокаЗависимости Из НайденныеСтроки Цикл
ОтключитьВПодчиненномУзлеРИБ = (СтрокаЗависимости.ДоступноВПодчиненномУзлеРИБ = Ложь) И ЭтоПодчиненныйУзелРИБ;
ОтключитьВАвтономномРабочемМесте = (СтрокаЗависимости.ДоступноВАвтономномРабочемМесте = Ложь) И ЭтоАвтономноеРабочееМесто;
Если ОтключитьВПодчиненномУзлеРИБ Или ОтключитьВАвтономномРабочемМесте Тогда
Использование = Ложь;
Прервать;
КонецЕсли;
Если СтрокаЗависимости.ФункциональнаяОпция = Неопределено Тогда
Продолжить;
КонецЕсли;
ЗначениеФО = ПолучитьФункциональнуюОпцию(СтрокаЗависимости.ФункциональнаяОпция.Имя);
Если СтрокаЗависимости.ВключатьПриВключенииФункциональнойОпции = Ложь Тогда
Если ОтключитьЗадание Тогда
ОтключитьЗадание = Не ЗначениеФО;
КонецЕсли;
ЗначениеФО = Ложь;
КонецЕсли;
Если Использование = Неопределено Тогда
Использование = ЗначениеФО;
ИначеЕсли СтрокаЗависимости.ЗависимостьПоИ Тогда
Использование = Использование И ЗначениеФО;
Иначе
Использование = Использование Или ЗначениеФО;
КонецЕсли;
КонецЦикла;
Если Использование = Неопределено
Или (Использование И Не ВключатьЗадания) // Автоматически при обновлении только отключаем регламентные задания.
Или (Не Использование И Не ОтключитьЗадание) Тогда
Продолжить;
КонецЕсли;
СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", СтрокаЗадание.РегламентноеЗадание));
Для Каждого РегламентноеЗадание Из СписокЗаданий Цикл
ПараметрыЗадания = Новый Структура("Использование", Использование);
РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики подписок на события.
// Процедура включает/отключает созданные в ИБ регламентные задания
// при изменении функциональной опции.
//
// Параметры:
// Источник - КонстантаМенеджерЗначения - константа хранения значения ФО.
// Отказ - Булево - Отказ при записи константы.
//
Процедура ВключитьРегламентноеЗаданиеПриИзмененииФункциональнойОпции(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ИзменитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(Источник, Источник.Значение);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных.
Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт
БлокировкаРаботыСВнешнимиРесурсами.ПослеЗагрузкиДанных(Контейнер);
КонецПроцедуры
// См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ.
Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания");
МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальноеКоличествоИсполняющихФоновыхЗаданий");
КонецЕсли;
КонецПроцедуры
// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
//
// Параметры:
// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления
//
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.3.3.12";
Обработчик.НачальноеЗаполнение = Истина;
Обработчик.РежимВыполнения = "Оперативно";
Обработчик.Процедура = "БлокировкаРаботыСВнешнимиРесурсами.ОбновитьПараметрыБлокировкиРаботыСВнешнимиРесурсами";
КонецПроцедуры
// См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ.
Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт
УстановитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЗначениеНастройки(ИмяНастройки) Экспорт
Настройки = НастройкиПоУмолчанию();
РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроек(Настройки);
Возврат Настройки[ИмяНастройки];
КонецФункции
// Содержит значения настроек по умолчанию.
//
// Возвращаемое значение:
// Структура - Структура с ключами:
// * РасположениеКомандыСнятияБлокировки - Строка - определяет расположение команды снятия
// блокировки работы с внешними ресурсами.
//
Функция НастройкиПоУмолчанию()
НастройкиПодсистемы = Новый Структура;
НастройкиПодсистемы.Вставить("РасположениеКомандыСнятияБлокировки",
НСтр("ru = 'Блокировку также можно снять позднее в разделе <b>Администрирование - Обслуживание</b>.'"));
Возврат НастройкиПодсистемы;
КонецФункции
// Вызывает исключение, если у пользователя нет права администрирования.
Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() Экспорт
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
ВызватьИсключение НСтр("ru = 'Нарушение прав доступа.'");
КонецЕсли;
Иначе
Если НЕ ПривилегированныйРежим() Тогда
ВыполнитьПроверкуПравДоступа("Администрирование", Метаданные);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Параметры:
// Параметры - Структура - со свойствами:
// * Таблица - ТаблицаЗначений - с колонками:
// ** Идентификатор - Строка-
// ** Предопределенное - Булево-
// ** Ключ - Строка-
// ** Наименование - Строка-
// ** Использование - Булево-
// ** Расписание - Строка-
// ** ИнтервалПовтораПриАварийномЗавершении - Число-
// ** КоличествоПовторовПриАварийномЗавершении - Строка-
// ** УникальныйИдентификаторПоследнегоФЗ - Строка-
// ** СостояниеВыполнения - Строка-
// ** ДатаОкончания - Строка-
// ** ИмяПользователя - Строка-
// ** ИмяЗадания - Строка-
// ** Параметризуемое - Булево-
// ** ДатаНачала - Строка-
// АдресХранилища - Строка -
//
Процедура СформироватьТаблицуРегламентныхЗаданий(Параметры, АдресХранилища) Экспорт
ИдентификаторРегламентногоЗадания = Параметры.ИдентификаторРегламентногоЗадания;
Таблица = Параметры.Таблица;
ОтключенныеЗадания = Параметры.ОтключенныеЗадания;
// Обновление таблицы РегламентныеЗадания и списка СписокВыбора регламентного задания для отбора.
ТекущиеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
ОтключенныеЗадания.Очистить();
ПараметрыРегламентныхЗаданий = РегламентныеЗаданияЗависимыеОтФункциональныхОпций();
ПараметрыОтбора = Новый Структура;
ПараметризуемыеЗадания = Новый Массив;
ПараметрыОтбора.Вставить("Параметризуется", Истина);
РезультатПоиска = ПараметрыРегламентныхЗаданий.НайтиСтроки(ПараметрыОтбора);
Для Каждого СтрокаРезультата Из РезультатПоиска Цикл
ПараметризуемыеЗадания.Добавить(СтрокаРезультата.РегламентноеЗадание);
КонецЦикла;
ПодсистемаРаботаВМоделиСервиса = Метаданные.Подсистемы.СтандартныеПодсистемы.Подсистемы.Найти("РаботаВМоделиСервиса");
Для Каждого ОбъектМетаданных Из Метаданные.РегламентныеЗадания Цикл
Если Не РегламентноеЗаданиеДоступноПоФункциональнымОпциям(ОбъектМетаданных, ПараметрыРегламентныхЗаданий) Тогда
ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя);
Продолжить;
КонецЕсли;
Если НЕ ОбщегоНазначения.РазделениеВключено() И ПодсистемаРаботаВМоделиСервиса <> Неопределено Тогда
Если ПодсистемаРаботаВМоделиСервиса.Состав.Содержит(ОбъектМетаданных) Тогда
ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя);
Продолжить;
КонецЕсли;
Для каждого Подсистема Из ПодсистемаРаботаВМоделиСервиса.Подсистемы Цикл
Если Подсистема.Состав.Содержит(ОбъектМетаданных) Тогда
ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя);
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если ИдентификаторРегламентногоЗадания = Неопределено Тогда
Индекс = 0;
Для Каждого Задание Из ТекущиеЗадания Цикл
Идентификатор = Строка(Задание.УникальныйИдентификатор);
Если Индекс >= Таблица.Количество() Или Таблица.Получить(Индекс).Идентификатор <> Идентификатор Тогда
// Вставка нового задания.
Обновляемое = Таблица.Вставить(Индекс);
// Установка уникального идентификатора.
Обновляемое.Идентификатор = Идентификатор;
Иначе
Обновляемое = Таблица[Индекс];
КонецЕсли;
Если ПараметризуемыеЗадания.Найти(Задание.Метаданные) <> Неопределено Тогда
Обновляемое.Параметризуемое = Истина;
КонецЕсли;
УстановитьСвойстваРегламентногоЗадания(Обновляемое, Задание);
Индекс = Индекс + 1;
КонецЦикла;
// Удаление лишних строк.
Пока Индекс < Таблица.Количество() Цикл
Таблица.Удалить(Индекс);
КонецЦикла;
Таблица.Сортировать("Наименование");
Иначе
Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
Новый УникальныйИдентификатор(ИдентификаторРегламентногоЗадания));
Строки = Таблица.НайтиСтроки(
Новый Структура("Идентификатор", ИдентификаторРегламентногоЗадания));
Если Задание <> Неопределено
И Строки.Количество() > 0 Тогда
СтрокаЗадание = Строки[0];
Если ПараметризуемыеЗадания.Найти(Задание.Метаданные) <> Неопределено Тогда
СтрокаЗадание.Параметризуемое = Истина;
КонецЕсли;
УстановитьСвойстваРегламентногоЗадания(СтрокаЗадание, Задание);
КонецЕсли;
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Таблица", Таблица);
Результат.Вставить("ОтключенныеЗадания", ОтключенныеЗадания);
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
Процедура УстановитьСвойстваРегламентногоЗадания(Приемник, ЗаданиеИсточник)
ЗаполнитьЗначенияСвойств(Приемник, ЗаданиеИсточник);
// Уточнение наименования
Приемник.Наименование = ПредставлениеРегламентногоЗадания(ЗаданиеИсточник);
// Установка Даты завершения и Состояния завершения по последней фоновой процедуре.
СвойстваПоследнегоФоновогоЗадания = СвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(ЗаданиеИсточник);
Приемник.ИмяЗадания = ЗаданиеИсточник.Метаданные.Имя;
Если СвойстваПоследнегоФоновогоЗадания = Неопределено Тогда
Приемник.ДатаНачала = ТекстНеОпределено();
Приемник.ДатаОкончания = ТекстНеОпределено();
Приемник.СостояниеВыполнения = ТекстНеОпределено();
Иначе
Приемник.ДатаНачала = ?(ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Начало),
СвойстваПоследнегоФоновогоЗадания.Начало,
"<>");
Приемник.ДатаОкончания = ?(ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Конец),
СвойстваПоследнегоФоновогоЗадания.Конец,
"<>");
Приемник.СостояниеВыполнения = СвойстваПоследнегоФоновогоЗадания.Состояние;
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для работы с регламентными заданиями.
// Предназначена для "ручного" немедленного выполнения процедуры регламентного задания
// либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ).
// Применяется в любом режиме соединения.
// Ручной режим запуска не влияет на выполнение регламентного задания по аварийному
// и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания.
// Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется
// тоже правило.
//
// Параметры:
// Задание - РегламентноеЗадание, Строка - уникального идентификатора РегламентногоЗадания.
//
// Возвращаемое значение:
// Структура - со свойствами
// * МоментЗапуска - Неопределено, Дата - для файловой ИБ устанавливает переданный момент, как момент запуска
// метода регламентного задания.
// Для серверной ИБ - возвращает момент запуска фонового задания по факту.
// * ИдентификаторФоновогоЗадания - Строка - для серверной ИБ возвращает идентификатор запущенного фонового задания.
//
Функция ВыполнитьРегламентноеЗаданиеВручную(Знач Задание) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
ПараметрыВыполнения = ПараметрыВыполненияРегламентногоЗадания();
ПараметрыВыполнения.ПроцедураУжеВыполняется = Ложь;
Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Задание);
ПараметрыВыполнения.ЗапускВыполнен = Ложь;
СвойстваПоследнегоФоновогоЗадания = СвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);
Если СвойстваПоследнегоФоновогоЗадания <> Неопределено
И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда
ПараметрыВыполнения.МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало;
Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда
ПараметрыВыполнения.ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование;
Иначе
ПараметрыВыполнения.ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание);
КонецЕсли;
Иначе
НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание));
// Не используются длительные операции, т.к. делается вызов метода регламентного задания.
ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания);
ПараметрыВыполнения.ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор);
ПараметрыВыполнения.МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало;
ПараметрыВыполнения.ЗапускВыполнен = Истина;
КонецЕсли;
ПараметрыВыполнения.ПроцедураУжеВыполняется = НЕ ПараметрыВыполнения.ЗапускВыполнен;
Возврат ПараметрыВыполнения;
КонецФункции
Функция ПараметрыВыполненияРегламентногоЗадания()
Результат = Новый Структура;
Результат.Вставить("МоментЗапуска");
Результат.Вставить("ИдентификаторФоновогоЗадания");
Результат.Вставить("ПредставлениеФоновогоЗадания");
Результат.Вставить("ПроцедураУжеВыполняется");
Результат.Вставить("ЗапускВыполнен");
Возврат Результат;
КонецФункции
// Возвращает представление регламентного задания,
// это по порядку исключения незаполненных реквизитов:
// Наименование, Метаданные.Синоним, Метаданные.Имя.
//
// Параметры:
// Задание - РегламентноеЗадание, Строка - если строка, тогда УникальныйИдентификатор строкой.
//
// Возвращаемое значение:
// Строка - .
//
Функция ПредставлениеРегламентногоЗадания(Знач Задание) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда
РегламентноеЗадание = Задание;
Иначе
РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Задание));
КонецЕсли;
Если РегламентноеЗадание <> Неопределено Тогда
Если РегламентноеЗадание.Предопределенное Тогда
Представление = РегламентноеЗадание.Метаданные.Синоним;
Иначе
Представление = РегламентноеЗадание.Наименование;
Если ПустаяСтрока(РегламентноеЗадание.Наименование) Тогда
Представление = РегламентноеЗадание.Метаданные.Синоним;
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(Представление) Тогда
Представление = РегламентноеЗадание.Метаданные.Имя;
КонецЕсли
Иначе
Представление = ТекстНеОпределено();
КонецЕсли;
Возврат Представление;
КонецФункции
// Возвращает текст "<не определено>".
Функция ТекстНеОпределено() Экспорт
Возврат НСтр("ru = '<не определено>'");
КонецФункции
// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке,
// последнее фоновое задание найдено по идентификатору регламентного задания
// и сообщения/ошибки есть.
//
// Параметры:
// Задание - РегламентноеЗадание, Строка - УникальныйИдентификатор
// РегламентногоЗадания строкой.
//
// Возвращаемое значение:
// Строка - .
//
Функция СообщенияИОписанияОшибокРегламентногоЗадания(Знач Задание) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
ИдентификаторРегламентногоЗадания = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Строка(Задание.УникальныйИдентификатор), Задание);
СвойстваПоследнегоФоновогоЗадания = СвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(ИдентификаторРегламентногоЗадания);
Возврат ?(СвойстваПоследнегоФоновогоЗадания = Неопределено,
"",
СообщенияИОписанияОшибокФоновогоЗадания(СвойстваПоследнегоФоновогоЗадания.Идентификатор));
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для работы с фоновыми заданиями.
// Отменяет фоновое задание, если это возможно, а именно, если оно выполняется на сервере, и активно.
//
// Параметры:
// Идентификатор - Строка уникального идентификатора ФоновогоЗадания.
//
Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор(Идентификатор);
Отбор = Новый Структура;
Отбор.Вставить("УникальныйИдентификатор", НовыйУникальныйИдентификатор);
МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если МассивФоновыхЗаданий.Количество() = 1 Тогда
ФоновоеЗадание = МассивФоновыхЗаданий[0];
Иначе
ВызватьИсключение НСтр("ru = 'Фоновое задание не найдено на сервере.'");
КонецЕсли;
Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
ВызватьИсключение НСтр("ru = 'Задание не выполняется, его нельзя отменить.'");
КонецЕсли;
ФоновоеЗадание.Отменить();
КонецПроцедуры
// Только для внутреннего использования.
//
Процедура ЗаполнитьТаблицуСвойствФоновыхЗаданийВФоне(Параметры, АдресХранилища) Экспорт
ТаблицаСвойств = СвойстваФоновыхЗаданий(Параметры.Отбор);
Результат = Новый Структура;
Результат.Вставить("ТаблицаСвойств", ТаблицаСвойств);
ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
// Возвращает таблицу свойств фоновых заданий.
// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий().
//
// Параметры:
// Отбор - Структура - допустимые поля:
// Идентификатор, Ключ, Состояние, Начало, Конец,
// Наименование, ИмяМетода, РегламентноеЗадание.
//
// Возвращаемое значение:
// ТаблицаЗначений - возвращается таблица после отбора.
//
Функция СвойстваФоновыхЗаданий(Отбор = Неопределено) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
Таблица = НовыеСвойстваФоновыхЗаданий();
Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда
Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания");
ПолучитьПоследнее = Истина;
Иначе
ПолучитьПоследнее = Ложь;
КонецЕсли;
РегламентноеЗадание = Неопределено;
// Добавление истории фоновых заданий, полученных с сервера.
Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда
Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда
РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания));
ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания);
ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор);
Если РегламентноеЗадание <> Неопределено Тогда
ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание;
КонецЕсли;
Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда
ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание);
АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор);
КонецЕсли;
Если ПолучитьПоследнее Тогда
Если ПоследнееФоновоеЗадание = Неопределено Тогда
ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания);
КонецЕсли;
ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(
ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание);
Если ПоследнееФоновоеЗадание <> Неопределено Тогда
МассивФоновыхЗаданий = Новый Массив;
МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание);
ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
КонецЕсли;
Возврат Таблица;
КонецЕсли;
ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица);
ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица);
Иначе
МассивФоновыхЗаданий = Новый Массив;
ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие;
Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл
ВсеИдентификаторыРегламентныхЗаданий.Вставить(
Строка(ТекущееЗадание.УникальныйИдентификатор), Истина);
КонецЦикла;
ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания();
Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл
Если ТекущееЗадание.РегламентноеЗадание = Неопределено
И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда
МассивФоновыхЗаданий.Добавить(ТекущееЗадание);
КонецЕсли;
КонецЦикла;
ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
КонецЕсли;
Иначе
Если НЕ ЗначениеЗаполнено(Отбор) Тогда
МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания();
Иначе
Если Отбор.Свойство("Идентификатор") Тогда
Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор));
Отбор.Удалить("Идентификатор");
КонецЕсли;
МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если Отбор.Свойство("УникальныйИдентификатор") Тогда
Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор));
Отбор.Удалить("УникальныйИдентификатор");
КонецЕсли;
КонецЕсли;
ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
КонецЕсли;
Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда
РегламентныеЗаданияДляОбработки = Новый Массив;
Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда
Если РегламентноеЗадание = Неопределено Тогда
РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания));
КонецЕсли;
Если РегламентноеЗадание <> Неопределено Тогда
РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание);
КонецЕсли;
КонецЕсли;
Иначе
РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
КонецЕсли;
Таблица.Сортировать("Начало Убыв, Конец Убыв");
// Отбор фоновых заданий.
Если ЗначениеЗаполнено(Отбор) Тогда
Начало = Неопределено;
Конец = Неопределено;
Состояние = Неопределено;
Если Отбор.Свойство("Начало") Тогда
Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено);
Отбор.Удалить("Начало");
КонецЕсли;
Если Отбор.Свойство("Конец") Тогда
Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено);
Отбор.Удалить("Конец");
КонецЕсли;
Если Отбор.Свойство("Состояние") Тогда
Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда
Состояние = Отбор.Состояние;
Отбор.Удалить("Состояние");
КонецЕсли;
КонецЕсли;
Если Отбор.Количество() <> 0 Тогда
Строки = Таблица.НайтиСтроки(Отбор);
Иначе
Строки = Таблица;
КонецЕсли;
// Выполнение дополнительного отбора по периоду и состоянию (если отбор определен).
НомерЭлемента = Строки.Количество() - 1;
Пока НомерЭлемента >= 0 Цикл
Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало
Или Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса())
Или Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда
Строки.Удалить(НомерЭлемента);
КонецЕсли;
НомерЭлемента = НомерЭлемента - 1;
КонецЦикла;
// Удаление лишних строк из таблицы.
Если ТипЗнч(Строки) = Тип("Массив") Тогда
НомерСтроки = Таблица.Количество() - 1;
Пока НомерСтроки >= 0 Цикл
Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда
Таблица.Удалить(Таблица[НомерСтроки]);
КонецЕсли;
НомерСтроки = НомерСтроки - 1;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Таблица;
КонецФункции
// Возвращает свойства ФоновогоЗадания по строке уникального идентификатора.
//
// Параметры:
// Идентификатор - Строка - уникального идентификатора ФоновогоЗадания.
// ИменаСвойств - Строка, если заполнено, возвращается структура с указанными свойствами.
//
// Возвращаемое значение:
// СтрокаТаблицыЗначений, Структура - свойства ФоновогоЗадания.
//
Функция ПолучитьСвойстваФоновогоЗадания(Идентификатор, ИменаСвойств = "") Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
Отбор = Новый Структура("Идентификатор", Идентификатор);
ТаблицаСвойствФоновыхЗаданий = СвойстваФоновыхЗаданий(Отбор);
Если ТаблицаСвойствФоновыхЗаданий.Количество() > 0 Тогда
Если ЗначениеЗаполнено(ИменаСвойств) Тогда
Результат = Новый Структура(ИменаСвойств);
ЗаполнитьЗначенияСвойств(Результат, ТаблицаСвойствФоновыхЗаданий[0]);
Иначе
Результат = ТаблицаСвойствФоновыхЗаданий[0];
КонецЕсли;
Иначе
Результат = Неопределено;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает свойства последнего фонового задания выполненного при выполнении регламентного задания, если оно есть.
// Процедура работает, как в файл-серверном, так и в клиент-серверном режимах.
//
// Параметры:
// РегламентноеЗадание - РегламентноеЗадание, Строка - строка уникального идентификатора РегламентногоЗадания.
//
// Возвращаемое значение:
// СтрокаТаблицыЗначений - с колонками:
// * Идентификатор - Строка -
// * Наименование - Строка -
// * Ключ - Строка -
// * Конец - Дата -
// * ИдентификаторРегламентногоЗадания - Строка -
// * Состояние - СостояниеФоновогоЗадания -
// * ИмяМетода - Строка -
// * Расположение - Строка -
// * ОписаниеИнформацииОбОшибке - Строка -
// * ПопыткаЗапуска - Число -
// * СообщенияПользователю - Массив -
// * НомерСеанса - Число -
// * НачалоСеанса - Дата -
//
Функция СвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(РегламентноеЗадание)
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
ИдентификаторРегламентногоЗадания = ?(ТипЗнч(РегламентноеЗадание) = Тип("РегламентноеЗадание"), Строка(РегламентноеЗадание.УникальныйИдентификатор), РегламентноеЗадание);
Отбор = Новый Структура;
Отбор.Вставить("ИдентификаторРегламентногоЗадания", ИдентификаторРегламентногоЗадания);
Отбор.Вставить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания");
ТаблицаСвойствФоновыхЗаданий = СвойстваФоновыхЗаданий(Отбор);
ТаблицаСвойствФоновыхЗаданий.Сортировать("Конец Возр");
Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда
СвойстваФоновогоЗадания = Неопределено;
ИначеЕсли НЕ ЗначениеЗаполнено(ТаблицаСвойствФоновыхЗаданий[0].Конец) Тогда
СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[0];
Иначе
СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1];
КонецЕсли;
Возврат СвойстваФоновогоЗадания;
КонецФункции
// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке,
// если фоновое задание найдено по идентификатору и сообщения/ошибки есть.
//
// Параметры:
// Задание - Строка - УникальныйИдентификатор ФоновогоЗадания строкой.
//
// Возвращаемое значение:
// Строка - .
//
Функция СообщенияИОписанияОшибокФоновогоЗадания(Идентификатор, СвойстваФоновогоЗадания = Неопределено) Экспорт
ВызватьИсключениеЕслиНетПраваАдминистрирования();
УстановитьПривилегированныйРежим(Истина);
Если СвойстваФоновогоЗадания = Неопределено Тогда
СвойстваФоновогоЗадания = ПолучитьСвойстваФоновогоЗадания(Идентификатор);
КонецЕсли;
Строка = "";
Если СвойстваФоновогоЗадания <> Неопределено Тогда
Для каждого Сообщение Из СвойстваФоновогоЗадания.СообщенияПользователю Цикл
Строка = Строка + ?(Строка = "",
"",
"
|
|") + Сообщение.Текст;
КонецЦикла;
Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке) Тогда
Строка = Строка + ?(Строка = "",
СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке,
"
|
|" + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке);
КонецЕсли;
КонецЕсли;
Возврат Строка;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
Процедура ИзменитьИспользованиеРегламентныхЗаданийПоФункциональнымОпциям(Источник, Знач Использование)
Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
ТипИсточника = ТипЗнч(Источник);
ХранениеФО = Метаданные.НайтиПоТипу(ТипИсточника);
ФункциональнаяОпция = Неопределено;
ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто();
ЗависимыеРегламентныеЗадания = РегламентныеЗаданияЗависимыеОтФункциональныхОпций();
СписокФО = ЗависимыеРегламентныеЗадания.Скопировать(,"ФункциональнаяОпция");
СписокФО.Свернуть("ФункциональнаяОпция");
Для Каждого СтрокаФО Из СписокФО Цикл
Если СтрокаФО.ФункциональнаяОпция = Неопределено Тогда
Продолжить;
КонецЕсли;
Если СтрокаФО.ФункциональнаяОпция.Хранение = ХранениеФО Тогда
ФункциональнаяОпция = СтрокаФО.ФункциональнаяОпция; // ОбъектМетаданныхФункциональнаяОпция
Прервать;
КонецЕсли;
КонецЦикла;
Если ФункциональнаяОпция = Неопределено
Или ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Использование Тогда
Возврат;
КонецЕсли;
Задания = ЗависимыеРегламентныеЗадания.Скопировать(Новый Структура("ФункциональнаяОпция", ФункциональнаяОпция) ,"РегламентноеЗадание");
Задания.Свернуть("РегламентноеЗадание");
Для Каждого СтрокаЗадание Из Задания Цикл
ИспользованиеПоФО = Неопределено;
ОтключитьЗадание = Истина;
ОтключитьВПодчиненномУзлеРИБ = Ложь;
ОтключитьВАвтономномРабочемМесте = Ложь;
НайденныеСтроки = ЗависимыеРегламентныеЗадания.НайтиСтроки(Новый Структура("РегламентноеЗадание", СтрокаЗадание.РегламентноеЗадание));
Для Каждого СтрокаЗависимости Из НайденныеСтроки Цикл
ОтключитьВПодчиненномУзлеРИБ = (СтрокаЗависимости.ДоступноВПодчиненномУзлеРИБ = Ложь) И ЭтоПодчиненныйУзелРИБ;
ОтключитьВАвтономномРабочемМесте = (СтрокаЗависимости.ДоступноВАвтономномРабочемМесте = Ложь) И ЭтоАвтономноеРабочееМесто;
Если ОтключитьВПодчиненномУзлеРИБ Или ОтключитьВАвтономномРабочемМесте Тогда
Прервать;
КонецЕсли;
Если СтрокаЗависимости.ФункциональнаяОпция = Неопределено Тогда
Продолжить;
КонецЕсли;
Если СтрокаЗависимости.ФункциональнаяОпция = ФункциональнаяОпция Тогда
ЗначениеФО = Использование;
Иначе
ЗначениеФО = ПолучитьФункциональнуюОпцию(СтрокаЗависимости.ФункциональнаяОпция.Имя);
КонецЕсли;
Если СтрокаЗависимости.ВключатьПриВключенииФункциональнойОпции = Ложь Тогда
Если ОтключитьЗадание Тогда
ОтключитьЗадание = Не ЗначениеФО;
КонецЕсли;
ЗначениеФО = Ложь;
КонецЕсли;
Если ИспользованиеПоФО = Неопределено Тогда
ИспользованиеПоФО = ЗначениеФО;
ИначеЕсли СтрокаЗависимости.ЗависимостьПоИ Тогда
ИспользованиеПоФО = ИспользованиеПоФО И ЗначениеФО;
Иначе
ИспользованиеПоФО = ИспользованиеПоФО Или ЗначениеФО;
КонецЕсли;
КонецЦикла;
Если ОтключитьВПодчиненномУзлеРИБ Или ОтключитьВАвтономномРабочемМесте Тогда
Использование = Ложь;
Иначе
Если Использование <> ИспользованиеПоФО Тогда
Продолжить;
КонецЕсли;
Если Не Использование И Не ОтключитьЗадание Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", СтрокаЗадание.РегламентноеЗадание));
Для Каждого РегламентноеЗадание Из СписокЗаданий Цикл
ПараметрыЗадания = Новый Структура("Использование", Использование);
РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Возвращает новую таблицу свойств фоновых заданий.
//
// Возвращаемое значение:
// ТаблицаЗначений - с колонками:
// * Идентификатор - Строка -
// * Наименование - Строка -
// * Ключ - Строка -
// * Конец - Дата -
// * ИдентификаторРегламентногоЗадания - Строка -
// * Состояние - СостояниеФоновогоЗадания -
// * ИмяМетода - Строка -
// * Расположение - Строка -
// * ОписаниеИнформацииОбОшибке - Строка -
// * ПопыткаЗапуска - Число -
// * СообщенияПользователю - Массив -
// * НомерСеанса - Число -
// * НачалоСеанса - Дата -
//
Функция НовыеСвойстваФоновыхЗаданий()
НоваяТаблица = Новый ТаблицаЗначений;
НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата"));
НоваяТаблица.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата"));
НоваяТаблица.Колонки.Добавить("ИдентификаторРегламентногоЗадания", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("Состояние", Новый ОписаниеТипов("СостояниеФоновогоЗадания"));
НоваяТаблица.Колонки.Добавить("ИмяМетода", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("Расположение", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("ОписаниеИнформацииОбОшибке", Новый ОписаниеТипов("Строка"));
НоваяТаблица.Колонки.Добавить("ПопыткаЗапуска", Новый ОписаниеТипов("Число"));
НоваяТаблица.Колонки.Добавить("СообщенияПользователю", Новый ОписаниеТипов("Массив"));
НоваяТаблица.Колонки.Добавить("НомерСеанса", Новый ОписаниеТипов("Число"));
НоваяТаблица.Колонки.Добавить("НачалоСеанса", Новый ОписаниеТипов("Дата"));
НоваяТаблица.Индексы.Добавить("Идентификатор, Начало");
Возврат НоваяТаблица;
КонецФункции
Процедура ДобавитьСвойстваФоновыхЗаданий(Знач МассивФоновыхЗаданий, Знач ТаблицаСвойствФоновыхЗаданий)
Индекс = МассивФоновыхЗаданий.Количество() - 1;
Пока Индекс >= 0 Цикл
ФоновоеЗадание = МассивФоновыхЗаданий[Индекс]; // ФоновоеЗадание
Строка = ТаблицаСвойствФоновыхЗаданий.Добавить();
ЗаполнитьЗначенияСвойств(Строка, ФоновоеЗадание);
Строка.Идентификатор = ФоновоеЗадание.УникальныйИдентификатор;
РегламентноеЗадание = ФоновоеЗадание.РегламентноеЗадание;
Если РегламентноеЗадание = Неопределено
И СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ФоновоеЗадание.Ключ) Тогда
РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ФоновоеЗадание.Ключ));
КонецЕсли;
Строка.ИдентификаторРегламентногоЗадания = ?(
РегламентноеЗадание = Неопределено,
"",
РегламентноеЗадание.УникальныйИдентификатор);
Строка.ОписаниеИнформацииОбОшибке = ?(
ФоновоеЗадание.ИнформацияОбОшибке = Неопределено,
"",
ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке));
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
// Параметры:
// МассивФоновыхЗаданий - Массив из ФоновоеЗадание -
// ПоследнееФоновоеЗадание - ФоновоеЗадание, Неопределено -
// Возвращаемое значение:
// ФоновоеЗадание, Неопределено -
//
Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено)
Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл
Если ПоследнееФоновоеЗадание = Неопределено Тогда
ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда
Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец)
ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда
ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
КонецЕсли;
Иначе
Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец)
И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда
ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ПоследнееФоновоеЗадание;
КонецФункции
#КонецОбласти