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