Подготовить область из выгрузки. Загружает данные в область из пользовательской выгрузки.
// Загружает данные в область из пользовательской выгрузки.
//
// Параметры:
// КодОбластиДанных - Число - номер заполняемой области.
// ИдентификаторВыгрузки - УникальныйИдентификатор - идентификатор файла выгрузки.
// СопоставлениеПользователей - ТаблицаЗначений - описание см. ВыгрузкаЗагрузкаДанных.ЗагрузитьДанныеИзАрхива().
// ОбщиеДанные - Булево - признак того, что это общие данные.
//
// Возвращаемое значение:
// Строка - один из вариантов "ТребуетсяКонвертация", "Успех", "ФатальнаяОшибка".
//
Процедура ПодготовитьОбластьИзВыгрузки(Знач КодОбластиДанных, Знач ИдентификаторВыгрузки, Знач СопоставлениеПользователей, Знач ОбщиеДанные = Ложь) Экспорт
Попытка
ДанныеЗаблокированы = Ложь;
Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
ВызватьИсключение(НСтр("ru = 'Недостаточно прав для выполнения операции'"));
КонецЕсли;
Если ОбщиеДанные Тогда
РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Истина, КодОбластиДанных);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
КлючОбласти = РаботаВМоделиСервиса.СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных(
РегистрыСведений.ОбластиДанных,
Новый Структура(РаботаВМоделиСервиса.РазделительВспомогательныхДанных(), КодОбластиДанных));
ЗаблокироватьДанныеДляРедактирования(КлючОбласти);
ДанныеЗаблокированы = Истина;
МенеджерЗаписи = РаботаВМоделиСервиса.ПолучитьМенеджерЗаписиОбластиДанных(КодОбластиДанных, Перечисления.СтатусыОбластейДанных.ПустаяСсылка());
Если ТекущийРежимЗапуска() <> Неопределено Тогда
ПользователиСлужебный.АвторизоватьТекущегоПользователя();
КонецЕсли;
ИмяФайлаВыгрузки = РаботаВМоделиСервиса.ПолучитьФайлИзХранилищаМенеджераСервиса(ИдентификаторВыгрузки);
Если ИмяФайлаВыгрузки = Неопределено Тогда
СообщениеОбОшибке = НСтр("ru = 'Нет файла начальных данных для области'");
ИмяСобытия = РаботаВМоделиСервиса.СобытиеЖурналаРегистрацииПодготовкаОбластиДанных();
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);
ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОшибкаПодготовкиОбластиДанных();
ОтправитьСообщениеОСостоянииОбластиДанных(ТипСообщения, КодОбластиДанных, СообщениеОбОшибке);
ВызватьИсключение СообщениеОбОшибке;
КонецЕсли;
Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда
РаботаВМоделиСервиса.ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных");
КонецЕсли;
МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных");
Если Не МодульВыгрузкаЗагрузкаОбластейДанных.ВыгрузкаВАрхивеСовместимаСТекущейКонфигурацией(ИмяФайлаВыгрузки) Тогда
СообщениеОбОшибке = НСтр("ru = 'Требуется конвертация'");
ИмяСобытия = РаботаВМоделиСервиса.СобытиеЖурналаРегистрацииПодготовкаОбластиДанных();
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);
ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОшибкаПодготовкиОбластиДанныхТребуетсяКонвертация();
ОтправитьСообщениеОСостоянииОбластиДанных(ТипСообщения, КодОбластиДанных);
РазблокироватьДанныеДляРедактирования(КлючОбласти);
Если ОбщиеДанные Тогда
РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь);
КонецЕсли;
Возврат;
КонецЕсли;
МодульВыгрузкаЗагрузкаОбластейДанных.ЗагрузитьТекущуюОбластьДанныхИзАрхива(ИмяФайлаВыгрузки, , , СопоставлениеПользователей);
МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется;
// Отправить сообщение о готовности области в менеджер сервиса.
ТипСообщения = СообщенияКонтрольУдаленногоАдминистрированияИнтерфейс.СообщениеОбластьДанныхПодготовлена();
Сообщение = СообщенияВМоделиСервиса.НовоеСообщение(ТипСообщения);
Сообщение.Body.Zone = МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные;
НачатьТранзакцию();
Попытка
СообщенияВМоделиСервиса.ОтправитьСообщение(
Сообщение,
РаботаВМоделиСервисаПовтИсп.КонечнаяТочкаМенеджераСервиса());
МенеджерЗаписи.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
ЗаписьЖурналаРегистрации(РаботаВМоделиСервиса.СобытиеЖурналаРегистрацииПодготовкаОбластиДанных(),
УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
РазблокироватьДанныеДляРедактирования(КлючОбласти);
Если ОбщиеДанные Тогда
РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь);
КонецЕсли;
Исключение
Если ДанныеЗаблокированы Тогда
РазблокироватьДанныеДляРедактирования(КлючОбласти);
КонецЕсли;
Если ОбщиеДанные Тогда
РаботаВМоделиСервиса.УстановитьРазделениеСеанса(Ложь);
КонецЕсли;
ИнформацияОбОшибке = ИнформацияОбОшибке();
УведомитьМенеджерОшибкаПодготовкиОбласти(КодОбластиДанных, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
СообщениеПодготовитьОбластьДанныхИзВыгрузки (БСП)
ПодготовитьДанныеДляВыгрузкиИзИнформационнойБазы (БСП)
ПодготовитьИПрикрепитьОбластьДанных (БСП)
ПодготовитьОбластьДанныхКИспользованиюИзЭталонной (БСП)
ПриОшибкеПодготовкиОбластиИзВыгрузки (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)