Перед выгрузкой данных.
Процедура ПередВыгрузкойДанных(Контейнер) Экспорт
ПараметрыВыгрузки = Новый Структура(Контейнер.ПараметрыВыгрузки());
ДополнительноВыгружаемые = Новый Массив();
ПравилаКонтроля = ВыгрузкаЗагрузкаНеразделенныхДанныхПовтИсп.КонтрольСсылокНаНеразделенныеДанныеВРазделенныхПриВыгрузке();
Для Каждого ПравилоКонтроля Из ПравилаКонтроля Цикл
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПравилоКонтроля.Ключ);
Если ПараметрыВыгрузки.ВыгружаемыеТипы.Найти(ОбъектМетаданных) <> Неопределено Тогда
Для Каждого ИмяПоля Из ПравилоКонтроля.Значение Цикл
СтруктураИмениПоля = СтрРазделить(ИмяПоля, ".");
Если ОбщегоНазначенияБТС.ЭтоКонстанта(ОбъектМетаданных) Тогда
ПодстрокаПоля = "Значение";
ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
ИначеЕсли ОбщегоНазначенияБТС.ЭтоСсылочныеДанные(ОбъектМетаданных) Тогда
Если СтруктураИмениПоля[2] = "Реквизит" ИЛИ СтруктураИмениПоля[2] = "Attribute" Тогда // Не локализуется
ПодстрокаПоля = СтруктураИмениПоля[3];
ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
ИначеЕсли СтруктураИмениПоля[2] = "ТабличнаяЧасть" ИЛИ СтруктураИмениПоля[2] = "TabularSection" Тогда // Не локализуется
ИмяТабличнойЧасти = СтруктураИмениПоля[3];
Если СтруктураИмениПоля[4] = "Реквизит" ИЛИ СтруктураИмениПоля[4] = "Attribute" Тогда // Не локализуется
ПодстрокаПоля = СтруктураИмениПоля[5];
ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя() + "." + ИмяТабличнойЧасти;
Иначе
ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
Иначе
ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
ИначеЕсли ОбщегоНазначенияБТС.ЭтоНаборЗаписей(ОбъектМетаданных) Тогда
Если СтруктураИмениПоля[2] = "Измерение" ИЛИ СтруктураИмениПоля[2] = "Dimension"
ИЛИ СтруктураИмениПоля[2] = "Ресурс" ИЛИ СтруктураИмениПоля[2] = "Resource"
ИЛИ СтруктураИмениПоля[2] = "Реквизит" ИЛИ СтруктураИмениПоля[2] = "Attribute" Тогда // Не локализуется
ПодстрокаПоля = СтруктураИмениПоля[3];
ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
Иначе
ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
Иначе
ВызватьИсключение СтрШаблон(НСтр("ru = 'Объект метаданных %1 не поддерживается!'"), ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
ВозможныеТипыПоля = Метаданные.НайтиПоПолномуИмени(ИмяПоля).Тип.Типы();
ПроверяемыеТипыПоля = Новый Массив();
Для Каждого ВозможныйТипПоля Из ВозможныеТипыПоля Цикл
ОбъектВозможногоТипа = Метаданные.НайтиПоТипу(ВозможныйТипПоля);
Если ОбъектВозможногоТипа = Неопределено Тогда
// Примитивный тип
Продолжить;
КонецЕсли;
Если ПараметрыВыгрузки.ВыгружаемыеТипы.Найти(ОбъектВозможногоТипа) <> Неопределено Тогда
// Объект изначально включен в состав выгружаемых типов
Продолжить;
КонецЕсли;
Если ДополнительноВыгружаемые.Найти(ОбъектВозможногоТипа) <> Неопределено Тогда
// Объект уже добавлен в состав дополнительно выгружаемых
Продолжить;
КонецЕсли;
Если Не ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектВозможногоТипа) Тогда
// Объект не может содержать предопределенных элементов
Продолжить;
КонецЕсли;
ПроверяемыеТипыПоля.Добавить(ВозможныйТипПоля);
КонецЦикла;
Если ПроверяемыеТипыПоля.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ТекстЗапроса = "";
ШаблонТекстаЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТИПЗНАЧЕНИЯ(Т.[ИмяПоля]) КАК Тип
|ИЗ
| [Таблица] КАК Т
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ [ТаблицаПредопределенные] КАК ТПредопределенные
| ПО Т.[ИмяПоля] = ТПредопределенные.Ссылка
| И (ТПредопределенные.Предопределенный)";
Для каждого ПроверяемыйТипПоля Из ПроверяемыеТипыПоля Цикл
Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + ШаблонТекстаЗапроса;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Таблица]", ПодстрокаТаблицы);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ТаблицаПредопределенные]", Метаданные.НайтиПоТипу(ПроверяемыйТипПоля).ПолноеИмя());
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПоля]", ПодстрокаПоля);
КонецЦикла;
Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДополнительныйОбъектМетаданных = Метаданные.НайтиПоТипу(Выборка.Тип);
Если ДополнительныйОбъектМетаданных <> Неопределено Тогда
ДополнительноВыгружаемые.Добавить(ДополнительныйОбъектМетаданных);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыВыгрузки.ВыгружаемыеТипы, ДополнительноВыгружаемые, Истина);
Контейнер.УстановитьПараметрыВыгрузки(ПараметрыВыгрузки);
ИменаДополнительноВыгружаемых = Новый Массив();
Для Каждого ДополнительноВыгружаемыйОбъект Из ДополнительноВыгружаемые Цикл
ИменаДополнительноВыгружаемых.Добавить(ДополнительноВыгружаемыйОбъект.ПолноеИмя());
КонецЦикла;
ИмяФайла = Контейнер.СоздатьПроизвольныйФайл("xml", ТипДанныхДляТаблицыДополнительноВыгружаемыхДанных());
ВыгрузкаЗагрузкаДанных.ЗаписатьОбъектВФайл(ИменаДополнительноВыгружаемых, ИмяФайла);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////