Files

211 lines
12 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) 2021, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию
// ссылок в файлах выгрузки.
//
// Параметры:
// Типы - Массив из ОбъектМетаданных - объекты метаданных.
//
Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт
Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
Типы.Добавить(ПланОбмена);
КонецЦикла;
КонецПроцедуры
// Для служебного использования.
// Параметры:
// ТаблицаОбработчиков - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных.ТаблицаОбработчиков
//
Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт
Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = ПланОбмена;
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаУзловПлановОбменов;
НовыйОбработчик.ПередВыгрузкойОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
НовыйОбработчик = ТаблицаОбработчиков.Добавить();
НовыйОбработчик.ОбъектМетаданных = ПланОбмена;
НовыйОбработчик.Обработчик = ВыгрузкаЗагрузкаУзловПлановОбменов;
НовыйОбработчик.ПослеВыгрузкиОбъекта = Истина;
НовыйОбработчик.Версия = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ВерсияОбработчиков1_0_0_1();
КонецЦикла;
КонецПроцедуры
// Для служебного использования.
//
Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт
НовыеЗначенияРазделителей = Новый Структура;
НовыеЗначенияРазделителей.Вставить(РаботаВМоделиСервиса.РазделительОсновныхДанных(), 0);
НовыеЗначенияРазделителей.Вставить(РаботаВМоделиСервиса.РазделительВспомогательныхДанных(), 0);
ЗаполнитьЗначенияСвойств(Объект, НовыеЗначенияРазделителей);
КонецПроцедуры
// Для служебного использования.
//
Процедура ПослеВыгрузкиОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты) Экспорт
МетаданныеОбъекта = Объект.Метаданные(); // ОбъектМетаданных
Если ОбщегоНазначенияБТС.ЭтоПланОбмена(МетаданныеОбъекта) Тогда
МенеджерВыгрузкиОбъекта.ТребуетсяПересоздатьСсылкуПриЗагрузке(Объект.Ссылка);
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Объект метаданных %1 не может быть обработан обработчиком
|ВыгрузкаЗагрузкаУзловПлановОбменов.ПослеВыгрузкиОбъекта()'", Метаданные.ОсновнойЯзык.КодЯзыка),
МетаданныеОбъекта.ПолноеИмя());
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена(Контейнер) Экспорт
ПараметрыВыгрузки = Контейнер.ПараметрыВыгрузки();
ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена = Ложь;
Возврат ПараметрыВыгрузки.Свойство("ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена", ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена) И ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена = Истина;
КонецФункции
Функция ТипыВыгружаемыхПлановОбменаОбъектаМетаданных(Контейнер, ОбъектМетаданных)
ТипыВыгружаемыхПлановОбмена = Новый Массив;
ВыгружаемыеТипы = Контейнер.ПараметрыВыгрузки().ВыгружаемыеТипы;
ИсключаемыеТипы = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ПолучитьТипыИсключаемыеИзВыгрузкиЗагрузки();
Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
Если ВыгружаемыеТипы.Найти(ПланОбмена) <> Неопределено
И ИсключаемыеТипы.Найти(ПланОбмена) = Неопределено
И ПланОбмена.Состав.Найти(ОбъектМетаданных) <> Неопределено Тогда
ТипыВыгружаемыхПлановОбмена.Добавить(Тип("ПланОбменаСсылка." + ПланОбмена.Имя));
КонецЕсли;
КонецЦикла;
Возврат ТипыВыгружаемыхПлановОбмена;
КонецФункции
Процедура ВыгрузитьИзменения(Контейнер, ОбъектМетаданных, Сериализатор) Экспорт
Если НЕ ВыгружатьЗарегистрированныеИзмененияДляУзловПланаОбмена(Контейнер) Тогда
Возврат;
КонецЕсли;
ТипыВыгружаемыхПлановОбмена = ТипыВыгружаемыхПлановОбменаОбъектаМетаданных(Контейнер, ОбъектМетаданных);
Если ТипыВыгружаемыхПлановОбмена.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ПотокЗаписи = НачатьЗаписьФайла(Контейнер, ОбъектМетаданных, Сериализатор);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| *
|ИЗ
| #ТаблицаИзменения КАК ТаблицаИзменения
|ГДЕ
| ТИПЗНАЧЕНИЯ(ТаблицаИзменения.Узел) В (&ТипыВыгружаемыхПлановОбмена)");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ТаблицаИзменения", СтрЗаменить(ОбъектМетаданных.ПолноеИмя(), ".Перерасчет.", ".") + ".Изменения");
Запрос.УстановитьПараметр("ТипыВыгружаемыхПлановОбмена", ТипыВыгружаемыхПлановОбмена);
РезультатЗапроса = Запрос.Выполнить();
ЗаписьИзменения = Новый Структура;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
ЗаписьИзменения.Вставить(Колонка.Имя);
КонецЦикла;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ЗаписьИзменения, Выборка);
ПотокЗаписи.ЗаписатьОбъектДанныхИнформационнойБазы(ЗаписьИзменения, Новый Массив);
КонецЦикла;
ЗавершитьЗаписьФайла(Контейнер, ОбъектМетаданных, ПотокЗаписи);
КонецПроцедуры
Функция НачатьЗаписьФайла(Контейнер, ОбъектМетаданных, Сериализатор)
ИмяФайла = Контейнер.СоздатьФайл(
ВыгрузкаЗагрузкаДанныхСлужебный.InfobaseData(), ОбъектМетаданных.ПолноеИмя());
ПотокЗаписи = Обработки.ВыгрузкаЗагрузкаДанныхПотокЗаписиДанныхИнформационнойБазы.Создать();
ПотокЗаписи.ОткрытьФайл(ИмяФайла, Сериализатор, ВыгрузкаЗагрузкаДанныхСлужебный.InfobaseDataChanges());
Возврат ПотокЗаписи;
КонецФункции
Процедура ЗавершитьЗаписьФайла(Контейнер, ОбъектМетаданных, ПотокЗаписи)
ПотокЗаписи.Закрыть();
КоличествоОбъектов = ПотокЗаписи.КоличествоОбъектов();
Если КоличествоОбъектов = 0 Тогда
Контейнер.ИсключитьФайл(ПотокЗаписи.ИмяФайла());
Иначе
Контейнер.УстановитьКоличествоОбъектов(ПотокЗаписи.ИмяФайла(), КоличествоОбъектов);
КонецЕсли;
ЗаписьЖурналаРегистрации(
НСтр("ru = 'ВыгрузкаЗагрузкаДанных.ВыгрузкаИзмененийОбъектаМетаданных'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Информация,
ОбъектМетаданных,
,
СтрШаблон(НСтр("ru = 'Окончание выгрузки изменений объекта метаданных: %1
|Выгружено объектов: %2'", ОбщегоНазначения.КодОсновногоЯзыка()),
ОбъектМетаданных.ПолноеИмя(), КоличествоОбъектов));
КонецПроцедуры
#КонецОбласти