Маршруты подписания / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	
#Область ПрограммныйИнтерфейс

// Регистрирует данные для обработчика обновления
// 
// Параметры:
//  Параметры - Структура - параметры.
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ПолноеИмяОбъекта = Метаданные.Справочники.МаршрутыПодписания.ПолноеИмя();
	
	ПараметрыВыборки = Параметры.ПараметрыВыборки;
	ПараметрыВыборки.СпособВыборки       = ОбновлениеИнформационнойБазы.СпособВыборкиСсылки();
	ПараметрыВыборки.ПолныеИменаОбъектов = ПолноеИмяОбъекта;
	
	Данные = Новый Массив;
	
	// Заполнение вида подписи.
	Данные_ЗаполнениеВидаПодписи = ДанныеКОбработке_ЗаполнениеВидаПодписи();
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Данные, Данные_ЗаполнениеВидаПодписи, Истина);
	
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Данные);
	
КонецПроцедуры

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)
	|	ИЛИ Предопределенный";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

// СтандартныеПодсистемы.ОбновлениеВерсииИБ

// Определяет настройки начального заполнения элементов
//
// Параметры:
//  Настройки - Структура - настройки заполнения
//   * ПриНачальномЗаполненииЭлемента - Булево - Если Истина, то для каждого элемента будет
//      вызвана процедура индивидуального заполнения ПриНачальномЗаполненииЭлемента.
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт
	
	Настройки.ПриНачальномЗаполненииЭлемента = Ложь;
	
КонецПроцедуры

// Вызывается при начальном заполнении справочника.
//
// Параметры:
//  КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций.
//  Элементы   - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов
//                                 справочника МаршрутыПодписания.
//  ТабличныеЧасти - Структура - описание табличных частей объекта, где:
//   * Ключ - Строка - имя табличной части;
//   * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой
//                                  необходимо скопировать перед заполнением. Например:
//                                  Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать();
//                                  ЭлементТЧ = Элемент.Ключи.Добавить();
//                                  ЭлементТЧ.ИмяКлюча = "Первичный";
//
Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти = Неопределено) Экспорт
	
	КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
	
	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "ОднойДоступнойПодписью";
	Элемент.Наименование = НСтр("ru = 'Одной доступной подписью'", КодОсновногоЯзыка);
	Элемент.ВидПодписи = Перечисления.ВидыЭлектронныхПодписей.УсиленнаяКвалифицированная;
	
	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "УказыватьПриСоздании";
	Элемент.Наименование = НСтр("ru = 'Указывать при создании документа'", КодОсновногоЯзыка);
	Элемент.ВидПодписи = Перечисления.ВидыЭлектронныхПодписей.УсиленнаяКвалифицированная;
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область Обновление

Функция ДанныеКОбработке_ЗаполнениеВидаПодписи() 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МаршрутыПодписания.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.МаршрутыПодписания КАК МаршрутыПодписания
		|ГДЕ
		|	МаршрутыПодписания.ВидПодписи = ЗНАЧЕНИЕ(Перечисление.ВидыЭлектронныхПодписей.ПустаяСсылка)";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Данные = Новый Массив;
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Данные.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
	КонецЦикла;
	
	Возврат Данные;
	
КонецФункции

// Создает предопределенные маршруты подписания, если они отсутствуют.
//
Процедура ОбработатьДанные_СоздатьПредопределенныеМаршруты() Экспорт
	
	// Создаем предопределенные данные, если они отсутствуют по каким-либо причинам, например при использовании РИБ.
	
	Если ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.МаршрутыПодписания.ОднойДоступнойПодписью") = Неопределено Тогда
		МаршрутОбъект = Справочники.МаршрутыПодписания.СоздатьЭлемент();
		МаршрутОбъект.ИмяПредопределенныхДанных = "ОднойДоступнойПодписью";
		МаршрутОбъект.Наименование = НСтр("ru = 'Одной доступной подписью'");
		МаршрутОбъект.ВидПодписи = Перечисления.ВидыЭлектронныхПодписей.УсиленнаяКвалифицированная;
		ОбновлениеИнформационнойБазы.ЗаписатьОбъект(МаршрутОбъект);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.МаршрутыПодписания.УказыватьПриСоздании") = Неопределено Тогда
		МаршрутОбъект = Справочники.МаршрутыПодписания.СоздатьЭлемент();
		МаршрутОбъект.ИмяПредопределенныхДанных = "УказыватьПриСоздании";
		МаршрутОбъект.Наименование = НСтр("ru = 'Указывать при создании документа'");
		МаршрутОбъект.ВидПодписи = Перечисления.ВидыЭлектронныхПодписей.УсиленнаяКвалифицированная;
		ОбновлениеИнформационнойБазы.ЗаписатьОбъект(МаршрутОбъект);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

Процедура ОбработатьДанные_ЗаполнитьВидПодписи(Объект, Записать) 
	
	ВидПодписи = Перечисления.ВидыЭлектронныхПодписей.УсиленнаяКвалифицированная;
	Если Не ЗначениеЗаполнено(Объект.ВидПодписи) Тогда
		Объект.ВидПодписи = ВидПодписи;
		Записать = Истина;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли

Связанные материалы