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