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