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