/////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2025, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// #Область ОписаниеПеременных &НаКлиенте Перем ИсточникПеретаскиванияНаКлиенте; &НаКлиенте Перем ПриемникПеретаскиванияНаКлиенте; &НаКлиенте Перем Список_ПередНачаломИзменения; &НаСервере Перем НесуществующиеПоля; #КонецОбласти #Область ОбработчикиСобытийФормы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УстановитьУсловноеОформление(); ОпределитьПоведениеВМобильномКлиенте(); ФормаПараметры = ВариантыОтчетов.СохраняемыеПараметрыФормыОтчета(Параметры); НастройкиОтчета = Параметры.НастройкиОтчета; ВариантНаименование = Параметры.ВариантНаименование; ОписаниеНастроекОтчета = ОписаниеНастроекОтчета(НастройкиОтчета); КлючСохраненияПоложенияОкна = ОписаниеНастроекОтчета.ПолноеИмя; Если ЗначениеЗаполнено(КлючТекущегоВарианта) Тогда КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна + "." + КлючТекущегоВарианта; КонецЕсли; НастройкиКД = Параметры.Вариант; Если НастройкиКД = Неопределено Тогда НастройкиКД = Отчет.КомпоновщикНастроек.Настройки; КонецЕсли; ИдентификаторЭлементаСтруктурыНастроек = Параметры.ИдентификаторЭлементаСтруктурыНастроек; Если ТипЗнч(ИдентификаторЭлементаСтруктурыНастроек) = Тип("ИдентификаторКомпоновкиДанных") Тогда РежимИзмененияЭлементаСтруктурыНастроек = Истина; Высота = 0; КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна + ".Узел"; ПутьКЭлементуСтруктурыНастроек = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( Параметры, "ПутьКЭлементуСтруктурыНастроек"); ЭлементСтруктуры = ОтчетыСервер.ЭлементНастроекПоПолномуПути(НастройкиКД, ПутьКЭлементуСтруктурыНастроек); Если ЭлементСтруктуры <> Неопределено Тогда ИдентификаторЭлементаСтруктурыНастроек = НастройкиКД.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); КонецЕсли; Заголовок = Параметры.Заголовок; ТипЭлементаСтруктурыНастроек = Параметры.ТипЭлементаСтруктурыНастроек; Иначе Если Не ЗначениеЗаполнено(ВариантНаименование) Тогда ВариантНаименование = ОписаниеНастроекОтчета.Наименование; КонецЕсли; Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Настройки отчета ""%1""'"), ВариантНаименование); КонецЕсли; ГлобальныеНастройки = ВариантыОтчетов.ГлобальныеНастройки(); Элементы.ОформлениеНастроитьКолонтитулы.Видимость = ГлобальныеНастройки.ВыводитьИндивидуальныеНастройкиКолонтитулов И Не РежимИзмененияЭлементаСтруктурыНастроек И (Не ОбщегоНазначения.РазделениеВключено() Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); Если РежимИзмененияЭлементаСтруктурыНастроек Тогда ИмяСтраницы = ?(ПустаяСтрока(Параметры.ИмяСтраницы), "СтраницаСоставГруппировки", Параметры.ИмяСтраницы); РасширенныйРежим = 1; Иначе РасширенныйРежим = ОписаниеНастроекОтчета.ФормаНастроекРасширенныйРежим; ИмяСтраницы = ОписаниеНастроекОтчета.ФормаНастроекИмяСтраницы; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда // Подсчитываем количество созданий формы, стандартный разделитель ".". ТекущиеРежим = Элементы.РасширенныйРежим.СписокВыбора.НайтиПоЗначению(РасширенныйРежим); Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 режим'"), ТекущиеРежим.Представление); МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ОбщаяФорма.ФормаНастроекОтчета", 1, Комментарий); КонецЕсли; Страница = Элементы.Найти(ИмяСтраницы); Если Страница <> Неопределено Тогда Элементы.СтраницыНастроек.ТекущаяСтраница = Страница; КонецЕсли; Если ОписаниеНастроекОтчета.СхемаМодифицирована Тогда Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОписаниеНастроекОтчета.АдресСхемы)); КонецЕсли; ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт; Элементы.СтруктураВариантаЗаголовок.Шрифт = ШрифтВажнойНадписи.Значение; // Регистрация команд и реквизитов формы, которые не удаляются при перезаполнении быстрых настроек. НаборРеквизитов = ПолучитьРеквизиты(); Для Каждого Реквизит Из НаборРеквизитов Цикл ПостоянныеРеквизиты.Добавить(ПолноеИмяРеквизита(Реквизит)); КонецЦикла; Для Каждого Команда Из Команды Цикл ПостоянныеКоманды.Добавить(Команда.Имя); КонецЦикла; НеобходимоОбновитьНастройки = Истина; СистемнаяИнформация = Новый СистемнаяИнформация; Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.23.1688") >= 0 Тогда Элементы.ОтборыЗначение.РасширенноеРедактированиеМножественныхЗначений = Истина; Элементы.ОтборыПравоеЗначение.РасширенноеРедактированиеМножественныхЗначений = Истина; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПередЗагрузкойВариантаНаСервере(НовыеНастройкиКД) Если ВариантыОтчетов.ДопустимоУстановитьКонтекст(ЭтотОбъект) И ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") Тогда ОтчетыСервер.УстановитьФиксированныеОтборы(ФормаПараметры.Отбор, НовыеНастройкиКД, НастройкиОтчета); КонецЕсли; НеобходимоОбновитьНастройки = Истина; // Подготовка к вызову события переинициализации. Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда Попытка НовыеНастройкиXML = ОбщегоНазначения.ЗначениеВСтрокуXML(НовыеНастройкиКД); Исключение НовыеНастройкиXML = Неопределено; КонецПопытки; НастройкиОтчета.НовыеНастройкиXML = НовыеНастройкиXML; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(НовыеПользовательскиеНастройкиКД) НеобходимоОбновитьНастройки = Истина; // Подготовка к вызову события переинициализации. Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда Попытка НовыеПользовательскиеНастройкиXML = ОбщегоНазначения.ЗначениеВСтрокуXML(НовыеПользовательскиеНастройкиКД); Исключение НовыеПользовательскиеНастройкиXML = Неопределено; КонецПопытки; НастройкиОтчета.НовыеПользовательскиеНастройкиXML = НовыеПользовательскиеНастройкиXML; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ВариантМодифицирован = Ложь; Если НеобходимоОбновитьНастройки Тогда НеобходимоОбновитьНастройки = Ложь; ПараметрыЗаполнения = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета("ПриСозданииНаСервере"); ПараметрыЗаполнения.ОбновитьНастройкиВарианта = Не РежимИзмененияЭлементаСтруктурыНастроек И РасширенныйРежим = 1; ОбновитьФорму(ПараметрыЗаполнения); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Если Не РезультатВыбораСформирован Тогда Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); Модифицированность = Модифицированность Или ВариантМодифицирован Или ПользовательскиеНастройкиМодифицированы; ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы, НСтр("ru = 'Настройки изменены. Сохранить изменения?'")); КонецЕсли; ПользовательскиеНастройкиМодифицированы = Ложь; ВариантМодифицирован = Ложь; КонецПроцедуры &НаКлиенте Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт Если ОписаниеОповещенияОЗакрытии <> Неопределено Тогда ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, РезультатВыбора(Ложь)); КонецЕсли; Закрыть(); КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте Процедура РасширенныйРежимПриИзменении(Элемент) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда // Подсчитываем количество переключений режима, стандартный разделитель ".". МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент"); МодульЦентрМониторингаКлиент.ЗаписатьОперациюБизнесСтатистики("ОбщаяФорма.ФормаНастроекОтчета.РасширенныйРежим.ПриИзменении", 1); КонецЕсли; ПараметрыОбновления = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета("РасширенныйРежимПриИзменении"); ПараметрыОбновления.КомпоновщикНастроекКД = Отчет.КомпоновщикНастроек; ПараметрыОбновления.ОбновитьНастройкиВарианта = (РасширенныйРежим = 1); ПараметрыОбновления.СброситьПользовательскиеНастройки = (РасширенныйРежим <> 1); ОбновитьФорму(ПараметрыОбновления); КонецПроцедуры &НаКлиенте Процедура ПредупрежденияОбОтсутствииПользовательскихНастроекОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; РасширенныйРежим = 1; РасширенныйРежимПриИзменении(Неопределено); КонецПроцедуры &НаКлиенте Процедура ТекущийТипДиаграммыПриИзменении(Элемент) ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлементаСтруктурыНастроек); Если ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда ЭлементСтруктуры = ЭлементСтруктуры.Настройки; КонецЕсли; УстановитьПараметрВывода(ЭлементСтруктуры, "ТипДиаграммы", ТекущийТипДиаграммы); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки(Элемент, Адрес, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Строка = Элементы.СтруктураВарианта.ТекущиеДанные; ИзменитьЭлементСтруктуры(Строка,, Истина); КонецПроцедуры &НаКлиенте Процедура ВыводитьЗаголовокПриИзменении(Элемент) ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы; ЭлементНастройки = ПредопределенныеПараметры.Найти("TITLE"); ЭлементНастройки.Использование = ВыводитьЗаголовок; СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьЗаголовок, ЭлементНастройки); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ВыводитьФильтрыПриИзменении(Элемент) ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы; ЭлементНастройки = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT"); ЭлементНастройки.Использование = Истина; Если ВыводитьФильтры Тогда ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто; Иначе ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить; КонецЕсли; СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьФильтры, ЭлементНастройки); УстановитьМодифицированность(); КонецПроцедуры #Область Подключаемые &НаКлиенте Процедура Подключаемый_Период_ПриИзменении(Элемент) ОтчетыКлиент.УстановитьПериод(ЭтотОбъект, Элемент.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ЭлементНастройки_ПриИзменении(Элемент) КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя]; Если Индекс = Неопределено Тогда Индекс = ОтчетыКлиентСервер.ИндексЭлементаНастройкиПоПути(Элемент.Имя); КонецЕсли; ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; ЭтоФлажок = СтрНачинаетсяС(Элемент.Имя, "Флажок") Или СтрЗаканчиваетсяНа(Элемент.Имя, "Флажок"); Если ЭтоФлажок Тогда ЭлементНастройки.Значение = ЭтотОбъект[Элемент.Имя]; КонецЕсли; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") И НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда ПараметрыОбновления = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета(); ПараметрыОбновления.КомпоновщикНастроекКД = КомпоновщикНастроек; ОбновитьФорму(ПараметрыОбновления); Иначе ОформитьСписок(Элемент, ЭлементНастройки); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_ПриИзменении(Элемент) КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя]; ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; Список = ЭтотОбъект[Элемент.Имя]; ВыбранныеЗначения = Новый СписокЗначений; Для Каждого ЭлементСписка Из Список Цикл Если ЭлементСписка.Пометка Тогда ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка); КонецЕсли; КонецЦикла; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда ЭлементНастройки.Значение = ВыбранныеЗначения; ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда ЭлементНастройки.ПравоеЗначение = ВыбранныеЗначения; КонецЕсли; ЭлементНастройки.Использование = Истина; ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); ОформитьСписок(Элемент, ЭлементНастройки); КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_ПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) ПутьКСписку = Элемент.Имя; ЭлементСписка = Элементы[Элемент.Имя + "Значение"]; ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь); ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку; ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ВыборПереопределен = Ложь; НачатьЗаполнениеСписка(ЭлементСписка, ПараметрыЗаполнения, ВыборПереопределен); Если ВыборПереопределен Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_ПередНачаломИзменения(Элемент, Отказ) Список_ПередНачаломИзменения = Элемент; ЭлементСписка = Элементы[Элемент.Имя + "Значение"]; ЭлементСписка.РедактированиеТекста = Ложь; ПодключитьОбработчикОжидания("Список_ПриНачалеИзменения", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_ОбработкаВыбора(Элемент, РезультатВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Список = ЭтотОбъект[Элемент.Имя]; Выбранные = ОтчетыКлиентСервер.ЗначенияСписком(РезультатВыбора); Выбранные.ЗаполнитьПометки(Истина); Дополнение = ОбщегоНазначенияКлиентСервер.ДополнитьСписок(Список, Выбранные, Ложь, Истина); ЗначениеЭлементаНастройки = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Список); Индекс = ЗначениеЭлементаНастройки.Количество() - 1; Пока Индекс >= 0 Цикл ТекущееЗначение = ЗначениеЭлементаНастройки[Индекс]; Если Не ТекущееЗначение.Пометка Тогда ЗначениеЭлементаНастройки.Удалить(ТекущееЗначение); КонецЕсли; Индекс = Индекс - 1; КонецЦикла; Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя]; КомпоновщикНастроек = Отчет.КомпоновщикНастроек; ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда ЭлементНастройки.Значение = ЗначениеЭлементаНастройки; Иначе ЭлементНастройки.ПравоеЗначение = ЗначениеЭлементаНастройки; КонецЕсли; ЭлементНастройки.Использование = Истина; ОформитьСписок(Элемент, ЭлементНастройки); Если Дополнение.Всего > 0 Тогда Если Дополнение.Всего = 1 Тогда ЗаголовокОповещения = НСтр("ru = 'Элемент добавлен в список'"); Иначе ЗаголовокОповещения = НСтр("ru = 'Элементы добавлены в список'"); КонецЕсли; ПоказатьОповещениеПользователя( ЗаголовокОповещения,, Строка(Выбранные), БиблиотекаКартинок.ВыполнитьЗадачу); КонецЕсли; ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ПометкаЭлементаСписка_ПриИзменении(Элемент) ОтключитьОбработчикОжидания("Список_ПриНачалеИзменения"); Список_ПередНачаломИзменения.ЗакончитьРедактированиеСтроки(Истина); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ЭлементСписка_ПриИзменении(Элемент) ПутьКСписку = СтрЗаменить(Элемент.Имя, "Значение", ""); Строка = Элементы[ПутьКСписку].ТекущиеДанные; ЭлементСписка = ЭтотОбъект[ПутьКСписку].НайтиПоЗначению(Строка.Значение); ЭлементСписка.Пометка = Истина; КонецПроцедуры &НаКлиенте Процедура Подключаемый_ЭлементСписка_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ПутьКСписку = СтрЗаменить(Элемент.Имя, "Значение", ""); ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь, Ложь); ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку; ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ПараметрыЗаполнения.Владелец = Элемент; ТекущееЗначение = Элементы[ПутьКСписку].ТекущиеДанные.Значение; Если ТекущееЗначение <> Неопределено Тогда Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, ПараметрыЗаполнения.Индекс); ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент); ПараметрыЗаполнения.Вставить("ПараметрыВыбора", ПараметрыВыбора); ПараметрыЗаполнения.Вставить("ТекущаяСтрока", ТекущееЗначение); СписокТипов = Новый СписокЗначений; СписокТипов.Добавить(ТипЗнч(ТекущееЗначение)); ПродолжитьЗаполнениеСписка(СписокТипов[0], ПараметрыЗаполнения); Возврат; КонецЕсли; НачатьЗаполнениеСписка(Элемент, ПараметрыЗаполнения); КонецПроцедуры #КонецОбласти #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСортировка &НаКлиенте Процедура СортировкаВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Строка = Элементы.Сортировка.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда Если Поле = Элементы.СортировкаПоле Тогда // Изменение поля #Если Не МобильныйКлиент Тогда СортировкаВыбратьПоле(ИдентификаторСтроки, Строка); #КонецЕсли ИначеЕсли Поле = Элементы.СортировкаТипУпорядочивания Тогда // Изменение порядка. ИзменитьТипУпорядочивания(Строка); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СортировкаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; ВыбратьПоле("Сортировка", Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура СортировкаПередУдалением(Элемент, Отказ) УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура СортировкаИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("Сортировка"); КонецПроцедуры &НаКлиенте Процедура Сортировка_ПоУбыванию(Команда) ИзменитьТипУпорядочиванияСтрок(НаправлениеСортировкиКомпоновкиДанных.Убыв); КонецПроцедуры &НаКлиенте Процедура Сортировка_ПоВозрастанию(Команда) ИзменитьТипУпорядочиванияСтрок(НаправлениеСортировкиКомпоновкиДанных.Возр); КонецПроцедуры &НаКлиенте Процедура Сортировка_ПереместитьВверх(Команда) СдвинутьСортировку(); КонецПроцедуры &НаКлиенте Процедура Сортировка_ПереместитьВниз(Команда) СдвинутьСортировку(Ложь); КонецПроцедуры &НаКлиенте Процедура Сортировка_УстановитьФлажки(Команда) ИзменитьИспользование("Сортировка"); КонецПроцедуры &НаКлиенте Процедура Сортировка_СнятьФлажки(Команда) ИзменитьИспользование("Сортировка", Ложь); КонецПроцедуры &НаКлиенте Процедура СортировкаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание) ИсточникПеретаскиванияНаКлиенте = Элемент.Имя; КонецПроцедуры &НаКлиенте Процедура СортировкаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) ПриемникПеретаскиванияНаКлиенте = Элемент.Имя; Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СортировкаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) СтандартнаяОбработка = Ложь; Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока); ИначеЕсли ИсточникПеретаскиванияНаКлиенте = Элементы.ВыбранныеПоля.Имя Тогда ПеретащитьВыбранныеПоляВСортировку(ПараметрыПеретаскивания.Значение); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СортировкаОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Сортировка_Вправо(Команда) ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки; Если ИдентификаторыСтрок = Неопределено Тогда Возврат; КонецЕсли; Строки = Новый Массив; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); Если ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда Строки.Добавить(Строка); КонецЕсли; КонецЦикла; ПеретащитьВыбранныеПоляВСортировку(Строки); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Сортировка_Влево(Команда) ИдентификаторыСтрок = Элементы.Сортировка.ВыделенныеСтроки; Если ИдентификаторыСтрок = Неопределено Тогда Возврат; КонецЕсли; Строки = Новый Массив; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки); Если ТипЗнч(Строка.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда Строки.Добавить(Строка); КонецЕсли; КонецЦикла; ПеретащитьПоляСортировкиВВыбранныеПоля(Строки); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Сортировка_ВлевоВсе(Команда) ПеретащитьПоляСортировкиВВыбранныеПоля(Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы()); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ГруппаИ(Команда) ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; Если ИдентификаторСтроки <> Неопределено Тогда ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ, ИдентификаторСтроки); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ГруппаИли(Команда) ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; Если ИдентификаторСтроки <> Неопределено Тогда ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли, ИдентификаторСтроки); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ГруппаНе(Команда) ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; Если ИдентификаторСтроки <> Неопределено Тогда ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе, ИдентификаторСтроки); КонецЕсли; КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля &НаКлиенте Процедура ВыбранныеПоляВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; #Если МобильныйКлиент Тогда Возврат; #КонецЕсли Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; Если Поле = Элементы.ВыбранныеПоляПоле Тогда // Изменение порядка. Если Строка.ЭтоГруппа Тогда ВыбранныеПоляВыбратьГруппу(ИдентификаторСтроки, Строка); ИначеЕсли ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда ВыбранныеПоляВыбратьПоле(ИдентификаторСтроки, Строка); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПриАктивизацииСтроки(Элемент) ПодключитьОбработчикОжидания("ПослеАктивизацииВыбранныхПолей", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПередУдалением(Элемент, Отказ) Если РасширенныйРежим = 0 Тогда Отказ = Истина; Возврат; КонецЕсли; УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("ВыбранныеПоля"); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ПереместитьВверх(Команда) СдвинутьВыбранныеПоля(); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_ПереместитьВниз(Команда) СдвинутьВыбранныеПоля(Ложь); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Сгруппировать(Команда) ПараметрыГруппировки = ПараметрыГруппировкиВыбранныхПолей(); Если ПараметрыГруппировки = Неопределено Тогда Возврат; КонецЕсли; ПараметрыФормы = Новый Структура("Расположение", РасположениеПоляКомпоновкиДанных.Авто); Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПередГруппировкойПолей", ЭтотОбъект, ПараметрыГруппировки); ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_Разгруппировать(Команда) ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки; Если ИдентификаторыСтрок.Количество() <> 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите одну группу.'")); Возврат; КонецЕсли; РодительСтрокиИсточника = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторыСтрок[0]); Если ТипЗнч(РодительСтрокиИсточника.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); РодительЭлементаНастройкиИсточника = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(РодительСтрокиИсточника.Идентификатор); Если ТипЗнч(РодительЭлементаНастройкиИсточника) <> Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); Возврат; КонецЕсли; РодительЭлементаНастройкиПриемника = РодительЭлементаНастройкиИсточника.Родитель; Если РодительЭлементаНастройкиИсточника.Родитель = Неопределено Тогда РодительЭлементаНастройкиПриемника = СвойствоЭлементаСтруктуры; КонецЕсли; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(РодительЭлементаНастройкиИсточника, РодительЭлементаНастройкиПриемника); РодительСтрокиПриемника = РодительСтрокиИсточника.ПолучитьРодителя(); НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(РодительСтрокиИсточника, РодительСтрокиПриемника); ИзменитьГруппировкуВыбранныхПолей(СвойствоЭлементаСтруктуры, РодительСтрокиИсточника.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок); // Удаление базовых элементов группировки. РодительСтрокиПриемника.ПолучитьЭлементы().Удалить(РодительСтрокиИсточника); РодительЭлементаНастройкиПриемника.Элементы.Удалить(РодительЭлементаНастройкиИсточника); Раздел = ВыбранныеПоля.ПолучитьЭлементы()[0]; Элементы.ВыбранныеПоля.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); Элементы.ВыбранныеПоля.ТекущаяСтрока = РодительСтрокиПриемника.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_УстановитьФлажки(Команда) ИзменитьИспользование("ВыбранныеПоля"); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоля_СнятьФлажки(Команда) ИзменитьИспользование("ВыбранныеПоля", Ложь); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание) ИсточникПеретаскиванияНаКлиенте = Элемент.Имя; ПроверитьПеретаскиваемыеСтрокиИзВыбранныхПолей(ПараметрыПеретаскивания.Значение); Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда РазрешитьПеретаскивание = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) Если ИсточникПеретаскиванияНаКлиенте <> Элемент.Имя Или ТекущаяСтрока = Неопределено Тогда Возврат; КонецЕсли; ТекущиеДанные = ВыбранныеПоля.НайтиПоИдентификатору(ТекущаяСтрока); Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда СтрокаПриемник = ТекущиеДанные; Иначе СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя(); КонецЕсли; Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл СтрокаПеретаскивание = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); Если ЭтоПодчиненныеЭлементы(СтрокаПеретаскивание, СтрокаПриемник) Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; КонецЦикла; ПриемникПеретаскиванияНаКлиенте = Элемент.Имя; Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда ПеретащитьВыбранныеПоляВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока); Иначе ПеретащитьПоляСортировкиВВыбранныеПоля(ПараметрыПеретаскивания.Значение); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда Возврат; КонецЕсли; Если ПриемникПеретаскиванияНаКлиенте <> Элемент.Имя Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Строки = ПараметрыПеретаскивания.Значение; Родитель = Строки[0].ПолучитьРодителя(); Индекс = Строки.ВГраница(); Пока Индекс >= 0 Цикл Строка = Строки[Индекс]; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); РодительЭлементаНастройки = СвойствоЭлементаСтруктуры; Если ЭлементНастройки.Родитель <> Неопределено Тогда РодительЭлементаНастройки = ЭлементНастройки.Родитель; КонецЕсли; РодительЭлементаНастройки.Элементы.Удалить(ЭлементНастройки); Родитель.ПолучитьЭлементы().Удалить(Строка); Индекс = Индекс - 1; КонецЦикла; КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыОтборы &НаКлиенте Процедура Отборы_Сгруппировать(Команда) ПараметрыГруппировки = ПараметрыГруппировкиОтборов(); Если ПараметрыГруппировки = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); // Обработка элементов настроек. ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры; Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор); КонецЕсли; ЭлементНастройкиПриемник = ЭлементНастройкиИсточник.Элементы.Вставить(ПараметрыГруппировки.Индекс, Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ЭлементНастройкиПриемник.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор; ЭлементНастройкиПриемник.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); // Обработка строк. СтрокаИсточник = ПараметрыГруппировки.Родитель; ЭлементыИсточника = СтрокаИсточник.ПолучитьЭлементы(); СтрокаПриемник = ЭлементКоллекцииФормыНастроек(СтрокаИсточник); СтрокаПриемник = ЭлементыИсточника.Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек УстановитьДанныеСтрокиОтборов(СтрокаПриемник, СвойствоЭлементаСтруктуры, ЭлементНастройкиПриемник); СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок); УдалитьБазовыеЭлементыГруппировкиОтборов(СвойствоЭлементаСтруктуры, ПараметрыГруппировки); Раздел = КорневаяСтрокаПоУмолчанию("Отборы"); Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); Элементы.Отборы.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура Отборы_Разгруппировать(Команда) ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки; Если ИдентификаторыСтрок.Количество() <> 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите одну группу.'")); Возврат; КонецЕсли; РодительСтрокиИсточника = Отборы.НайтиПоИдентификатору(ИдентификаторыСтрок[0]); Если ТипЗнч(РодительСтрокиИсточника.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); РодительЭлементаНастройкиИсточника = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(РодительСтрокиИсточника.Идентификатор); Если ТипЗнч(РодительЭлементаНастройкиИсточника) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); Возврат; КонецЕсли; РодительЭлементаНастройкиПриемника = РодительЭлементаНастройкиИсточника.Родитель; Если РодительЭлементаНастройкиИсточника.Родитель = Неопределено Тогда РодительЭлементаНастройкиПриемника = СвойствоЭлементаСтруктуры; КонецЕсли; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(РодительЭлементаНастройкиИсточника, РодительЭлементаНастройкиПриемника); РодительСтрокиПриемника = РодительСтрокиИсточника.ПолучитьРодителя(); НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(РодительСтрокиИсточника, РодительСтрокиПриемника); ИзменитьГруппировкуОтборов(СвойствоЭлементаСтруктуры, РодительСтрокиИсточника.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок); // Удаление базовых элементов группировки. РодительСтрокиПриемника.ПолучитьЭлементы().Удалить(РодительСтрокиИсточника); РодительЭлементаНастройкиПриемника.Элементы.Удалить(РодительЭлементаНастройкиИсточника); Раздел = КорневаяСтрокаПоУмолчанию("Отборы"); Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); Элементы.Отборы.ТекущаяСтрока = РодительСтрокиПриемника.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура Отборы_ПереместитьВверх(Команда) СдвинутьОтборы(); КонецПроцедуры &НаКлиенте Процедура Отборы_ПереместитьВниз(Команда) СдвинутьОтборы(Ложь); КонецПроцедуры &НаКлиенте Процедура Отборы_УстановитьФлажки(Команда) ИзменитьИспользование("Параметры"); ИзменитьИспользование("Отборы"); КонецПроцедуры &НаКлиенте Процедура Отборы_СнятьФлажки(Команда) ИзменитьИспользование("Параметры", Ложь); ИзменитьИспользование("Отборы", Ложь); КонецПроцедуры &НаКлиенте Процедура Отборы_ПоказыватьВШапкеОтчета(Команда) ОтборыУстановитьРежимОтображения("ПоказыватьВШапкеОтчета"); КонецПроцедуры &НаКлиенте Процедура Отборы_ПоказыватьВНастройкахОтчета(Команда) ОтборыУстановитьРежимОтображения("ПоказыватьВНастройкахОтчета"); КонецПроцедуры &НаКлиенте Процедура Отборы_ПоказыватьТолькоФлажокВШапкеОтчета(Команда) ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВШапкеОтчета"); КонецПроцедуры &НаКлиенте Процедура Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета(Команда) ОтборыУстановитьРежимОтображения("ПоказыватьТолькоФлажокВНастройкахОтчета"); КонецПроцедуры &НаКлиенте Процедура Отборы_НеПоказывать(Команда) ОтборыУстановитьРежимОтображения("НеПоказывать"); КонецПроцедуры &НаКлиенте Процедура ОтборыВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка) Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Или Строка.ЭтоРаздел Тогда Возврат; КонецЕсли; Если Поле = Элементы.ОтборыПоле Или Поле = Элементы.ОтборыПараметр Или Поле = Элементы.ОтборыТипГруппы Тогда СтандартнаяОбработка = Ложь; Если Строка.ЭтоПараметр Тогда Возврат; КонецЕсли; Если Строка.ЭтоГруппа Тогда ОтборыВыбратьГруппу(ИдентификаторСтроки); КонецЕсли; ИначеЕсли Поле = Элементы.ОтборыКартинкаРежимаОтображения Тогда // Изменение быстрого доступа к отбору. СтандартнаяОбработка = Ложь; Если Строка.ЭтоПараметр Тогда СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); Иначе СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); КонецЕсли; ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Отборы", ИдентификаторСтроки, Истина, Не Строка.ЭтоПараметр); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыПриАктивизацииСтроки(Элемент) УстановитьПараметрыРедактированияЭлементаОтбора(); ПодключитьОбработчикОжидания("ОтборыПриИзмененииТекущейСтроки", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура ОтборыПриАктивизацииЯчейки(Элемент) Строка = Элемент.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; ЭтоПолеСписка = Строка.ДоступенСписокЗначений Или ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения); ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение); ПолеЗначения.ОграничениеТипа = ?(ЭтоПолеСписка, Новый ОписаниеТипов("СписокЗначений"), Строка.ТипЗначения); ПолеЗначения.РежимВыбораИзСписка = Не ЭтоПолеСписка И (Строка.ДоступныеЗначения <> Неопределено); ПривестиЗначениеКВидуСравнения(Строка); УстановитьПредставлениеЗначения(Строка, Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора); КонецПроцедуры &НаКлиенте Процедура ОтборыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; ОтборыПередВыборомПоля(); КонецПроцедуры &НаКлиенте Процедура ОтборыПолеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ОтборыПередВыборомПоля(Элементы.Отборы.ТекущаяСтрока); КонецПроцедуры &НаКлиенте Процедура ОтборыПолеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если ВыбранноеЗначение = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора.НайтиПоле(ВыбранноеЗначение); ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; ОтборыПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки); КонецПроцедуры &НаКлиенте Процедура ОтборыПолеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) Запрос = СокрЛП(Текст); Если Не ЗначениеЗаполнено(Запрос) Тогда Возврат; КонецЕсли; Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Или Строка.ЭтоРаздел Или Строка.ЭтоГруппа Или Строка.ЭтоПараметр Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора; ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу(Запрос, ДанныеВыбора, ДоступныеПоля); КонецПроцедуры &НаКлиенте Процедура ОтборыПередУдалением(Элемент, Отказ) УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура ОтборыИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("Отборы"); КонецПроцедуры &НаКлиенте Процедура ОтборыВидСравненияПриИзменении(Элемент) Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.ВидСравнения = Строка.ВидСравнения; Если Строка.ЭтоПараметр Тогда Условие = ВидСравненияКомпоновкиДанных.Равно; Если Строка.ДоступенСписокЗначений Тогда Условие = ВидСравненияКомпоновкиДанных.ВСписке; КонецЕсли; Иначе Условие = Строка.ВидСравнения; КонецЕсли; ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение); ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы(Строка.ВыборГруппИЭлементов, Условие); ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ОтборыЗначениеПриИзменении(Элемент) Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.Значение = Строка.Значение; УстановитьМодифицированность(); УстановитьПредставлениеЗначения(Строка, Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора); Если НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда ВариантБылМодифицирован = ВариантМодифицирован; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); ВариантМодифицирован = ВариантБылМодифицирован; ПараметрыОбновления = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета(); ПараметрыОбновления.КомпоновщикНастроекКД = Отчет.КомпоновщикНастроек; ПараметрыОбновленияВариантМодифицирован = ВариантМодифицирован; ПараметрыОбновления.ПользовательскиеНастройкиМодифицированы = ПользовательскиеНастройкиМодифицированы; ПараметрыОбновления.СброситьПользовательскиеНастройки = Истина; ОбновитьФорму(ПараметрыОбновления); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Строка = Элементы.Отборы.ТекущиеДанные; УстановитьПараметрыРедактирования(Строка); Если ВыборПереопределен(Строка, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; Если Строка.ДоступенСписокЗначений Тогда ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыПравоеЗначениеПриИзменении(Элемент) Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; Строка.Использование = Истина; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЗаполнитьЗначенияСвойств(ЭлементНастройки, Строка, "Использование, ПравоеЗначение"); УстановитьМодифицированность(); УстановитьПредставлениеЗначения(Строка, Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора); КонецПроцедуры &НаКлиенте Процедура ОтборыПравоеЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Строка = Элементы.Отборы.ТекущиеДанные; УстановитьПараметрыРедактирования(Строка); Если ВыборПереопределен(Строка, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; Если ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыПредставлениеПользовательскойНастройкиПриИзменении(Элемент) Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; Если ПустаяСтрока(Строка.ПредставлениеПользовательскойНастройки) Тогда Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок; КонецЕсли; Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки); Если Строка.ЭтоПараметр Тогда СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); Иначе СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); КонецЕсли; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если Строка.ЭтоПредопределенныйЗаголовок Тогда ЭлементНастройки.ПредставлениеПользовательскойНастройки = ""; Иначе ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.ПредставлениеПользовательскойНастройки; КонецЕсли; Если Не Строка.ЭтоПараметр Тогда Если Строка.КартинкаРежимаОтображения = 1 Или Строка.КартинкаРежимаОтображения = 3 Тогда // Когда ПредставлениеПользовательскойНастройки заполнено, // то Представление работает как переключатель, // но также может использоваться для вывода в табличный документ. ЭлементНастройки.Представление = Строка.ПредставлениеПользовательскойНастройки; Иначе ЭлементНастройки.Представление = ""; КонецЕсли; КонецЕсли; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ОтборыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, РазрешитьПеретаскивание) ИсточникПеретаскиванияНаКлиенте = Элемент.Имя; ПроверитьПеретаскиваемыеСтрокиИзОтборов(ПараметрыПеретаскивания.Значение); Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда РазрешитьПеретаскивание = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) Если ТекущаяСтрока = Неопределено Или ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Массив") Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; Строка = Отборы.НайтиПоИдентификатору(ТекущаяСтрока); Родитель = Строка.ПолучитьРодителя(); Если (Родитель <> Неопределено И Родитель.Идентификатор = "ПараметрыДанных") ИЛИ Строка.Идентификатор = "ПараметрыДанных" Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; ТекущиеДанные = Отборы.НайтиПоИдентификатору(ТекущаяСтрока); Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда СтрокаПриемник = ТекущиеДанные; Иначе СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя(); КонецЕсли; Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл СтрокаПеретаскивание = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Если ЭтоПодчиненныеЭлементы(СтрокаПеретаскивание, СтрокаПриемник) Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; КонецЦикла; ПриемникПеретаскиванияНаКлиенте = Элемент.Имя; Если ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ТекущаяСтрока, Поле) Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; Если ИсточникПеретаскиванияНаКлиенте = Элемент.Имя Тогда ПеретащитьОтборыВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОтборыОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда Возврат; КонецЕсли; Если ПриемникПеретаскиванияНаКлиенте <> Элемент.Имя Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Строки = ПараметрыПеретаскивания.Значение; Родитель = Строки[0].ПолучитьРодителя(); Индекс = Строки.ВГраница(); Пока Индекс >= 0 Цикл Строка = Строки[Индекс]; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); РодительЭлементаНастройки = СвойствоЭлементаСтруктуры; Если ЭлементНастройки.Родитель <> Неопределено Тогда РодительЭлементаНастройки = ЭлементНастройки.Родитель; КонецЕсли; РодительЭлементаНастройки.Элементы.Удалить(ЭлементНастройки); Родитель.ПолучитьЭлементы().Удалить(Строка); Индекс = Индекс - 1; КонецЦикла; КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля &НаКлиенте Процедура ИзменитьФормулу(Команда) Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; Если Строка = Неопределено Или Не Строка.ЭтоФормула Тогда Возврат; КонецЕсли; Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Отчет.КомпоновщикНастроек.Настройки, Строка(Строка.Поле)); Если ТипЗнч(Формула) <> Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных") Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗакрытииФормыНастроекДляТехническогоСпециалиста", ЭтотОбъект); ОткрытьФормуНастроекДляТехническогоСпециалиста("СтраницаПользовательскихПолей", ОписаниеОповещения); Возврат; КонецЕсли; ВариантыОтчетовСлужебныйКлиент.ИзменитьФормулу( ЭтотОбъект, Отчет.КомпоновщикНастроек.Настройки, Строка(Строка.Поле)); КонецПроцедуры // Параметры: // ОписаниеФормулы - ДоступноеПолеКомпоновкиДанных // - Структура: // * Наименование - Строка // * ПредставлениеФормулы - Строка // * Формула - Строка // Формула - Структура: // * КоллекцияПолей - ДоступныеПоляКомпоновкиДанных // * Формула - ПользовательскоеПолеВыражениеКомпоновкиДанных // &НаКлиенте Процедура ПослеИзмененияФормулы(ОписаниеФормулы, Формула) Экспорт Если ТипЗнч(ОписаниеФормулы) <> Тип("Структура") Тогда Возврат; КонецЕсли; ВариантыОтчетовСлужебныйКлиент.ПослеИзмененияФормулы(ОписаниеФормулы, Формула); Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; // ДанныеФормыЭлементДерева Если Строка <> Неопределено Тогда Строка.Заголовок = ОписаниеФормулы.Заголовок; КонецЕсли; УстановитьМодифицированность(); КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСтруктураВарианта &НаКлиенте Процедура СтруктураВариантаПриАктивизацииСтроки(Элемент) ПодключитьОбработчикОжидания("СтруктураВариантаПриИзмененииТекущейСтроки", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаВыбор(Элемент, СтрокаИдентификатор, Поле, СтандартнаяОбработка) Если РасширенныйРежим = 0 Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; Строка = Элемент.ТекущиеДанные; Если Строка = Неопределено Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; Если Строка.Тип = "НастройкиКомпоновкиДанных" Или Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" Или Строка.Тип = "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных" Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; Если Поле = Элементы.СтруктураВариантаПредставление Или Поле = Элементы.СтруктураВариантаСодержитОтборы Или Поле = Элементы.СтруктураВариантаСодержитПоляИлиСортировки Или Поле = Элементы.СтруктураВариантаСодержитУсловноеОформление Тогда СтандартнаяОбработка = Ложь; ИмяСтраницы = Неопределено; Если Поле = Элементы.СтруктураВариантаСодержитОтборы Тогда ИмяСтраницы = "СтраницаОтборы"; ИначеЕсли Поле = Элементы.СтруктураВариантаСодержитПоляИлиСортировки Тогда ИмяСтраницы = "СтраницаВыбранныеПоляИСортировки"; ИначеЕсли Поле = Элементы.СтруктураВариантаСодержитУсловноеОформление Тогда ИмяСтраницы = "СтраницаОформление"; КонецЕсли; ИзменитьЭлементСтруктуры(Строка, ИмяСтраницы); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Не Элементы.СтруктураВарианта_Добавить.Доступность Тогда Возврат; КонецЕсли; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; ДобавитьГруппировкуСтруктурыВарианта(); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_Сгруппировать(Команда) Если Элементы.СтруктураВарианта_Сгруппировать.Доступность Тогда ДобавитьГруппировкуСтруктурыВарианта(Ложь); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ДобавитьТаблицу(Команда) Если Элементы.СтруктураВарианта_ДобавитьТаблицу.Доступность Тогда ДобавитьЭлементСтруктурыНастроек(Тип("ТаблицаКомпоновкиДанных")); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ДобавитьДиаграмму(Команда) Если Элементы.СтруктураВарианта_ДобавитьДиаграмму.Доступность Тогда ДобавитьЭлементСтруктурыНастроек(Тип("ДиаграммаКомпоновкиДанных")); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_УстановитьФлажки(Команда) ИзменитьИспользование("СтруктураВарианта"); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_СнятьФлажки(Команда) ИзменитьИспользование("СтруктураВарианта", Ложь); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) // Проверка общих условий. Если РасширенныйРежим = 0 Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; // Проверка источника. Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); Если Строка = Неопределено Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; Если Строка.Тип = "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных" Или Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" Или Строка.Тип = "НастройкиКомпоновкиДанных" Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле) // Проверка общих условий. Если ИдентификаторЦели = Неопределено Или ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Число") Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; // Проверка источника. Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); Если Строка = Неопределено Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; // Проверка приемника. НовыйРодитель = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторЦели); Если НовыйРодитель = Неопределено Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; Если НовыйРодитель.Тип = "ТаблицаКомпоновкиДанных" Или НовыйРодитель.Тип = "ДиаграммаКомпоновкиДанных" Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; // Проверка совместимости источника с приемником. ДопустимоТолькоНаличиеГруппировок = Ложь; Если НовыйРодитель.Тип = "КоллекцияЭлементовСтруктурыТаблицы" Или НовыйРодитель.Тип = "КоллекцияЭлементовСтруктурыДиаграммы" Или НовыйРодитель.Тип = "ГруппировкаТаблицы" Или НовыйРодитель.Тип = "ГруппировкаДиаграммы" Тогда ДопустимоТолькоНаличиеГруппировок = Истина; КонецЕсли; Если ДопустимоТолькоНаличиеГруппировок И Строка.Тип <> "Группировка" И Строка.Тип <> "ГруппировкаТаблицы" И Строка.Тип <> "ГруппировкаДиаграммы" Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; КоллекцииКоллекций = Новый Массив; КоллекцииКоллекций.Добавить(Строка.ПолучитьЭлементы()); Количество = 1; Пока Количество > 0 Цикл Коллекция = КоллекцииКоллекций[0]; Количество = Количество - 1; КоллекцииКоллекций.Удалить(0); Для Каждого ВложеннаяСтрока Из Коллекция Цикл Если ВложеннаяСтрока = НовыйРодитель Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; Если ДопустимоТолькоНаличиеГруппировок И ВложеннаяСтрока.Тип <> "Группировка" И ВложеннаяСтрока.Тип <> "ГруппировкаТаблицы" И ВложеннаяСтрока.Тип <> "ГруппировкаДиаграммы" Тогда ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Возврат; КонецЕсли; КоллекцииКоллекций.Добавить(ВложеннаяСтрока.ПолучитьЭлементы()); Количество = Количество + 1; КонецЦикла; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИдентификаторЦели, Поле) // Все проверки пройдены. СтандартнаяОбработка = Ложь; Строка = СтруктураВарианта.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); НовыйРодитель = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторЦели); ДополнительныеПараметры = ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта(); ДополнительныеПараметры.Копировать = ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование; Результат = ПереместитьЭлементыСтруктурыВарианта(Строка, НовыйРодитель, ДополнительныеПараметры); Элементы.СтруктураВарианта.Развернуть(НовыйРодитель.ПолучитьИдентификатор(), Истина); Элементы.СтруктураВарианта.ТекущаяСтрока = Результат.Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("СтруктураВарианта"); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаЗаголовокПриИзменении(Элемент) Строка = Элементы.СтруктураВарианта.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьВверх(Команда) Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить"); Контекст.Вставить("Направление", -1); ОпределитьВыделенныеСтроки(Контекст); Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда ПоказатьПредупреждение(, Контекст.ПричинаОтказа); Возврат; КонецЕсли; СдвинутьСтроки(Контекст); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьВниз(Команда) Контекст = НовыйКонтекст("СтруктураВарианта", "Переместить"); Контекст.Вставить("Направление", 1); ОпределитьВыделенныеСтроки(Контекст); Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда ПоказатьПредупреждение(, Контекст.ПричинаОтказа); Возврат; КонецЕсли; СдвинутьСтроки(Контекст); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьНаУровеньВыше(Команда) Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии"); Контекст.Вставить("Направление", -1); ОпределитьВыделенныеСтроки(Контекст); Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда ПоказатьПредупреждение(, Контекст.ПричинаОтказа); Возврат; КонецЕсли; ПереместитьВИерархии(Контекст); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьНаУровеньНиже(Команда) Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии"); Контекст.Вставить("Направление", 1); ОпределитьВыделенныеСтроки(Контекст); Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда ПоказатьПредупреждение(, Контекст.ПричинаОтказа); Возврат; КонецЕсли; ПереместитьВИерархии(Контекст); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_Изменить(Команда) ТаблицаЭлемент = Элементы.СтруктураВарианта; Поле = ТаблицаЭлемент.ТекущийЭлемент; СтандартнаяОбработка = Истина; СтрокаИдентификатор = ТаблицаЭлемент.ТекущаяСтрока; СтруктураВариантаВыбор(ТаблицаЭлемент, СтрокаИдентификатор, Поле, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаПередУдалением(Элемент, Отказ) УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьВышеИЛевее(Команда) Если Не Элементы.СтруктураВарианта_ПереместитьВышеИЛевее.Доступность Тогда Возврат; КонецЕсли; СтрокаТаблицыВверх = Элементы.СтруктураВарианта.ТекущиеДанные; Если СтрокаТаблицыВверх = Неопределено Тогда Возврат; КонецЕсли; СтрокаТаблицыВниз = СтрокаТаблицыВверх.ПолучитьРодителя(); Если СтрокаТаблицыВниз = Неопределено Тогда Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("Режим", "ВверхИВлево"); ПараметрыВыполнения.Вставить("СтрокаТаблицыВверх", СтрокаТаблицыВверх); ПараметрыВыполнения.Вставить("СтрокаТаблицыВниз", СтрокаТаблицыВниз); СтруктураВарианта_Переместить(-1, ПараметрыВыполнения); КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_ПереместитьНижеИПравее(Команда) Если Не Элементы.СтруктураВарианта_ПереместитьНижеИПравее.Доступность Тогда Возврат; КонецЕсли; СтрокаТаблицыВниз = Элементы.СтруктураВарианта.ТекущиеДанные; Если СтрокаТаблицыВниз = Неопределено Тогда Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("Режим", "ВнизИВправо"); ПараметрыВыполнения.Вставить("СтрокаТаблицыВверх", Неопределено); ПараметрыВыполнения.Вставить("СтрокаТаблицыВниз", СтрокаТаблицыВниз); ПодчиненныеСтроки = СтрокаТаблицыВниз.ПолучитьЭлементы(); Количество = ПодчиненныеСтроки.Количество(); Если Количество = 0 Тогда Возврат; ИначеЕсли Количество = 1 Тогда ПараметрыВыполнения.СтрокаТаблицыВверх = ПодчиненныеСтроки[0]; СтруктураВарианта_Переместить(-1, ПараметрыВыполнения); Иначе Список = Новый СписокЗначений; Для НомерСтроки = 1 По Количество Цикл ПодчиненнаяСтрока = ПодчиненныеСтроки[НомерСтроки-1]; Список.Добавить(ПодчиненнаяСтрока.ПолучитьИдентификатор(), ПодчиненнаяСтрока.Представление); КонецЦикла; Обработчик = Новый ОписаниеОповещения("СтруктураВарианта_Переместить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВыборИзМеню(Обработчик, Список); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_Переместить(Результат, ПараметрыВыполнения) Экспорт Если Результат <> -1 Тогда Если ТипЗнч(Результат) <> Тип("ЭлементСпискаЗначений") Тогда Возврат; КонецЕсли; СтрокаТаблицыВверх = СтруктураВарианта.НайтиПоИдентификатору(Результат.Значение); Иначе СтрокаТаблицыВверх = ПараметрыВыполнения.СтрокаТаблицыВверх; КонецЕсли; СтрокаТаблицыВниз = ПараметрыВыполнения.СтрокаТаблицыВниз; // 0. Запомнить перед каким элементом вставлять верхнюю строку. СтрокиВниз = СтрокаТаблицыВниз.ПолучитьЭлементы(); Индекс = СтрокиВниз.Индекс(СтрокаТаблицыВверх); МассивИдентификаторовСтрокВниз = Новый Массив; Для Каждого СтрокаТаблицы Из СтрокиВниз Цикл Если СтрокаТаблицы = СтрокаТаблицыВверх Тогда Продолжить; КонецЕсли; МассивИдентификаторовСтрокВниз.Добавить(СтрокаТаблицы.ПолучитьИдентификатор()); КонецЦикла; // 1. Переместить нижнюю строку на уровень с верхней. ДополнительныеПараметры = ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта(); ДополнительныеПараметры.ПередЧемВставить = СтрокаТаблицыВниз; Результат = ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицыВверх, СтрокаТаблицыВниз.ПолучитьРодителя(), ДополнительныеПараметры); СтрокаТаблицыВверх = Результат.Строка; // 2. Запомнить какие строки нужно переместить. СтрокиВверх = СтрокаТаблицыВверх.ПолучитьЭлементы(); // 3. Обмен строками. Для Каждого СтрокаТаблицы Из СтрокиВверх Цикл ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицы, СтрокаТаблицыВниз); КонецЦикла; Для Каждого СтрокаТаблицыИдентификатор Из МассивИдентификаторовСтрокВниз Цикл СтрокаТаблицы = СтруктураВарианта.НайтиПоИдентификатору(СтрокаТаблицыИдентификатор); ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицы, СтрокаТаблицыВверх); КонецЦикла; // 4. Переместить верхнюю строку в нижнюю. СтрокиВверх = СтрокаТаблицыВверх.ПолучитьЭлементы(); Если СтрокиВверх.Количество() - 1 < Индекс Тогда ПередЧемВставить = Неопределено; Иначе ПередЧемВставить = СтрокиВверх[Индекс]; КонецЕсли; ДополнительныеПараметры = ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта(); ДополнительныеПараметры.ПередЧемВставить = ПередЧемВставить; Результат = ПереместитьЭлементыСтруктурыВарианта(СтрокаТаблицыВниз, СтрокаТаблицыВверх, ДополнительныеПараметры); СтрокаТаблицыВниз = Результат.Строка; // Бантики. Если ПараметрыВыполнения.Режим = "ВнизИВправо" Тогда ТекущаяСтрока = СтрокаТаблицыВниз; Иначе ТекущаяСтрока = СтрокаТаблицыВверх; КонецЕсли; ТекущаяСтрокаИдентификатор = ТекущаяСтрока.ПолучитьИдентификатор(); Элементы.СтруктураВарианта.Развернуть(ТекущаяСтрокаИдентификатор, Истина); Элементы.СтруктураВарианта.ТекущаяСтрока = ТекущаяСтрокаИдентификатор; ПользовательскиеНастройкиМодифицированы = Истина; Если РасширенныйРежим = 1 Тогда ВариантИзменен = Истина; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СтруктураВарианта_СохранитьВФайл(Команда) Адрес = АдресНастроекВСтрокеXML(); ИмяФайла = НСтр("ru = 'Настройки.xml'"); ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения настроек отчета'"); ПараметрыСохранения.Диалог.Фильтр = НСтр("ru = 'Настройки отчета (*.xml)|*.xml'"); ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, ИмяФайла, ПараметрыСохранения); КонецПроцедуры &НаСервере Функция АдресНастроекВСтрокеXML() Возврат ПоместитьВоВременноеХранилище( ОбщегоНазначения.ЗначениеВСтрокуXML(Отчет.КомпоновщикНастроек.Настройки), УникальныйИдентификатор); КонецФункции #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСоставГруппировки &НаКлиенте Процедура СоставГруппировкиИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("СоставГруппировки"); КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка) Строка = Элементы.СоставГруппировки.ТекущиеДанные; Если Строка = Неопределено Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; Если Поле = Элементы.СоставГруппировкиПоле Тогда СтандартнаяОбработка = Ложь; Если ТипЗнч(Строка.Поле) = Тип("ПолеКомпоновкиДанных") Тогда СоставГруппировкиВыбратьПоле(ИдентификаторСтроки, Строка); КонецЕсли; ИначеЕсли Поле <> Элементы.СоставГруппировкиТипГруппировки И Поле <> Элементы.СоставГруппировкиТипДополнения Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; ВыбратьПоле("СоставГруппировки", Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиПередУдалением(Элемент, Отказ) УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиТипГруппировкиПриИзменении(Элемент) Строка = Элементы.СоставГруппировки.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.ТипГруппировки = Строка.ТипГруппировки; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиТипДополненияПриИзменении(Элемент) Строка = Элементы.СоставГруппировки.ТекущиеДанные; Если Строка = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.ТипДополнения = Строка.ТипДополнения; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СоставГруппировки_ПереместитьВверх(Команда) СдвинутьПолеГруппировки(); КонецПроцедуры &НаКлиенте Процедура СоставГруппировки_ПереместитьВниз(Команда) СдвинутьПолеГруппировки(Ложь); КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыОформление &НаКлиенте Процедура ОформлениеПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; ОформлениеИзменитьЭлемент(); КонецПроцедуры &НаКлиенте Процедура ОформлениеВыбор(Элемент, ИдентификаторСтроки, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Строка = Элементы.Оформление.ТекущиеДанные; Если Строка = Неопределено Или Строка.ЭтоРаздел Тогда Возврат; КонецЕсли; Если Строка.ЭтоПараметрВывода Тогда Если Строка(Строка.Идентификатор) = "TITLE" И Поле = Элементы.ОформлениеЗаголовок Тогда Обработчик = Новый ОписаниеОповещения("ОформлениеВводЗаголовкаЗавершение", ЭтотОбъект, ИдентификаторСтроки); ПоказатьВводСтроки(Обработчик, Строка.Значение, НСтр("ru = 'Заголовок для печати'"),, Истина); КонецЕсли; ИначеЕсли Поле = Элементы.ОформлениеЗаголовок Тогда // Изменение порядка. ОформлениеИзменитьЭлемент(ИдентификаторСтроки, Строка); ИначеЕсли Поле = Элементы.ОформлениеИндексКартинкиДоступа Тогда // Изменение быстрого доступа к отбору. СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Оформление", ИдентификаторСтроки, Истина, Ложь); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОформлениеПередУдалением(Элемент, Отказ) УдалитьСтроки(Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура ОформлениеИспользованиеПриИзменении(Элемент) ИзменитьИспользованиеЭлементаНастройки("Оформление"); КонецПроцедуры &НаКлиенте Процедура Оформление_ПереместитьВверх(Команда) СдвинутьОформление(); КонецПроцедуры &НаКлиенте Процедура Оформление_ПереместитьВниз(Команда) СдвинутьОформление(Ложь); КонецПроцедуры &НаКлиенте Процедура Оформление_УстановитьФлажки(Команда) ИзменитьИспользованиеПредопределенныхПараметровВывода(); ИзменитьИспользование("Оформление"); КонецПроцедуры &НаКлиенте Процедура Оформление_СнятьФлажки(Команда) ИзменитьИспользованиеПредопределенныхПараметровВывода(Ложь); ИзменитьИспользование("Оформление", Ложь); КонецПроцедуры &НаКлиенте Процедура НастроитьКолонтитулы(Команда) Перем НастройкиКолонтитулов; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("НастройкиКолонтитулов", НастройкиКолонтитулов); ОткрытьФорму("ОбщаяФорма.НастройкаКолонтитулов", Новый Структура("Настройки, ЭтоИндивидуальныеНастройки", НастройкиКолонтитулов, Истина), ЭтотОбъект, УникальныйИдентификатор,,, Новый ОписаниеОповещения("ЗапомнитьНастройкиКолонтитулов", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры #КонецОбласти #Область ОбработчикиКомандФормы &НаКлиенте Процедура ЗакрытьИСформировать(Команда) ЗаписатьИЗакрыть(Истина); КонецПроцедуры &НаКлиенте Процедура ЗакрытьБезФормирования(Команда) ЗаписатьИЗакрыть(Ложь); КонецПроцедуры &НаКлиенте Процедура ИзменитьУсловияОтборов(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТипФормыВладельца", ТипФормыОтчета); ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек); Обработчик = Новый ОписаниеОповещения("ИзменитьУсловияОтборовЗавершение", ЭтотОбъект); ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.УсловияОтборовОтчета", ПараметрыФормы, ЭтотОбъект, Истина,,, Обработчик); КонецПроцедуры &НаКлиенте Процедура ИзменитьУсловияОтборовЗавершение(УсловияОтборов, Контекст) Экспорт Если УсловияОтборов = Неопределено Или УсловияОтборов = КодВозвратаДиалога.Отмена Или УсловияОтборов.Количество() = 0 Тогда Возврат; КонецЕсли; ПараметрыОбновления = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета("ИзменитьУсловияОтборов"); ПараметрыОбновления.КомпоновщикНастроекКД = Отчет.КомпоновщикНастроек; ПараметрыОбновления.ПользовательскиеНастройкиМодифицированы = Истина; ПараметрыОбновления.УсловияОтборов =УсловияОтборов; ОбновитьФорму(ПараметрыОбновления); КонецПроцедуры &НаКлиенте Процедура ОчиститьНастройкиОтНесуществующихПолей(Команда) УдалитьПомеченныеНаУдалениеПоля(); ПараметрыОбновления = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета(); ПараметрыОбновления.КомпоновщикНастроекКД = Отчет.КомпоновщикНастроек; ОбновитьФорму(ПараметрыОбновления); КонецПроцедуры &НаКлиенте Процедура ПерейтиКНастройкамДляТехническогоСпециалиста(Команда) ОткрытьФормуНастроекДляТехническогоСпециалиста(Элементы.СтраницыНастроек.ТекущаяСтраница.Имя); КонецПроцедуры #Область ПодключаемыеКоманды &НаКлиенте Процедура Подключаемый_ВыбратьПериод(Команда) ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_СдвинутьПериодНазад(Команда) ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_СдвинутьПериодВперед(Команда) ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_Подбор(Команда) ПутьКСписку = СтрЗаменить(Команда.Имя, "Подбор", ""); ПараметрыЗаполнения = ПараметрыЗаполненияСписка(); ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку; ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ПараметрыЗаполнения.Владелец = Элементы[ПутьКСписку]; ПараметрыЗаполнения.Вставить("ЭтоПодбор", Истина); НачатьЗаполнениеСписка(Элементы[Команда.Имя], ПараметрыЗаполнения); КонецПроцедуры &НаКлиенте Процедура Подключаемый_Список_ВставитьИзБуфера(Команда) ПутьКСписку = СтрЗаменить(Команда.Имя, ОтчетыКлиентСервер.ИмяКомандыВставитьИзБуфера(), ""); Список = ЭтотОбъект[ПутьКСписку]; ПолеСписка = Элементы[ПутьКСписку]; // ТаблицаФормы Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, Индекс); ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент); Список.ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу( Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент, Сведения.Описание); ПараметрыПоиска = Новый Структура; ПараметрыПоиска.Вставить("ОписаниеТипов", ОписаниеТиповБезПримитивных(Список.ТипЗначения)); ПараметрыПоиска.Вставить("ПредставлениеПоля", ПолеСписка.Заголовок); ПараметрыПоиска.Вставить("Сценарий", "ВставкаИзБуфераОбмена"); ПараметрыПоиска.Вставить("ПараметрыВыбора", ПараметрыВыбора); Обработчик = Новый ОписаниеОповещения("ВставитьИзБуфераЗавершение", ЭтотОбъект, ПутьКСписку); МодульЗагрузкаДанныхИзФайлаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЗагрузкаДанныхИзФайлаКлиент"); МодульЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗаполненияСсылок(ПараметрыПоиска, Обработчик); КонецПроцедуры #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции // Параметры: // Описание - см. ВариантыОтчетов.НастройкиФормыОтчета // // Возвращаемое значение: // см. ВариантыОтчетов.НастройкиФормыОтчета // &НаКлиентеНаСервереБезКонтекста Функция ОписаниеНастроекОтчета(Описание) Возврат Описание; КонецФункции #Область ПоляГруппировки // Чтение настроек. &НаСервере Процедура ОбновитьПоляГруппировки() СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл Строка = СоставГруппировки.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Если ТипЗнч(ЭлементНастройки) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда Строка.Заголовок = НСтр("ru = 'Авто (по всем полям)'"); Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "Предопределенный"); Продолжить; КонецЕсли; ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляПолейГруппировок.НайтиПоле(ЭлементНастройки.Поле); Если ОписаниеНастройки = Неопределено Тогда УстановитьПометкуУдаления("СоставГруппировки", Строка); Продолжить; КонецЕсли; ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.ПоказыватьТипДополнения = ОписаниеНастройки.ТипЗначения.СодержитТип(Тип("Дата")); Если ОписаниеНастройки.Ресурс Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ресурс"); ИначеЕсли ОписаниеНастройки.Таблица Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Таблица"); ИначеЕсли ОписаниеНастройки.Папка Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа"); Иначе Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); КонецЕсли; КонецЦикла; КонецПроцедуры // Добавление, изменение элементов. &НаКлиенте Процедура СоставГруппировкиВыбратьПоле(ИдентификаторСтроки, Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Обработчик = Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки); ВыбратьПоле("СоставГруппировки", Обработчик, ЭлементНастройки.Поле); КонецПроцедуры &НаКлиенте Процедура СоставГруппировкиПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки) Экспорт Если ОписаниеНастройки = Неопределено Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); Если ИдентификаторСтроки = Неопределено Тогда Строка = СоставГруппировки.ПолучитьЭлементы().Добавить(); ЭлементНастройки = СвойствоЭлементаСтруктуры.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); Иначе Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); КонецЕсли; ЭлементНастройки.Использование = Истина; ЭлементНастройки.Поле = ОписаниеНастройки.Поле; ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.ПоказыватьТипДополнения = ОписаниеНастройки.ТипЗначения.СодержитТип(Тип("Дата")); Если ОписаниеНастройки.Ресурс Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ресурс"); ИначеЕсли ОписаниеНастройки.Таблица Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Таблица"); ИначеЕсли ОписаниеНастройки.Папка Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа"); Иначе Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); КонецЕсли; ИзменитьИспользованиеСвязанныхЭлементовНастроек("СоставГруппировки", Строка, ЭлементНастройки); Элементы.СоставГруппировки.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры // Сдвиг элементов. &НаКлиенте Процедура СдвинутьПолеГруппировки(ВНачало = Истина) ИдентификаторыСтрок = Элементы.СоставГруппировки.ВыделенныеСтроки; Если ИдентификаторыСтрок.Количество() = 0 Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = СоставГруппировки.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Строки = СоставГруппировки.ПолучитьЭлементы(); Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки); Граница = ЭлементыНастроек.Количество() - 1; Если ВНачало Тогда // Сдвиг в начало коллекции. Если Индекс = 0 Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница); Строки.Сдвинуть(Индекс, Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1); Строки.Сдвинуть(Индекс, -1); КонецЕсли; Иначе // Сдвиг в конец коллекции. Если Индекс = Граница Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница); Строки.Сдвинуть(Индекс, -Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1); Строки.Сдвинуть(Индекс, 1); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры #КонецОбласти #Область ПараметрыДанныхИОтборы // Чтение настроек. &НаСервере Процедура ОбновитьПараметрыДанных() Если РасширенныйРежим = 0 Или РежимИзмененияЭлементаСтруктурыНастроек Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПараметрыДанных", ИдентификаторЭлементаСтруктурыНастроек); Раздел = Отборы.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Параметры'"); Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("ПараметрыДанных"); Раздел.Идентификатор = "ПараметрыДанных"; ЭлементыРаздела = Раздел.ПолучитьЭлементы(); Если СвойствоЭлементаСтруктуры = Неопределено Или СвойствоЭлементаСтруктуры.Элементы.Количество() = 0 Тогда Возврат; КонецЕсли; Схема = ПолучитьИзВременногоХранилища(НастройкиОтчета.АдресСхемы); // СхемаКомпоновкиДанных Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл НайденныйПараметр = Схема.Параметры.Найти(ЭлементНастройки.Параметр); Если НайденныйПараметр <> Неопределено И НайденныйПараметр.ОграничениеИспользования Тогда Продолжить; КонецЕсли; Строка = ЭлементыРаздела.Добавить(); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); Строка.Картинка = -1; Строка.ЭтоПараметр = Истина; Строка.ЭтоПериод = (ТипЗнч(Строка.Значение) = Тип("СтандартныйПериод")); ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПараметры.НайтиПараметр(ЭлементНастройки.Параметр); Если ОписаниеНастройки <> Неопределено Тогда ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки,, "Использование"); Строка.ОтображатьИспользование = (ОписаниеНастройки.Использование <> ИспользованиеПараметраКомпоновкиДанных.Всегда); Если ОписаниеНастройки.ДоступныеЗначения <> Неопределено Тогда ЭлементСписка = ОписаниеНастройки.ДоступныеЗначения.НайтиПоЗначению(ЭлементНастройки.Значение); Если ЭлементСписка <> Неопределено Тогда Строка.ПредставлениеЗначения = ЭлементСписка.Представление; КонецЕсли; КонецЕсли; КонецЕсли; Если Не ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок; КонецЕсли; Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки); КонецЦикла; КонецПроцедуры &НаСервере Процедура ОбновитьОтборы(Строки = Неопределено, ЭлементыНастроек = Неопределено) Если РасширенныйРежим = 0 Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; Если Строки = Неопределено Тогда Раздел = Отборы.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Отборы'"); Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Отборы"); Раздел.Идентификатор = "Отборы"; Строки = Раздел.ПолучитьЭлементы(); КонецЕсли; Если ЭлементыНастроек = Неопределено Тогда ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; КонецЕсли; Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Строка = Строки.Добавить(); Если Не УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки) Тогда УстановитьПометкуУдаления("Отборы", Строка); КонецЕсли; Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда ОбновитьОтборы(Строка.ПолучитьЭлементы(), ЭлементНастройки.Элементы); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Функция УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки, ОписаниеНастройки = Неопределено) УстановленыУспешно = Истина; ЭтоГруппа = (ТипЗнч(ЭлементНастройки) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); Если ОписаниеНастройки = Неопределено Тогда Если Не ЭтоГруппа Тогда ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора.НайтиПоле(ЭлементНастройки.ЛевоеЗначение); УстановленыУспешно = (ОписаниеНастройки <> Неопределено); КонецЕсли; Если ОписаниеНастройки = Неопределено Тогда ОписаниеНастройки = Новый Структура("ДоступныеЗначения, ДоступныеВидыСравнения"); ОписаниеНастройки.Вставить("ТипЗначения", Новый ОписаниеТипов("Неопределено")); КонецЕсли; КонецЕсли; ДоступныеВидыСравнения = ОписаниеНастройки.ДоступныеВидыСравнения; Если ДоступныеВидыСравнения <> Неопределено И ДоступныеВидыСравнения.Количество() > 0 И ДоступныеВидыСравнения.НайтиПоЗначению(ЭлементНастройки.ВидСравнения) = Неопределено Тогда ЭлементНастройки.ВидСравнения = ДоступныеВидыСравнения[0].Значение; КонецЕсли; ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.Поле = Строка.Заголовок; Строка.ОтображатьИспользование = Истина; Строка.ЭтоПериод = (ТипЗнч(Строка.ПравоеЗначение) = Тип("СтандартныйПериод")); Строка.ЭтоУникальныйИдентификатор = (ТипЗнч(Строка.ПравоеЗначение) = Тип("УникальныйИдентификатор")); Если Строка.ТипЗначения = Новый ОписаниеТипов("Дата") И Не ОтчетыКлиентСервер.ЭтоВидСравненияСписка(ЭлементНастройки.ВидСравнения) Тогда Строка.ТипЗначения = Новый ОписаниеТипов("СтандартнаяДатаНачала"); КонецЕсли; Строка.ЭтоГруппа = ЭтоГруппа; Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); Строка.Картинка = -1; Если ЭтоГруппа Тогда Строка.Заголовок = Строка.ТипГруппы; Иначе ОтчетыКлиентСервер.ПривестиЗначениеКТипу(ЭлементНастройки.ПравоеЗначение, ОписаниеНастройки.ТипЗначения); КонецЕсли; Если Не ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда Если ЗначениеЗаполнено(ЭлементНастройки.Представление) Тогда Строка.ПредставлениеПользовательскойНастройки = ЭлементНастройки.Представление; Иначе Строка.ПредставлениеПользовательскойНастройки = Строка.Заголовок; КонецЕсли; КонецЕсли; Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки); ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки); УстановитьПредставлениеЗначения(Строка, СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора); Возврат УстановленыУспешно; КонецФункции // Добавление, изменение элементов. &НаКлиенте Процедура ОтборыВыбратьГруппу(ИдентификаторСтроки) Обработчик = Новый ОписаниеОповещения("ОтборыПослеВыбораГруппы", ЭтотОбъект, ИдентификаторСтроки); Список = Новый СписокЗначений; Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ); Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли); Список.Добавить(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе); ПоказатьВыборИзМеню(Обработчик, Список); КонецПроцедуры &НаКлиенте Процедура ОтборыПослеВыбораГруппы(ТипГруппы, ИдентификаторСтроки) Экспорт Если ТипГруппы = Неопределено Тогда Возврат; КонецЕсли; Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Если Строка = Неопределено Тогда Возврат; КонецЕсли; Если Не Строка.ЭтоГруппа Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); Возврат; КонецЕсли; Строка.ТипГруппы = ?(ТипЗнч(ТипГруппы) = Тип("ТипГруппыЭлементовОтбораКомпоновкиДанных"), ТипГруппы, ТипГруппы.Значение); Строка.Заголовок = Строка.ТипГруппы; Строка.ПредставлениеПользовательскойНастройки = Строка.ТипГруппы; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.ТипГруппы = Строка.ТипГруппы; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ОтборыПередВыборомПоля(ИдентификаторСтроки = Неопределено) Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда Строка = Элементы.Отборы.ТекущиеДанные; Если (Строка = Неопределено) Или (Строка.ЭтоПараметр) Или (Строка.ЭтоРаздел И Строка.Идентификатор = "ПараметрыДанных") Тогда Строка = Отборы.ПолучитьЭлементы()[1]; Элементы.Отборы.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); КонецЕсли; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ОтборыПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки); ВыбратьПоле("Отборы", Обработчик); КонецПроцедуры &НаКлиенте Процедура ОтборыПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки) Экспорт Если ОписаниеНастройки = Неопределено Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляОтбора, ОписаниеНастройки); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); Если ИдентификаторСтроки = Неопределено Тогда Родитель = Элементы.Отборы.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек Если Родитель = Неопределено Тогда Родитель = КорневаяСтрокаПоУмолчанию("Отборы"); // см. ЭлементКоллекцииФормыНастроек КонецЕсли; Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда Родитель = Родитель.ПолучитьРодителя(); КонецЕсли; Строка = Родитель.ПолучитьЭлементы().Добавить(); РодительЭлементаНастройки = СвойствоЭлементаСтруктуры; Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор); КонецЕсли; ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Иначе Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); КонецЕсли; ЭлементНастройки.Использование = Истина; ЭлементНастройки.ЛевоеЗначение = ОписаниеНастройки.Поле; ЭлементНастройки.ПравоеЗначение = ОписаниеНастройки.Тип.ПривестиЗначение(); ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный; ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор; ЭлементНастройки.ПредставлениеПользовательскойНастройки = ""; ДоступныеВидыСравнения = ОписаниеНастройки.ДоступныеВидыСравнения; Если ДоступныеВидыСравнения <> Неопределено И ДоступныеВидыСравнения.Количество() > 0 И ДоступныеВидыСравнения.НайтиПоЗначению(ЭлементНастройки.ВидСравнения) = Неопределено Тогда ЭлементНастройки.ВидСравнения = ДоступныеВидыСравнения[0].Значение; КонецЕсли; УстановитьДанныеСтрокиОтборов(Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки, ОписаниеНастройки); Раздел = КорневаяСтрокаПоУмолчанию("Отборы"); Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура УстановитьПараметрыРедактированияЭлементаОтбора() Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Или Строка.ЭтоРаздел Или Строка.ЭтоГруппа Тогда Возврат; КонецЕсли; #Область ПараметрыРедактированияУсловия ПолеУсловия = Элементы.ОтборыВидСравнения; ПолеУсловия.РежимВыбораИзСписка = (Строка.ДоступныеВидыСравнения <> Неопределено); Если Строка.ДоступныеВидыСравнения <> Неопределено Тогда Список = ПолеУсловия.СписокВыбора; Список.Очистить(); Для Каждого ВидыСравнения Из Строка.ДоступныеВидыСравнения Цикл ЗаполнитьЗначенияСвойств(Список.Добавить(), ВидыСравнения); КонецЦикла; КонецЕсли; Если Строка.ЭтоПараметр Тогда Условие = ВидСравненияКомпоновкиДанных.Равно; Если Строка.ДоступенСписокЗначений Тогда Условие = ВидСравненияКомпоновкиДанных.ВСписке; КонецЕсли; Иначе Условие = Строка.ВидСравнения; КонецЕсли; #КонецОбласти #Область ПараметрыРедактированияЗначения ПолеЗначения = ?(Строка.ЭтоПараметр, Элементы.ОтборыЗначение, Элементы.ОтборыПравоеЗначение); ПолеЗначения.ДоступныеТипы = Строка.ТипЗначения; ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы(Строка.ВыборГруппИЭлементов, Условие); Список = ПолеЗначения.СписокВыбора; Список.Очистить(); Если Строка.ДоступныеЗначения <> Неопределено Тогда Для Каждого ДоступноеЗначение Из Строка.ДоступныеЗначения Цикл Список.Добавить( ДоступноеЗначение.Значение, ДоступноеЗначение.Представление, ДоступноеЗначение.Пометка, ДоступноеЗначение.Картинка); КонецЦикла; КонецЕсли; #КонецОбласти КонецПроцедуры &НаКлиенте Процедура ОтборыПриИзмененииТекущейСтроки() Строка = Элементы.Отборы.ТекущиеДанные; Если Строка = Неопределено Тогда УстановитьДоступностьКомандОтборов(); Иначе УстановитьДоступностьКомандОтборов(Не Строка.ЭтоПараметр И Не Строка.ЭтоРаздел, Строка.ЭтоРаздел); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УстановитьДоступностьКомандОтборов(ЭтоОтбор = Ложь, ЭтоРаздел = Ложь) Элементы.Отборы_Удалить.Доступность = ЭтоОтбор; Элементы.Отборы_Удалить1.Доступность = ЭтоОтбор; Элементы.Отборы_Сгруппировать.Доступность = ЭтоОтбор; Элементы.Отборы_Сгруппировать1.Доступность = ЭтоОтбор; Элементы.Отборы_Разгруппировать.Доступность = ЭтоОтбор; Элементы.Отборы_Разгруппировать1.Доступность = ЭтоОтбор; Элементы.Отборы_ПереместитьВверх.Доступность = ЭтоОтбор; Элементы.Отборы_ПереместитьВверх1.Доступность = ЭтоОтбор; Элементы.Отборы_ПереместитьВниз.Доступность = ЭтоОтбор; Элементы.Отборы_ПереместитьВниз1.Доступность = ЭтоОтбор; Элементы.КомандыОтборов_Показывать.Доступность = Не ЭтоРаздел; Элементы.КомандыОтборов_Показывать1.Доступность = Не ЭтоРаздел; Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета.Доступность = ЭтоОтбор; Элементы.Отборы_ПоказыватьТолькоФлажокВШапкеОтчета1.Доступность = ЭтоОтбор; Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета.Доступность = ЭтоОтбор; Элементы.Отборы_ПоказыватьТолькоФлажокВНастройкахОтчета1.Доступность = ЭтоОтбор; КонецПроцедуры &НаКлиенте Процедура ОтборыУстановитьРежимОтображения(РежимОтображения) ИдентификаторСтрок = Элементы.Отборы.ВыделенныеСтроки; Если ИдентификаторСтрок.Количество() = 0 Тогда Возврат; КонецЕсли; СвойстваЭлементовНастроек = Новый Массив; КоличествоПараметров = 0; Для Каждого ИдентификаторСтроки Из ИдентификаторСтрок Цикл Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Если Строка.ЭтоРаздел Тогда Продолжить; КонецЕсли; Если Строка.ЭтоПараметр Тогда СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); КоличествоПараметров = КоличествоПараметров + 1; Иначе СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); КонецЕсли; ЭлементНастроек = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); СвойстваЭлементаНастроек = Новый Структура; СвойстваЭлементаНастроек.Вставить("ИдентификаторСтроки", ИдентификаторСтроки); СвойстваЭлементаНастроек.Вставить("ИдентификаторЭлементаНастроек", Строка.Идентификатор); СвойстваЭлементаНастроек.Вставить("ЭлементНастроек", ЭлементНастроек); СвойстваЭлементовНастроек.Добавить(СвойстваЭлементаНастроек); КонецЦикла; ПоказыватьРежимыФлажков = (КоличествоПараметров = СвойстваЭлементовНастроек.Количество()); ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, "Отборы", ПоказыватьРежимыФлажков, РежимОтображения); КонецПроцедуры &НаКлиенте Процедура Список_ПриНачалеИзменения() ПутьКСписку = Список_ПередНачаломИзменения.Имя; ЭлементСписка = Элементы[Список_ПередНачаломИзменения.Имя + "Значение"]; ПараметрыЗаполнения = ПараметрыЗаполненияСписка(Истина, Ложь, Ложь); ПараметрыЗаполнения.ПутьКСписку = ПутьКСписку; ПараметрыЗаполнения.Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ВыборПереопределен = Ложь; НачатьЗаполнениеСписка(ЭлементСписка, ПараметрыЗаполнения, ВыборПереопределен); Если ВыборПереопределен Тогда Список_ПередНачаломИзменения.ЗакончитьРедактированиеСтроки(Ложь); Возврат; КонецЕсли; ЭлементСписка.РедактированиеТекста = Истина; КонецПроцедуры // Изменение группировки элементов. // Возвращаемое значение: // Структура: // * Строки - Массив из ДанныеФормыЭлементДерева: // * Родитель - ДанныеФормыЭлементДерева: // ** Идентификатор - ИдентификаторКомпоновкиДанных // * Индекс - Число // Неопределено // &НаКлиенте Функция ПараметрыГруппировкиОтборов() Строки = Новый Массив; Родители = Новый Массив; ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Продолжить; КонецЕсли; Строки.Добавить(Строка); Родители.Добавить(Родитель); КонецЦикла; Если Строки.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'")); Возврат Неопределено; КонецЕсли; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'")); Возврат Неопределено; КонецЕсли; Строки = МассивСортировать(Строки); Родитель = Родители[0]; ДочерниеЭлементы = Родитель.ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева Индекс = ДочерниеЭлементы.Индекс(Строки[0]); Возврат Новый Структура("Строки, Родитель, Индекс", Строки, Родитель, Индекс); КонецФункции &НаКлиенте Процедура ИзменитьГруппировкуОтборов(ОтборыУзлаНастроек, Строки, НаследникиЭлементовНастроек, НаследникиСтрок) Для Каждого СтрокаИсточник Из Строки Цикл ЭлементНастройкиИсточник = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); Если ЭлементНастройкиИсточник.Родитель = Неопределено Тогда РодительЭлементаНастройкиИсточника = ОтборыУзлаНастроек; Иначе РодительЭлементаНастройкиИсточника = ЭлементНастройкиИсточник.Родитель; КонецЕсли; РодительЭлементаНастройкиПриемника = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточника); // ГруппаЭлементовОтбораКомпоновкиДанных РодительСтрокиИсточника = СтрокаИсточник.ПолучитьРодителя(); РодительСтрокиПриемника = НаследникиСтрок.Получить(РодительСтрокиИсточника); Индекс = РодительЭлементаНастройкиПриемника.Элементы.Индекс(РодительЭлементаНастройкиИсточника); Если Индекс < 0 Тогда ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Добавить(); Иначе // Это удаление группировки. ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Вставить(Индекс); КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник); СтрокаПриемник.Идентификатор = ОтборыУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); ИзменитьГруппировкуОтборов(ОтборыУзлаНастроек, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура УдалитьБазовыеЭлементыГруппировкиОтборов(ОтборыУзлаНастроек, ПараметрыГруппировки) Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек Строки = Родитель.ПолучитьЭлементы(); ЭлементыНастроек = ОтборыУзлаНастроек.Элементы; Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементыНастроек = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы; КонецЕсли; Индекс = ПараметрыГруппировки.Строки.ВГраница(); Пока Индекс >= 0 Цикл Строка = ПараметрыГруппировки.Строки[Индекс]; // см. ЭлементКоллекцииФормыНастроек ЭлементНастройки = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); Строки.Удалить(Строка); ЭлементыНастроек.Удалить(ЭлементНастройки); Индекс = Индекс - 1; КонецЦикла; КонецПроцедуры // Перетаскивание элементов. &НаКлиенте Процедура ПроверитьПеретаскиваемыеСтрокиИзОтборов(ИдентификаторыСтрок) Родители = Новый Массив; Индекс = ИдентификаторыСтрок.ВГраница(); Пока Индекс >= 0 Цикл ИдентификаторСтроки = ИдентификаторыСтрок[Индекс]; Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Или Родитель.Идентификатор = "ПараметрыДанных" Тогда ИдентификаторыСтрок.Удалить(Индекс); Иначе Родители.Добавить(Родитель); КонецЕсли; Индекс = Индекс - 1; КонецЦикла; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ИдентификаторыСтрок.Очистить(); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПеретащитьОтборыВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока) ТекущиеДанные = Отборы.НайтиПоИдентификатору(ТекущаяСтрока); Строки = Новый Массив; Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл Строки.Добавить(Отборы.НайтиПоИдентификатору(ИдентификаторСтроки)); КонецЦикла; СтрокаИсточник = Строки[0].ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда СтрокаПриемник = ТекущиеДанные; Иначе СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя(); КонецЕсли; Индекс = СтрокаПриемник.ПолучитьЭлементы().Индекс(ТекущиеДанные); Если Индекс < 0 Тогда Индекс = 0; КонецЕсли; НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры; Если ТипЗнч(СтрокаИсточник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); КонецЕсли; ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры; Если ТипЗнч(СтрокаПриемник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаПриемник.Идентификатор); КонецЕсли; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); ПеретащитьОтборы(СвойствоЭлементаСтруктуры, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок); Раздел = КорневаяСтрокаПоУмолчанию("Отборы"); Элементы.Отборы.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ПеретащитьОтборы(ВыбранныеПоляУзлаНастроек, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок) Для Каждого СтрокаИсточник Из Строки Цикл ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); РодительЭлементаНастройкиИсточник = ВыбранныеПоляУзлаНастроек; Если ЭлементНастройкиИсточник.Родитель <> Неопределено Тогда РодительЭлементаНастройкиИсточник = ЭлементНастройкиИсточник.Родитель; КонецЕсли; РодительЭлементаНастройкиПриемник = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточник); // ГруппаЭлементовОтбораКомпоновкиДанных РодительСтрокиПриемник = НаследникиСтрок.Получить(СтрокаИсточник.ПолучитьРодителя()); // см. ЭлементКоллекцииФормыНастроек Если Индекс > РодительЭлементаНастройкиПриемник.Элементы.Количество() - 1 Тогда ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Добавить(); Иначе ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Вставить(Индекс); КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник); СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда ПеретащитьОтборы(ВыбранныеПоляУзлаНастроек, Индекс, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок) КонецЕсли; КонецЦикла; КонецПроцедуры // Сдвиг элементов. &НаКлиенте Процедура СдвинутьОтборы(ВНачало = Истина) ПараметрыСдвига = ПараметрыСдвигаОтборов(); Если ПараметрыСдвига = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); Для Каждого СтрокаСписка Из ПараметрыСдвига.Строки Цикл ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, СтрокаСписка); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Если ЭлементНастройки.Родитель <> Неопределено Тогда ЭлементыНастроек = ЭлементНастройки.Родитель.Элементы; КонецЕсли; Строки = ПараметрыСдвига.Родитель.ПолучитьЭлементы(); Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки); Граница = ЭлементыНастроек.Количество() - 1; Если ВНачало Тогда // Сдвиг в начало коллекции. Если Индекс = 0 Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница); Строки.Сдвинуть(Индекс, Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1); Строки.Сдвинуть(Индекс, -1); КонецЕсли; Иначе // Сдвиг в конец коллекции. Если Индекс = Граница Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница); Строки.Сдвинуть(Индекс, -Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1); Строки.Сдвинуть(Индекс, 1); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Функция ПараметрыСдвигаОтборов() Строки = Новый Массив; Родители = Новый Массив; ИдентификаторыСтрок = Элементы.Отборы.ВыделенныеСтроки; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Продолжить; КонецЕсли; Строки.Добавить(Строка); Родители.Добавить(Родитель); КонецЦикла; Если Строки.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'")); Возврат Неопределено; КонецЕсли; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'")); Возврат Неопределено; КонецЕсли; Возврат Новый Структура("Строки, Родитель", МассивСортировать(Строки), Родители[0]); КонецФункции #КонецОбласти #Область ВыбранныеПоля // Чтение настроек. &НаСервере Процедура ОбновитьВыбранныеПоля(Строки = Неопределено, ЭлементыНастроек = Неопределено) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; Если Строки = Неопределено Тогда Раздел = ВыбранныеПоля.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Поля'"); Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено); Раздел.Идентификатор = "ВыбранныеПоля"; Строки = Раздел.ПолучитьЭлементы(); КонецЕсли; Если ЭлементыНастроек = Неопределено Тогда ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; КонецЕсли; Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Строка = Строки.Добавить(); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Если ТипЗнч(ЭлементНастройки) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда Строка.Заголовок = НСтр("ru = 'Авто (поля родителя)'"); Строка.Картинка = 18; Продолжить; КонецЕсли; Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда Строка.ЭтоГруппа = Истина; Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено, Истина); Строка.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки, СвойствоЭлементаСтруктуры); ОбновитьВыбранныеПоля(Строка.ПолучитьЭлементы(), ЭлементНастройки.Элементы); Иначе ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройки.Поле); Если ОписаниеНастройки = Неопределено Тогда УстановитьПометкуУдаления("ВыбранныеПоля", Строка); Иначе ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); УстановитьИндикаторФормулы(Отчет.КомпоновщикНастроек.Настройки, ОписаниеНастройки, Строка); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры // Добавление, изменение элементов. &НаКлиенте Процедура ВыбранныеПоляВыбратьГруппу(ИдентификаторСтроки, Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ЗаголовокГруппы", Строка.Заголовок); ПараметрыФормы.Вставить("Расположение", ЭлементНастройки.Расположение); Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораГруппы", ЭтотОбъект, ИдентификаторСтроки); ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ГруппаВыбранныхПолей", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры // Параметры: // СвойстваГруппы - Структура: // * ЗаголовокГруппы - Строка // * Расположение - РасположениеПоляКомпоновкиДанных // ИдентификаторСтроки - Число // &НаКлиенте Процедура ВыбранныеПоляПослеВыбораГруппы(СвойстваГруппы, ИдентификаторСтроки) Экспорт Если ТипЗнч(СвойстваГруппы) <> Тип("Структура") Тогда Возврат; КонецЕсли; Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.Заголовок = СвойстваГруппы.ЗаголовокГруппы; ЭлементНастройки.Расположение = СвойстваГруппы.Расположение; ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Если ЭлементНастройки.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда Строка.Заголовок = Строка.Заголовок + " (" + Строка(ЭлементНастройки.Расположение) + ")"; КонецЕсли; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляВыбратьПоле(ИдентификаторСтроки, Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки); ВыбратьПоле("ВыбранныеПоля", Обработчик, ЭлементНастройки.Поле); КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки = Неопределено) Экспорт Если ОписаниеНастройки = Неопределено Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляВыбора, ОписаниеНастройки); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Если ИдентификаторСтроки = Неопределено Тогда Родитель = Элементы.ВыбранныеПоля.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек Если Родитель = Неопределено Тогда Родитель = КорневаяСтрокаПоУмолчанию("ВыбранныеПоля"); // см. ЭлементКоллекцииФормыНастроек КонецЕсли; Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда Родитель = Родитель.ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек КонецЕсли; Строка = Родитель.ПолучитьЭлементы().Добавить(); РодительЭлементаНастройки = СвойствоЭлементаСтруктуры; Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор); КонецЕсли; ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); Иначе Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); КонецЕсли; ЭлементНастройки.Использование = Истина; ЭлементНастройки.Поле = ОписаниеНастройки.Поле; ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка); УстановитьМодифицированность(); КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Процедура УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка) Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Настройки, Строка(ОписаниеНастройки.Поле)); Строка.ЭтоФормула = (Формула <> Неопределено); Если Строка.ЭтоФормула Тогда Строка.ИндикаторФормулы = БиблиотекаКартинок.ТипФункция; Иначе Строка.ИндикаторФормулы = БиблиотекаКартинок.Пустая; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПослеАктивизацииВыбранныхПолей() Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; Элементы.ВыбранныеПоляИзменитьФормулу.Доступность = Строка <> Неопределено И Строка.ЭтоФормула; КонецПроцедуры &НаКлиенте Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Копирование Тогда СкопироватьНастройки(Элемент); Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект); ВыбратьПоле("ВыбранныеПоля", Обработчик); КонецПроцедуры // Изменение группировки элементов. // Возвращаемое значение: // - Структура: // * Строки - Массив из ДанныеФормыЭлементДерева // * Родитель - см. ЭлементКоллекцииФормыНастроек // * Индекс - Число // - Неопределено // &НаКлиенте Функция ПараметрыГруппировкиВыбранныхПолей() Строки = Новый Массив; Родители = Новый Массив; ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Продолжить; КонецЕсли; Строки.Добавить(Строка); Родители.Добавить(Родитель); КонецЦикла; Если Строки.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'")); Возврат Неопределено; КонецЕсли; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'")); Возврат Неопределено; КонецЕсли; Строки = МассивСортировать(Строки); Родитель = Родители[0]; // ДанныеФормыЭлементДерева Индекс = Родитель.ПолучитьЭлементы().Индекс(Строки[0]); Возврат Новый Структура("Строки, Родитель, Индекс", Строки, Родитель, Индекс); КонецФункции // Параметры: // СвойстваГруппы - Структура: // * ЗаголовокГруппы - Строка // * Расположение - РасположениеПоляКомпоновкиДанных // ПараметрыГруппировки - см. ПараметрыГруппировкиВыбранныхПолей // &НаКлиенте Процедура ВыбранныеПоляПередГруппировкойПолей(СвойстваГруппы, ПараметрыГруппировки) Экспорт Если ТипЗнч(СвойстваГруппы) <> Тип("Структура") Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); // Обработка элементов настроек. ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры; Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор); КонецЕсли; ЭлементНастройкиПриемник = ЭлементНастройкиИсточник.Элементы.Вставить(ПараметрыГруппировки.Индекс, Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); ЭлементНастройкиПриемник.Заголовок = СвойстваГруппы.ЗаголовокГруппы; ЭлементНастройкиПриемник.Расположение = СвойстваГруппы.Расположение; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); // Обработка строк. СтрокаИсточник = ПараметрыГруппировки.Родитель; СтрокаПриемник = СтрокаИсточник.ПолучитьЭлементы().Вставить(ПараметрыГруппировки.Индекс); // см. ЭлементКоллекцииФормыНастроек ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); СтрокаПриемник.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.ЭтоГруппа = Истина; СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа"); СтрокаПриемник.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройкиПриемник); НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); ИзменитьГруппировкуВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки.Строки, НаследникиЭлементовНастроек, НаследникиСтрок); УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(СвойствоЭлементаСтруктуры, ПараметрыГруппировки); Раздел = ВыбранныеПоля.ПолучитьЭлементы()[0]; Элементы.ВыбранныеПоля.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); Элементы.ВыбранныеПоля.ТекущаяСтрока = СтрокаПриемник.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьГруппировкуВыбранныхПолей(ВыбранныеПоляУзлаНастроек, Строки, НаследникиЭлементовНастроек, НаследникиСтрок) Для Каждого СтрокаИсточник Из Строки Цикл ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); Если ЭлементНастройкиИсточник.Родитель = Неопределено Тогда РодительЭлементаНастройкиИсточника = ВыбранныеПоляУзлаНастроек; Иначе РодительЭлементаНастройкиИсточника = ЭлементНастройкиИсточник.Родитель; КонецЕсли; РодительЭлементаНастройкиПриемника = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточника); // ГруппаВыбранныхПолейКомпоновкиДанных РодительСтрокиИсточника = СтрокаИсточник.ПолучитьРодителя(); РодительСтрокиПриемника = НаследникиСтрок.Получить(РодительСтрокиИсточника); Индекс = РодительЭлементаНастройкиПриемника.Элементы.Индекс(РодительЭлементаНастройкиИсточника); Если Индекс < 0 Тогда ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Добавить(); Иначе // Это удаление группировки. ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемника.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемника.ПолучитьЭлементы().Вставить(Индекс); КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник); СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); ИзменитьГруппировкуВыбранныхПолей(ВыбранныеПоляУзлаНастроек, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура УдалитьБазовыеЭлементыГруппировкиВыбранныхПолей(ВыбранныеПоляУзлаНастроек, ПараметрыГруппировки) Строки = ПараметрыГруппировки.Родитель.ПолучитьЭлементы(); ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.Элементы; Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы; КонецЕсли; Индекс = ПараметрыГруппировки.Строки.ВГраница(); Пока Индекс >= 0 Цикл Строка = ПараметрыГруппировки.Строки[Индекс]; // см. ЭлементКоллекцииФормыНастроек ЭлементНастройки = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); Строки.Удалить(Строка); ЭлементыНастроек.Удалить(ЭлементНастройки); Индекс = Индекс - 1; КонецЦикла; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Функция ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки, СвойствоЭлементаСтруктуры = Неопределено) ЗаголовокГруппы = ЭлементНастройки.Заголовок; Если Не ЗначениеЗаполнено(ЗаголовокГруппы) И СвойствоЭлементаСтруктуры <> Неопределено И ЭлементНастройки.Поле <> Неопределено Тогда ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройки.Поле); Если ОписаниеНастройки <> Неопределено Тогда ЗаголовокГруппы = ОписаниеНастройки.Заголовок; КонецЕсли; КонецЕсли; Если Не ЗначениеЗаполнено(ЗаголовокГруппы) Тогда ЗаголовокГруппы = "(" + ЭлементНастройки.Расположение + ")"; ИначеЕсли ЭлементНастройки.Расположение <> РасположениеПоляКомпоновкиДанных.Авто Тогда ЗаголовокГруппы = ЗаголовокГруппы + " (" + ЭлементНастройки.Расположение + ")"; КонецЕсли; Возврат ЗаголовокГруппы; КонецФункции // Перетаскивание элементов. &НаКлиенте Процедура ПроверитьПеретаскиваемыеСтрокиИзВыбранныхПолей(ИдентификаторыСтрок) Родители = Новый Массив; Индекс = ИдентификаторыСтрок.ВГраница(); Пока Индекс >= 0 Цикл ИдентификаторСтроки = ИдентификаторыСтрок[Индекс]; Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда ИдентификаторыСтрок.Удалить(Индекс); Иначе Родители.Добавить(Родитель); КонецЕсли; Индекс = Индекс - 1; КонецЦикла; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ИдентификаторыСтрок.Очистить(); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПеретащитьВыбранныеПоляВПределахКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока) ТекущиеДанные = ВыбранныеПоля.НайтиПоИдентификатору(ТекущаяСтрока); Строки = Новый Массив; Для Каждого ИдентификаторСтроки Из ПараметрыПеретаскивания.Значение Цикл Строки.Добавить(ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки)); КонецЦикла; СтрокаИсточник = Строки[0].ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек Если ТекущиеДанные.ЭтоРаздел Или ТекущиеДанные.ЭтоГруппа Тогда СтрокаПриемник = ТекущиеДанные; Иначе СтрокаПриемник = ТекущиеДанные.ПолучитьРодителя(); КонецЕсли; Индекс = СтрокаПриемник.ПолучитьЭлементы().Индекс(ТекущиеДанные); Если Индекс < 0 Тогда Индекс = 0; КонецЕсли; НаследникиСтрок = Новый Соответствие; НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры; Если ТипЗнч(СтрокаИсточник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиИсточник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); КонецЕсли; ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры; Если ТипЗнч(СтрокаПриемник.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементНастройкиПриемник = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаПриемник.Идентификатор); КонецЕсли; НаследникиЭлементовНастроек = Новый Соответствие; НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); ПеретащитьВыбранныеПоля(СвойствоЭлементаСтруктуры, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок); Элементы.ВыбранныеПоля.Развернуть(ВыбранныеПоля.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина); УстановитьМодифицированность(); КонецПроцедуры // Параметры: // ВыбранныеПоляУзлаНастроек - ГруппаВыбранныхПолейКомпоновкиДанных // - ВыбранныеПоляКомпоновкиДанных // - ВыбранноеПолеКомпоновкиДанных // Индекс - Число // Строки - Массив из ДанныеФормыЭлементДерева: // * Идентификатор - ИдентификаторКомпоновкиДанных // НаследникиЭлементовНастроек - Соответствие // НаследникиСтрок - Соответствие // &НаКлиенте Процедура ПеретащитьВыбранныеПоля(ВыбранныеПоляУзлаНастроек, Индекс, Строки, НаследникиЭлементовНастроек, НаследникиСтрок) Для Каждого СтрокаИсточник Из Строки Цикл ЭлементНастройкиИсточник = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); РодительЭлементаНастройкиИсточник = ВыбранныеПоляУзлаНастроек; Если ЭлементНастройкиИсточник.Родитель <> Неопределено Тогда РодительЭлементаНастройкиИсточник = ЭлементНастройкиИсточник.Родитель; КонецЕсли; РодительЭлементаНастройкиПриемник = НаследникиЭлементовНастроек.Получить(РодительЭлементаНастройкиИсточник); // ГруппаВыбранныхПолейКомпоновкиДанных РодительСтрокиПриемник = НаследникиСтрок.Получить(СтрокаИсточник.ПолучитьРодителя()); // см. ЭлементКоллекцииФормыНастроек Если Индекс > РодительЭлементаНастройкиПриемник.Элементы.Количество() - 1 Тогда ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Добавить(ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Добавить(); Иначе ЭлементНастройкиПриемник = РодительЭлементаНастройкиПриемник.Элементы.Вставить(Индекс, ТипЗнч(ЭлементНастройкиИсточник)); СтрокаПриемник = РодительСтрокиПриемник.ПолучитьЭлементы().Вставить(Индекс); КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник); СтрокаПриемник.Идентификатор = ВыбранныеПоляУзлаНастроек.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); СтрокаПриемник.ЭтоГруппа = (ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); НаследникиЭлементовНастроек.Вставить(ЭлементНастройкиИсточник, ЭлементНастройкиПриемник); НаследникиСтрок.Вставить(СтрокаИсточник, СтрокаПриемник); Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Группа"); ПеретащитьВыбранныеПоля(ВыбранныеПоляУзлаНастроек, Индекс, СтрокаИсточник.ПолучитьЭлементы(), НаследникиЭлементовНастроек, НаследникиСтрок) КонецЕсли; КонецЦикла; КонецПроцедуры // Сдвиг элементов. &НаКлиенте Процедура СдвинутьВыбранныеПоля(ВНачало = Истина) ПараметрыСдвига = ПараметрыСдвигаВыбранныхПолей(); Если ПараметрыСдвига = Неопределено Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Для Каждого СтрокаСписка Из ПараметрыСдвига.Строки Цикл ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, СтрокаСписка); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Если ЭлементНастройки.Родитель <> Неопределено Тогда ЭлементыНастроек = ЭлементНастройки.Родитель.Элементы; КонецЕсли; Строки = ПараметрыСдвига.Родитель.ПолучитьЭлементы(); Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки); Граница = ЭлементыНастроек.Количество() - 1; Если ВНачало Тогда // Сдвиг в начало коллекции. Если Индекс = 0 Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница); Строки.Сдвинуть(Индекс, Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1); Строки.Сдвинуть(Индекс, -1); КонецЕсли; Иначе // Сдвиг в конец коллекции. Если Индекс = Граница Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница); Строки.Сдвинуть(Индекс, -Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1); Строки.Сдвинуть(Индекс, 1); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Функция ПараметрыСдвигаВыбранныхПолей() Строки = Новый Массив; Родители = Новый Массив; ИдентификаторыСтрок = Элементы.ВыбранныеПоля.ВыделенныеСтроки; Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = ВыбранныеПоля.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); Если Родитель = Неопределено Или Родитель.ПолучитьЭлементы().Индекс(Строка) < 0 Или ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Продолжить; КонецЕсли; Строки.Добавить(Строка); Родители.Добавить(Родитель); КонецЦикла; Если Строки.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выберите элементы.'")); Возврат Неопределено; КонецЕсли; Родители = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Родители); Если Родители.Количество() > 1 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'")); Возврат Неопределено; КонецЕсли; Возврат Новый Структура("Строки, Родитель", МассивСортировать(Строки), Родители[0]); КонецФункции // Общее &НаКлиентеНаСервереБезКонтекста Процедура ПривестиЗначениеКВидуСравнения(Строка, ЭлементНастройки = Неопределено) ИмяПоляЗначения = ?(Строка.ЭтоПараметр, "Значение", "ПравоеЗначение"); ТекущееЗначение = Строка[ИмяПоляЗначения]; Если Строка.ДоступенСписокЗначений Или ОтчетыКлиентСервер.ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда Если ТипЗнч(ТекущееЗначение) = Тип("СтандартнаяДатаНачала") Тогда ТекущееЗначение = ТекущееЗначение.Дата; КонецЕсли; Значение = ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение); Значение.ЗаполнитьПометки(Истина); Если Строка.ДоступныеЗначения <> Неопределено Тогда Для Каждого ЭлементСписка Из Значение Цикл НайденныйЭлемент = Строка.ДоступныеЗначения.НайтиПоЗначению(ЭлементСписка.Значение); Если НайденныйЭлемент <> Неопределено Тогда ЗаполнитьЗначенияСвойств(ЭлементСписка, НайденныйЭлемент,, "Пометка"); КонецЕсли; КонецЦикла; КонецЕсли; Иначе Значение = Неопределено; Если ТипЗнч(ТекущееЗначение) <> Тип("СписокЗначений") Тогда Значение = ТекущееЗначение; ИначеЕсли ТекущееЗначение.Количество() > 0 Тогда Значение = ТекущееЗначение[0].Значение; КонецЕсли; КонецЕсли; Строка[ИмяПоляЗначения] = Значение; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда ЭлементНастройки[ИмяПоляЗначения] = Значение; КонецЕсли; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Процедура УстановитьПредставлениеЗначения(Строка, ДоступныеПоляОтбора) Строка.ПредставлениеЗначения = ""; ДоступныеЗначения = Строка.ДоступныеЗначения; Значение = ?(Строка.ЭтоПараметр, Строка.Значение, Строка.ПравоеЗначение); Если ДоступныеЗначения = Неопределено Тогда Если ТипЗнч(Значение) = Тип("ПолеКомпоновкиДанных") Тогда ДоступноеПоле = ДоступныеПоляОтбора.НайтиПоле(Значение); Если ДоступноеПоле <> Неопределено Тогда Строка.ПредставлениеЗначения = ДоступноеПоле.Заголовок; КонецЕсли; КонецЕсли; Возврат; КонецЕсли; НайденныйЭлемент = ДоступныеЗначения.НайтиПоЗначению(Значение); Если НайденныйЭлемент <> Неопределено Тогда Строка.ПредставлениеЗначения = НайденныйЭлемент.Представление; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УстановитьПараметрыРедактирования(Строка) КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Если Строка.ЭтоПараметр Тогда ПолеЗначения = Элементы.ОтборыЗначение; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(КомпоновщикНастроек, "ПараметрыДанных"); Иначе ПолеЗначения = Элементы.ОтборыПравоеЗначение; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); КонецЕсли; ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; ТекущиеНастройки = ЭлементСтруктурыНастроек(КомпоновщикНастроек.Настройки, ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ОписаниеЭлементаНастройки = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(ТекущиеНастройки, ЭлементНастройки); ПолеЗначения.ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(ТекущиеНастройки, ПользовательскиеНастройки, ЭлементНастройки, РасширенныйРежим = 1); Строка.ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу( ТекущиеНастройки, ПользовательскиеНастройки, ЭлементНастройки, ОписаниеЭлементаНастройки); ПолеЗначения.ДоступныеТипы = Строка.ТипЗначения; КонецПроцедуры &НаКлиенте Функция ВыборПереопределен(Строка, СтандартнаяОбработка) Если Строка.ЭтоПараметр Тогда ПолеЗначения = Элементы.ОтборыЗначение; ТекущееЗначение = Строка.Значение; Иначе ПолеЗначения = Элементы.ОтборыПравоеЗначение; ТекущееЗначение = Строка.ПравоеЗначение; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗавершитьВыборИзСписка", ЭтотОбъект, Строка.ПолучитьИдентификатор()); КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Описание = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(Отчет.КомпоновщикНастроек.Настройки, ЭлементНастройки); Если ОтчетыКлиент.ВыборПереопределен(ЭтотОбъект, Обработчик, Описание, Строка.ТипЗначения, ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение), ПолеЗначения.ПараметрыВыбора) Тогда СтандартнаяОбработка = Ложь; Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции &НаКлиенте Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент) СтандартнаяОбработка = Ложь; Если Строка.ЭтоПараметр Тогда ПолеЗначения = Элементы.ОтборыЗначение; ТекущееЗначение = Строка.Значение; Иначе ПолеЗначения = Элементы.ОтборыПравоеЗначение; ТекущееЗначение = Строка.ПравоеЗначение; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗавершитьВыборИзСписка", ЭтотОбъект, Строка.ПолучитьИдентификатор()); ДоступныеТипы = ДоступныеТипыДляВыбора(Строка.ТипЗначения); Если ОтчетыКлиент.ЭтоВыборОбъектовМетаданных(ДоступныеТипы, ТекущееЗначение, Обработчик) Тогда Возврат; КонецЕсли; ЗначенияДляВыбора = ЗначенияДляВыбора(Строка); ОграничиватьВыборУказаннымиЗначениями = Строка.ДоступныеЗначения <> Неопределено; ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение)); ПараметрыОткрытия.Вставить("ОписаниеТипов", Строка.ТипЗначения); ПараметрыОткрытия.Вставить("ЗначенияДляВыбора", ЗначенияДляВыбора); ПараметрыОткрытия.Вставить("ЗначенияДляВыбораЗаполнены", ЗначенияДляВыбора.Количество() > 0); ПараметрыОткрытия.Вставить("ОграничиватьВыборУказаннымиЗначениями", ОграничиватьВыборУказаннымиЗначениями); ПараметрыОткрытия.Вставить("Представление", Строка.ПредставлениеПользовательскойНастройки); ПараметрыОткрытия.Вставить("ПараметрыВыбора", Новый Массив(ПолеЗначения.ПараметрыВыбора)); ПараметрыОткрытия.Вставить("ВыборГруппИЭлементов", ПолеЗначения.ВыборГруппИЭлементов); Контекст = Новый Структура; Контекст.Вставить("ПараметрыОткрытия", ПараметрыОткрытия); Контекст.Вставить("Обработчик", Обработчик); Если ОграничиватьВыборУказаннымиЗначениями Тогда ПоказатьСписокВыбораПродолжение(Неопределено, Контекст); Иначе ОтчетыКлиент.НачатьВыборПользователей(ЭтотОбъект, Элемент, ДоступныеТипы, ТекущееЗначение, ПолеЗначения.ПараметрыВыбора, Обработчик, Новый ОписаниеОповещения("ПоказатьСписокВыбораПродолжение", ЭтотОбъект, Контекст)); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПоказатьСписокВыбораПродолжение(Результат, Контекст) Экспорт ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", Контекст.ПараметрыОткрытия, ЭтотОбъект,,,, Контекст.Обработчик); КонецПроцедуры &НаКлиенте Функция ЗначенияДляВыбора(Строка) ЗначенияДляВыбора = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Строка.ДоступныеЗначения); Если ЗначенияДляВыбора = Неопределено Тогда ЗначенияДляВыбора = Новый СписокЗначений; КонецЕсли; ЗначенияДляВыбора.ТипЗначения = Строка.ТипЗначения; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, ?(Строка.ЭтоПараметр, "ПараметрыДанных", "Отбор")); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если ЭлементНастройки = Неопределено Тогда Возврат ЗначенияДляВыбора; КонецЕсли; ЗначениеОтбора = ОтчетыКлиент.КэшЗначенияОтбора(Отчет.КомпоновщикНастроек, ЭлементНастройки); Если ЗначениеОтбора <> Неопределено Тогда ОбщегоНазначенияКлиентСервер.ДополнитьСписок(ЗначенияДляВыбора, ЗначениеОтбора); КонецЕсли; ОтчетыКлиент.ОбновитьПредставленияСписка(ЗначенияДляВыбора, Строка.ДоступныеЗначения); Возврат ЗначенияДляВыбора; КонецФункции &НаСервереБезКонтекста Функция ДоступныеТипыДляВыбора(Знач ТипЗначения) Возврат ОтчетыСервер.РасширенноеОписаниеТипов(ТипЗначения, Истина).ОписаниеТиповДляФормы; КонецФункции &НаКлиенте Процедура ЗавершитьВыборИзСписка(Список, ИдентификаторСтроки) Экспорт Если ТипЗнч(Список) = Тип("Массив") Тогда ВыбранныеЗначения = Список; Список = Новый СписокЗначений; Список.ЗагрузитьЗначения(ВыбранныеЗначения); Список.ЗаполнитьПометки(Истина); ИначеЕсли ТипЗнч(Список) <> Тип("СписокЗначений") Тогда Возврат; КонецЕсли; Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); Если Строка = Неопределено Тогда Возврат; КонецЕсли; ВыбранныеЗначения = Новый СписокЗначений; Для Каждого ЭлементСписка Из Список Цикл Если ЭлементСписка.Пометка Тогда ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка); КонецЕсли; КонецЦикла; ИмяПоляЗначения = ?(Строка.ЭтоПараметр, "Значение", "ПравоеЗначение"); КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек("Отборы", Строка); Строка[ИмяПоляЗначения] = ВыбранныеЗначения; Строка.Использование = Истина; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЗаполнитьЗначенияСвойств(ЭлементНастройки, Строка, "Использование, " + ИмяПоляЗначения); ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); УстановитьМодифицированность(); КонецПроцедуры #КонецОбласти #Область Порядок // Чтение настроек. &НаСервере Процедура ОбновитьСортировку() СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; Раздел = Сортировка.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Сортировки'"); Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено); Строки = Раздел.ПолучитьЭлементы(); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Строка = Строки.Добавить(); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Если ТипЗнч(ЭлементНастройки) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда Строка.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'"); Строка.ЭтоАвтоПоле = Истина; Строка.Картинка = 18; Продолжить; КонецЕсли; ОписаниеНастройки = СвойствоЭлементаСтруктуры.ДоступныеПоляПорядка.НайтиПоле(ЭлементНастройки.Поле); Если ОписаниеНастройки = Неопределено Тогда УстановитьПометкуУдаления("Сортировка", Строка); Иначе ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); КонецЕсли; КонецЦикла; КонецПроцедуры // Добавление, изменение элементов. &НаКлиенте Процедура СортировкаВыбратьПоле(ИдентификаторСтроки, Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Обработчик = Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект, ИдентификаторСтроки); ВыбратьПоле("Сортировка", Обработчик, ЭлементНастройки.Поле); КонецПроцедуры &НаКлиенте Процедура СортировкаПослеВыбораПоля(ОписаниеНастройки, ИдентификаторСтроки = Неопределено) Экспорт Если ОписаниеНастройки = Неопределено Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляПорядка, ОписаниеНастройки); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Если ИдентификаторСтроки = Неопределено Тогда Родитель = Элементы.Сортировка.ТекущиеДанные; Если Родитель = Неопределено Тогда Родитель = КорневаяСтрокаПоУмолчанию("Сортировка"); КонецЕсли; Если Не Родитель.ЭтоРаздел Тогда Родитель = Родитель.ПолучитьРодителя(); КонецЕсли; Строка = Родитель.ПолучитьЭлементы().Добавить(); РодительЭлементаНастройки = СвойствоЭлементаСтруктуры; Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда РодительЭлементаНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор); КонецЕсли; ЭлементНастройки = РодительЭлементаНастройки.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); Иначе Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); КонецЕсли; ЭлементНастройки.Использование = Истина; ЭлементНастройки.Поле = ОписаниеНастройки.Поле; ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); Элементы.Сортировка.Развернуть(Сортировка.ПолучитьЭлементы()[0].ПолучитьИдентификатор()); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьТипУпорядочиванияСтрок(ТипУпорядочивания) ЭлементыКоллекции = Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы(); Если ЭлементыКоллекции.Количество() = 0 Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Для Каждого Элемент Из ЭлементыКоллекции Цикл ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Элемент); ЭлементНастройки.ТипУпорядочивания = ТипУпорядочивания; Элемент.ТипУпорядочивания = ЭлементНастройки.ТипУпорядочивания; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьТипУпорядочивания(Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; Иначе ЭлементНастройки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; КонецЕсли; Строка.ТипУпорядочивания = ЭлементНастройки.ТипУпорядочивания; УстановитьМодифицированность(); КонецПроцедуры // Перетаскивание элементов. // Параметры: // Строки - Массив из ДанныеФормыЭлементДерева: // * Идентификатор - ИдентификаторКомпоновкиДанных // &НаКлиенте Процедура ПеретащитьВыбранныеПоляВСортировку(Строки) ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Раздел = Сортировка.ПолучитьЭлементы()[0]; Для Каждого СтрокаИсточник Из Строки Цикл ЭлементНастройкиИсточник = ВыбранныеПоляЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда ПеретащитьВыбранныеПоляВСортировку(СтрокаИсточник.ПолучитьЭлементы()); ИначеЕсли ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда Найден = Ложь; Для Каждого ЭлементНастройкиПриемник Из СортировкаЭлементаСтруктуры.Элементы Цикл Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда Найден = Истина; Прервать; КонецЕсли; КонецЦикла; Если Не Найден Тогда ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); ЭлементНастройкиПриемник.Использование = Истина; СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.Картинка = 18; СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'"); СтрокаПриемник.ЭтоАвтоПоле = Истина; КонецЕсли; Иначе Если НайтиПолеПорядка(СортировкаЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) <> Неопределено Тогда Продолжить; КонецЕсли; ОписаниеНастройки = СортировкаЭлементаСтруктуры.ДоступныеПоляПорядка.НайтиПоле(ЭлементНастройкиИсточник.Поле); Если ОписаниеНастройки = Неопределено Тогда Продолжить; КонецЕсли; ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ЭлементНастройкиПриемник.Использование = Истина; СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ОписаниеНастройки); СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); КонецЕсли; КонецЦикла; Элементы.Сортировка.Развернуть(Раздел.ПолучитьИдентификатор()); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ПеретащитьСортировкуВнутриКоллекции(ПараметрыПеретаскивания, ТекущаяСтрока) КонецПроцедуры &НаКлиенте Функция НайтиПолеПорядка(СортировкаУзлаНастроек, Поле) Для Каждого ЭлементНастройки Из СортировкаУзлаНастроек.Элементы Цикл Если ТипЗнч(ЭлементНастройки) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") И ЭлементНастройки.Поле = Поле Тогда Возврат Поле; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции &НаКлиенте Процедура ПеретащитьПоляСортировкиВВыбранныеПоля(Строки) ВыбранныеПоляЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); СортировкаЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); РазделВыбранныхПолей = ВыбранныеПоля.ПолучитьЭлементы()[0]; РазделПолейСортировки = Сортировка.ПолучитьЭлементы()[0]; Индекс = Строки.Количество() - 1; Пока Индекс >= 0 Цикл СтрокаИсточник = Строки[Индекс]; ЭлементНастройкиИсточник = СортировкаЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда Найден = Ложь; Для Каждого ЭлементНастройкиПриемник Из ВыбранныеПоляЭлементаСтруктуры.Элементы Цикл Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда Найден = Истина; Прервать; КонецЕсли; КонецЦикла; Если Не Найден Тогда ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); СтрокаПриемник = РазделВыбранныхПолей.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); СтрокаПриемник.Идентификатор = ВыбранныеПоляЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.Картинка = 18; СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (поля родителя)'"); КонецЕсли; ИначеЕсли НайтиВыбранноеПоле(ВыбранныеПоляЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) = Неопределено Тогда ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); ОписаниеНастройки = ВыбранныеПоляЭлементаСтруктуры.ДоступныеПоляВыбора.НайтиПоле(ЭлементНастройкиИсточник.Поле); СтрокаПриемник = РазделВыбранныхПолей.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ОписаниеНастройки); СтрокаПриемник.Идентификатор = ВыбранныеПоляЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); КонецЕсли; СортировкаЭлементаСтруктуры.Элементы.Удалить(ЭлементНастройкиИсточник); РазделПолейСортировки.ПолучитьЭлементы().Удалить(СтрокаИсточник); Индекс = Индекс - 1; КонецЦикла; Элементы.ВыбранныеПоля.Развернуть(РазделВыбранныхПолей.ПолучитьИдентификатор(), Истина); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Функция НайтиВыбранноеПоле(ВыбранныеПоляУзлаНастроек, Поле) НайденноеПоле = Неопределено; Для Каждого ЭлементНастройки Из ВыбранныеПоляУзлаНастроек.Элементы Цикл Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда НайденноеПоле = НайтиВыбранноеПоле(ЭлементНастройки, Поле); ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ВыбранноеПолеКомпоновкиДанных") И ЭлементНастройки.Поле = Поле Тогда НайденноеПоле = Поле; КонецЕсли; КонецЦикла; Возврат НайденноеПоле; КонецФункции // Сдвиг элементов. &НаКлиенте Процедура СдвинутьСортировку(ВНачало = Истина) ИдентификаторыСтрок = Элементы.Сортировка.ВыделенныеСтроки; ИдентификаторРаздела = Сортировка.ПолучитьЭлементы()[0].ПолучитьИдентификатор(); ИндексРаздела = ИдентификаторыСтрок.Найти(ИдентификаторРаздела); Если ИндексРаздела <> Неопределено Тогда ИдентификаторыСтрок.Удалить(ИндексРаздела); КонецЕсли; Если ИдентификаторыСтрок.Количество() = 0 Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = Сортировка.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Строки = Строка.ПолучитьРодителя().ПолучитьЭлементы(); Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки); Граница = ЭлементыНастроек.Количество() - 1; Если ВНачало Тогда // Сдвиг в начало коллекции. Если Индекс = 0 Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница); Строки.Сдвинуть(Индекс, Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1); Строки.Сдвинуть(Индекс, -1); КонецЕсли; Иначе // Сдвиг в конец коллекции. Если Индекс = Граница Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница); Строки.Сдвинуть(Индекс, -Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1); Строки.Сдвинуть(Индекс, 1); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры #КонецОбласти #Область Оформление // Чтение настроек. &НаСервере Процедура ОбновитьОформление() СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; ПрочитатьПредопределенныеПараметрыОформления(); Строки = Оформление.ПолучитьЭлементы(); Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл Строка = Строки.Добавить(); ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.Картинка = -1; Если ЭлементОформленияПомеченНаУдаление(ЭлементНастройки.Поля) Тогда УстановитьПометкуУдаления("Оформление", Строка); КонецЕсли; Строка.Представление = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления( ЭлементНастройки, ЭлементНастройки, ?(Строка.ПометкаУдаления, "ПометкаУдаления", "")); Если ЗначениеЗаполнено(Строка.ПредставлениеПользовательскойНастройки) Тогда Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки; Иначе Строка.Заголовок = Строка.Представление; КонецЕсли; Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.ПредставлениеПользовательскойНастройки); Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); КонецЦикла; КонецПроцедуры &НаСервере Функция ЭлементОформленияПомеченНаУдаление(Поля) ДоступныеПоля = Поля.ДоступныеПоляОформляемыхПолей; Для Каждого Элемент Из Поля.Элементы Цикл Если ДоступныеПоля.НайтиПоле(Элемент.Поле) = Неопределено Тогда Возврат Истина; КонецЕсли; КонецЦикла; Возврат Ложь; КонецФункции // Определяет свойства параметров вывода, влияющих на отображение заголовка, параметров данных и отборов. // См. также ОтчетыСервер.ИнициализироватьПредопределенныеПараметрыВывода(). // &НаСервере Процедура ПрочитатьПредопределенныеПараметрыОформления() Если РежимИзмененияЭлементаСтруктурыНастроек Тогда Возврат; КонецЕсли; ПредопределенныеПараметры = ПредопределенныеПараметрыВывода(Отчет.КомпоновщикНастроек.Настройки); // Параметр вывода Заголовок. Объект = ПредопределенныеПараметры.TITLE.Объект; Строка = Оформление.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(Строка, Объект, "Использование, Значение"); Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выводить заголовок для печати: %1'"), ?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'"))); Строка.Представление = НСтр("ru = 'Выводить заголовок для печати'"); Строка.Идентификатор = ПредопределенныеПараметры.TITLE.Идентификатор; Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = 4; Строка.ЭтоПараметрВывода = Истина; // Параметр вывода ВыводитьПараметры. Объект = ПредопределенныеПараметры.DATAPARAMETERSOUTPUT.Объект; СвязанныйОбъект = ПредопределенныеПараметры.FILTEROUTPUT.Объект; Строка = Оформление.ПолучитьЭлементы().Добавить(); Строка.Использование = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить); Строка.Заголовок = НСтр("ru = 'Выводить фильтры'"); Строка.Представление = НСтр("ru = 'Выводить фильтры'"); Строка.Идентификатор = ПредопределенныеПараметры.DATAPARAMETERSOUTPUT.Идентификатор; Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = 4; Строка.ЭтоПараметрВывода = Истина; КонецПроцедуры // Добавление, изменение элементов. &НаКлиенте Процедура ОформлениеИзменитьЭлемент(ИдентификаторСтроки = Неопределено, Строка = Неопределено) Обработчик = Новый ОписаниеОповещения("ОформлениеИзменитьЭлементЗавершение", ЭтотОбъект, ИдентификаторСтроки); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек); ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек); Если Строка = Неопределено Тогда ПараметрыФормы.Вставить("ИдентификаторКД", Неопределено); ПараметрыФормы.Вставить("Наименование", ""); Иначе ПараметрыФормы.Вставить("ИдентификаторКД", Строка.Идентификатор); ПараметрыФормы.Вставить("Наименование", Строка.Заголовок); КонецЕсли; ПараметрыФормы.Вставить("Заголовок", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Элемент условного оформления отчета ""%1""'"), ВариантНаименование)); ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ЭлементУсловногоОформленияОтчета", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик); КонецПроцедуры // Параметры: // Результат - Структура: // * ЭлементКД - ЭлементУсловногоОформления // * Наименование - Строка // ИдентификаторСтроки - Число // &НаКлиенте Процедура ОформлениеИзменитьЭлементЗавершение(Результат, ИдентификаторСтроки) Экспорт Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Отмена Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; Если Результат.Свойство("ОписаниеФормул") Тогда ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулы(Настройки, Настройки.ДоступныеПоляВыбора, Результат.ОписаниеФормул); КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); Раздел = КорневаяСтрокаПоУмолчанию("Оформление"); Если ИдентификаторСтроки = Неопределено Тогда Если Раздел = Неопределено Тогда Строка = Оформление.ПолучитьЭлементы().Добавить(); Иначе Строка = Раздел.ПолучитьЭлементы().Добавить(); КонецЕсли; ЭлементНастройки = СвойствоЭлементаСтруктуры.Элементы.Добавить(); Иначе Строка = Оформление.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЭлементНастройки.Отбор.Элементы.Очистить(); ЭлементНастройки.Поля.Элементы.Очистить(); КонецЕсли; ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(СвойствоЭлементаСтруктуры, ЭлементНастройки, Результат.ЭлементКД); ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор; Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда ЭлементНастройки.Представление = Результат.Наименование; КонецЕсли; Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Строка.Использование = ЭлементНастройки.Использование; Строка.Заголовок = Результат.Наименование; Если Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда Строка.Представление = Результат.Наименование; КонецЕсли; Строка.ЭтоПредопределенныйЗаголовок = (Строка.Заголовок = Строка.Представление); Если Строка.ЭтоПредопределенныйЗаголовок Тогда ЭлементНастройки.ПредставлениеПользовательскойНастройки = ""; Иначе ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок; КонецЕсли; Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); Элементы.Оформление.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СинхронизироватьПредопределенныеПараметрыВывода(Использование, ЭлементНастройки) ПараметрыВывода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы; Значение = ?(Использование, ТипВыводаТекстаКомпоновкиДанных.Авто, ТипВыводаТекстаКомпоновкиДанных.НеВыводить); Если ЭлементНастройки.Параметр = Новый ПараметрКомпоновкиДанных("Заголовок") Тогда СвязанныйЭлементНастройки = ПараметрыВывода.Найти("TITLEOUTPUT"); СвязанныйЭлементНастройки.Использование = Истина; СвязанныйЭлементНастройки.Значение = Значение; ИначеЕсли ЭлементНастройки.Параметр = Новый ПараметрКомпоновкиДанных("ВыводитьПараметрыДанных") Тогда СвязанныйЭлементНастройки = ПараметрыВывода.Найти("FILTEROUTPUT"); ЗаполнитьЗначенияСвойств(СвязанныйЭлементНастройки, ЭлементНастройки, "Использование, Значение"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОформлениеВводЗаголовкаЗавершение(Значение, Идентификатор) Экспорт Если Значение = Неопределено Тогда Возврат; КонецЕсли; Строка = Оформление.НайтиПоИдентификатору(Идентификатор); Строка.Использование = Истина; Строка.Значение = Значение; Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выводить заголовок для печати: %1'"), ?(ЗначениеЗаполнено(Значение), Значение, "<Отсутствует>")); Настройки = Отчет.КомпоновщикНастроек.Настройки; ПараметрыВывода = Настройки.ПараметрыВывода; ЭлементНастройки = ПараметрыВывода.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); ЭлементНастройки.Значение = Значение; ЭлементНастройки.Использование = Истина; Настройки.ДополнительныеСвойства.Вставить("ЗаголовокУстановленИнтерактивно", ЗначениеЗаполнено(Значение)); УстановитьМодифицированность(); КонецПроцедуры // Сдвиг элементов. &НаКлиенте Процедура СдвинутьОформление(ВНачало = Истина) ИдентификаторыСтрок = Элементы.Оформление.ВыделенныеСтроки; Строки = Оформление.ПолучитьЭлементы(); ГраницаНачалаЭлементовОформления = 2; ГраницаИдентификаторовСтрок = ИдентификаторыСтрок.ВГраница(); Пока ГраницаИдентификаторовСтрок >= 0 Цикл Строка = Оформление.НайтиПоИдентификатору(ИдентификаторыСтрок[ГраницаИдентификаторовСтрок]); Если Строки.Индекс(Строка) < ГраницаНачалаЭлементовОформления Тогда ИдентификаторыСтрок.Удалить(ГраницаИдентификаторовСтрок); КонецЕсли; ГраницаИдентификаторовСтрок = ГраницаИдентификаторовСтрок - 1; КонецЦикла; Если ИдентификаторыСтрок.Количество() = 0 Тогда Возврат; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл Строка = Оформление.НайтиПоИдентификатору(ИдентификаторСтроки); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если ТипЗнч(ЭлементНастройки) <> Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда Продолжить; КонецЕсли; ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; Индекс = ЭлементыНастроек.Индекс(ЭлементНастройки); Граница = ЭлементыНастроек.Количество() - 1; Если ВНачало Тогда // Сдвиг в начало коллекции. Если Индекс = 0 Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, Граница); Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -1); Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -1); КонецЕсли; Иначе // Сдвиг в конец коллекции. Если Индекс = Граница Тогда ЭлементыНастроек.Сдвинуть(ЭлементНастройки, -Граница); Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, -Граница); Иначе ЭлементыНастроек.Сдвинуть(ЭлементНастройки, 1); Строки.Сдвинуть(Индекс + ГраницаНачалаЭлементовОформления, 1); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры // Использование элементов. &НаКлиенте Процедура ИзменитьИспользованиеПредопределенныхПараметровВывода(Использование = Истина) Если РежимИзмененияЭлементаСтруктурыНастроек Тогда Возврат; КонецЕсли; ЭлементыОформления = Оформление.ПолучитьЭлементы(); СвойствоЭлементаСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода; Для Каждого ЭлементОформления Из ЭлементыОформления Цикл Если ТипЗнч(ЭлементОформления.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда Продолжить; КонецЕсли; ЭлементОформления.Использование = Использование; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, ЭлементОформления); ЭлементНастройки.Использование = Использование; КонецЦикла; КонецПроцедуры // Обработчик закрытия общей формы НастройкаКолонтитулов. // См. Синтакс-помощник: ОткрытьФорму - ОписаниеОповещенияОЗакрытии. // &НаКлиенте Процедура ЗапомнитьНастройкиКолонтитулов(Настройки, ДополнительныеПараметры) Экспорт ПредыдущиеНастройки = Неопределено; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("НастройкиКолонтитулов", ПредыдущиеНастройки); Если Настройки <> ПредыдущиеНастройки Тогда УстановитьМодифицированность(); КонецЕсли; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("НастройкиКолонтитулов", Настройки); КонецПроцедуры #КонецОбласти #Область Структура // Чтение настроек. &НаСервере Процедура ОбновитьСтруктуру() СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Возврат; КонецЕсли; Раздел = СтруктураВарианта.ПолучитьЭлементы().Добавить(); Раздел.Представление = НСтр("ru = 'Отчет'"); Раздел.ЭтоРаздел = Истина; Раздел.Картинка = -1; Раздел.Тип = СвойствоЭлементаСтруктуры; Строки = Раздел.ПолучитьЭлементы(); ОбновитьКоллекциюСтруктуры(СвойствоЭлементаСтруктуры, "Структура", Строки); КонецПроцедуры &НаСервере Процедура ОбновитьКоллекциюСтруктуры(Знач Узел, Знач ИмяКоллекции, Строки) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; Коллекция = Узел[ИмяКоллекции]; ТипКоллекции = ТипЗнч(Коллекция); ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Коллекция); Если ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда Если ЗначениеЗаполнено(Коллекция.ИдентификаторПользовательскойНастройки) Тогда СодержитПользовательскиеЭлементыСтруктуры = Истина; КонецЕсли; ИначеЕсли ИменаКоллекций.Найти(ИмяКоллекции) <> Неопределено И (ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Или ТипКоллекции = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")) Тогда Строка = Строки.Добавить(); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Коллекция); Строка.Представление = ПредставлениеКоллекцииЭлементаСтруктуры(ИмяКоллекции); Если ЗначениеЗаполнено(Коллекция.ПредставлениеПользовательскойНастройки) Тогда Строка.Представление = Коллекция.ПредставлениеПользовательскойНастройки; КонецЕсли; Строка.Картинка = -1; Строка.Тип = Коллекция; Строка.Подтип = ?(СтрНайти("Серии, Точки", ИмяКоллекции) > 0, "Диаграмма", "Таблица") + ИмяКоллекции; Строки = Строка.ПолучитьЭлементы(); КонецЕсли; Для Каждого Элемент Из Коллекция Цикл Если ЗначениеЗаполнено(Элемент.ИдентификаторПользовательскойНастройки) Тогда СодержитПользовательскиеЭлементыСтруктуры = Истина; КонецЕсли; ЭлементПользовательскойНастройки = ПользовательскиеНастройки.Найти(Элемент.ИдентификаторПользовательскойНастройки); Строка = Строки.Добавить(); Если ЭлементПользовательскойНастройки = Неопределено Тогда Строка.Использование = Элемент.Использование; Иначе Строка.Использование = ЭлементПользовательскойНастройки.Использование; КонецЕсли; Если ТипЗнч(Элемент) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Узел = Элемент.Настройки; СодержитВложенныеОтчеты = Истина; Иначе Узел = Элемент; ЗаполнитьЗначенияСвойств(Строка, Элемент); Если РасширенныйРежим = 0 И ЭлементПользовательскойНастройки <> Неопределено Тогда Строка.Использование = ЭлементПользовательскойНастройки.Использование; КонецЕсли; КонецЕсли; Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(Узел); Строка.ФлажокДоступен = (РасширенныйРежим = 1 Или ЭлементПользовательскойНастройки <> Неопределено); СвойстваЭлемента = СвойстваЭлементаКоллекцииСтруктуры(Элемент); ЗаполнитьЗначенияСвойств(Строка, СвойстваЭлемента); Строка.Подтип = Строка.ПолучитьРодителя().Подтип; Если СвойстваЭлемента.ПометкаУдаления Тогда УстановитьПометкуУдаления("СтруктураВарианта", Строка); КонецЕсли; Для Каждого ИмяКоллекции Из СвойстваЭлемента.ИменаКоллекций Цикл ОбновитьКоллекциюСтруктуры(Узел, ИмяКоллекции, Строка.ПолучитьЭлементы()); КонецЦикла; КонецЦикла; КонецПроцедуры // Параметры: // Элемент - НастройкиВложенногоОбъектаКомпоновкиДанных // // Возвращаемое значение: // Структура: // * СодержитУсловноеОформление - Булево // * СодержитПоляИлиСортировки - Булево // * СодержитОтборы - Булево // * Тип - Строка // * Картинка - Число // * ПометкаУдаления - Булево // * ИменаКоллекций - Массив // * Заголовок - Строка // * Представление - Строка // &НаСервере Функция СвойстваЭлементаКоллекцииСтруктуры(Элемент) СвойстваЭлемента = ПалитраСвойствЭлементаКоллекцииСтруктуры(); ТипЭлемента = ТипЗнч(Элемент); Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда СвойстваЭлемента.Представление = ВариантыОтчетовСлужебный.ПредставлениеПолейГруппировки( Элемент, СвойстваЭлемента.ПометкаУдаления); ИначеЕсли ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Объекты = ДоступныеОбъектыНастройки(Элемент); ОписаниеОбъекта = Объекты.Найти(Элемент.ИдентификаторОбъекта); СвойстваЭлемента.Представление = ОписаниеОбъекта.Заголовок; Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки; КонецЕсли; Если Не ЗначениеЗаполнено(СвойстваЭлемента.Представление) Тогда СвойстваЭлемента.Представление = НСтр("ru = 'Вложенная группировка'"); КонецЕсли; ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда СвойстваЭлемента.Представление = НСтр("ru = 'Таблица'"); Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки; КонецЕсли; ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда СвойстваЭлемента.Представление = НСтр("ru = 'Диаграмма'"); Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда СвойстваЭлемента.Представление = Элемент.ПредставлениеПользовательскойНастройки; КонецЕсли; Иначе СвойстваЭлемента.Представление = Строка(ТипЭлемента); КонецЕсли; Если ТипЭлемента <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда ПараметрыВывода = Элемент.ПараметрыВывода; // ЗначенияПараметровВыводаКомпоновкиДанных ЗаголовокЭлемента = ПараметрыВывода.Элементы.Найти("Заголовок"); Если ЗаголовокЭлемента <> Неопределено Тогда СвойстваЭлемента.Заголовок = ЗаголовокЭлемента.Значение; КонецЕсли; КонецЕсли; СвойстваЭлемента.ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(Элемент); ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЭлемента); СостояниеЭлемента = ?(СвойстваЭлемента.ПометкаУдаления, "ПометкаУдаления", Неопределено); СвойстваЭлемента.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента, СостояниеЭлемента); СвойстваЭлемента.Тип = Элемент; УстановитьПризнакиВложенныхЭлементовНастроек(Элемент, СвойстваЭлемента); Возврат СвойстваЭлемента; КонецФункции &НаСервере Функция ПалитраСвойствЭлементаКоллекцииСтруктуры() СвойстваЭлемента = Новый Структура; СвойстваЭлемента.Вставить("Представление", ""); СвойстваЭлемента.Вставить("Заголовок", ""); СвойстваЭлемента.Вставить("ИменаКоллекций", Новый Массив); СвойстваЭлемента.Вставить("ПометкаУдаления", Ложь); СвойстваЭлемента.Вставить("Картинка", -1); СвойстваЭлемента.Вставить("Тип", ""); СвойстваЭлемента.Вставить("СодержитОтборы", Ложь); СвойстваЭлемента.Вставить("СодержитПоляИлиСортировки", Ложь); СвойстваЭлемента.Вставить("СодержитУсловноеОформление", Ложь); Возврат СвойстваЭлемента; КонецФункции &НаСервере Функция ДоступныеОбъектыНастройки(НастройкиВложенногоОбъекта) Если ТипЗнч(НастройкиВложенногоОбъекта.Родитель) = Тип("НастройкиКомпоновкиДанных") Тогда Возврат НастройкиВложенногоОбъекта.Родитель.ДоступныеОбъекты.Элементы; Иначе Возврат ДоступныеОбъектыНастройки(НастройкиВложенногоОбъекта.Родитель); КонецЕсли; КонецФункции &НаСервере Процедура УстановитьПризнакиВложенныхЭлементовНастроек(ЭлементСтруктуры, СвойстваЭлементаСтруктуры) ТипЭлемента = ТипЗнч(ЭлементСтруктуры); Если ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Или ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда Возврат; КонецЕсли; Элемент = ЭлементСтруктуры; Если ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Элемент = ЭлементСтруктуры.Настройки; КонецЕсли; СвойстваЭлементаСтруктуры.СодержитОтборы = Элемент.Отбор.Элементы.Количество(); СвойстваЭлементаСтруктуры.СодержитУсловноеОформление = Элемент.УсловноеОформление.Элементы.Количество(); ВложенныеЭлементы = Элемент.Выбор.Элементы; СодержитПоля = ВложенныеЭлементы.Количество() > 0 И Не (ВложенныеЭлементы.Количество() = 1 И ТипЗнч(ВложенныеЭлементы[0]) = Тип("АвтоВыбранноеПолеКомпоновкиДанных")); ВложенныеЭлементы = Элемент.Порядок.Элементы; СодержитСортировки = ВложенныеЭлементы.Количество() > 0 И Не (ВложенныеЭлементы.Количество() = 1 И ТипЗнч(ВложенныеЭлементы[0]) = Тип("АвтоЭлементПорядкаКомпоновкиДанных")); СвойстваЭлементаСтруктуры.СодержитПоляИлиСортировки = СодержитПоля Или СодержитСортировки; // Установка служебных признаков. Если СвойстваЭлементаСтруктуры.СодержитОтборы Тогда СодержитВложенныеОтборы = Истина; КонецЕсли; Если СвойстваЭлементаСтруктуры.СодержитПоляИлиСортировки Тогда СодержитВложенныеПоляИлиСортировки = Истина; КонецЕсли; Если СвойстваЭлементаСтруктуры.СодержитУсловноеОформление Тогда СодержитВложенноеУсловноеОформление = Истина; КонецЕсли; КонецПроцедуры // Добавление, изменение элементов. &НаКлиенте Процедура ДобавитьГруппировкуСтруктурыВарианта(СледующийУровень = Истина) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("СледующийУровень", СледующийУровень); ПараметрыВыполнения.Вставить("Оборачивать", Истина); ИдентификаторЭлементаСтруктуры = Неопределено; Строка = Элементы.СтруктураВарианта.ТекущиеДанные; Если Строка = Неопределено Тогда Строка = КорневаяСтрокаПоУмолчанию("СтруктураВарианта"); КонецЕсли; Если Строка <> Неопределено Тогда Если Не СледующийУровень Тогда Строка = Строка.ПолучитьРодителя(); КонецЕсли; Если СледующийУровень Тогда Если (Строка.Тип = "НастройкиКомпоновкиДанных" И Не Строка.ФлажокДоступен) Или Строка.ПолучитьЭлементы().Количество() > 1 Или (Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Строка.Подтип = "ТаблицаКолонки") Тогда ПараметрыВыполнения.Оборачивать = Ложь; КонецЕсли; КонецЕсли; Пока Строка <> Неопределено Цикл Если Строка.Тип = "НастройкиКомпоновкиДанных" Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных" Или Строка.Тип = "ГруппировкаКомпоновкиДанных" Или Строка.Тип = "ГруппировкаТаблицыКомпоновкиДанных" Или Строка.Тип = "ГруппировкаДиаграммыКомпоновкиДанных" Тогда ИдентификаторЭлементаСтруктуры = Строка.Идентификатор; Прервать; КонецЕсли; Строка = Строка.ПолучитьРодителя(); КонецЦикла; КонецЕсли; Обработчик = Новый ОписаниеОповещения("СтруктураВариантаПослеВыбораПоля", ЭтотОбъект, ПараметрыВыполнения); ВыбратьПоле("СтруктураВарианта", Обработчик, Неопределено, ИдентификаторЭлементаСтруктуры); КонецПроцедуры &НаКлиенте Процедура ДобавитьЭлементСтруктурыНастроек(ТипЭлемента) ТекущаяСтрока = Элементы.СтруктураВарианта.ТекущиеДанные; Результат = ВставитьЭлементСтруктурыНастроек(ТипЭлемента, ТекущаяСтрока, Истина); ЭлементНастройки = Результат.ЭлементНастройки; Строка = Результат.Строка; Строка.Тип = ЭлементНастройки; Строка.Заголовок = Строка.Представление; Строка.ФлажокДоступен = Истина; Строка.Использование = ЭлементНастройки.Использование; ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ЭлементНастройки)); Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); ПодчиненныеСтроки = Строка.ПолучитьЭлементы(); Если Строка.Тип = "ДиаграммаКомпоновкиДанных" Тогда ЭлементНастройки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.СоединениеЗначенийПоСериям", ТипСоединенияЗначенийПоСериямДиаграммы.СоединениеКраев); УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.ЛинииСоединенияЗначенийПоСериям"); УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.ЦветСоединенияЗначенийПоСериям", WebЦвета.СеребристоСерый); УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.РежимСглаживания", РежимСглаживанияДиаграммы.ГладкаяКривая); УстановитьПараметрВывода(ЭлементНастройки, "ТипДиаграммы.РежимПолупрозрачности", РежимПолупрозрачностиДиаграммы.Использовать); Строка.Представление = НСтр("ru = 'Диаграмма'"); ПодчиненныйЭлементНастройки = ЭлементНастройки.Точки; ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки; ПодчиненнаяСтрока.Подтип = "ДиаграммаТочки"; ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки); ПодчиненнаяСтрока.Картинка = -1; ПодчиненнаяСтрока.Представление = НСтр("ru = 'Точки'"); ПодчиненныйЭлементНастройки = ЭлементНастройки.Серии; ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки; ПодчиненнаяСтрока.Подтип = "ДиаграммаСерии"; ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки); ПодчиненнаяСтрока.Картинка = -1; ПодчиненнаяСтрока.Представление = НСтр("ru = 'Серии'"); ИначеЕсли Строка.Тип = "ТаблицаКомпоновкиДанных" Тогда Строка.Представление = НСтр("ru = 'Таблица'"); ПодчиненныйЭлементНастройки = ЭлементНастройки.Строки; ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки; ПодчиненнаяСтрока.Подтип = "ТаблицаСтроки"; ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки); ПодчиненнаяСтрока.Картинка = -1; ПодчиненнаяСтрока.Представление = НСтр("ru = 'Строки'"); ПодчиненныйЭлементНастройки = ЭлементНастройки.Колонки; ПодчиненнаяСтрока = ПодчиненныеСтроки.Добавить(); // см. ЭлементКоллекцииФормыНастроек ПодчиненнаяСтрока.Тип = ПодчиненныйЭлементНастройки; ПодчиненнаяСтрока.Подтип = "ТаблицаКолонки"; ПодчиненнаяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ПодчиненныйЭлементНастройки); ПодчиненнаяСтрока.Картинка = -1; ПодчиненнаяСтрока.Представление = НСтр("ru = 'Колонки'"); КонецЕсли; Элементы.СтруктураВарианта.Развернуть(Строка.ПолучитьИдентификатор(), Истина); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СтруктураВариантаПослеВыбораПоля(ОписаниеНастройки, ПараметрыВыполнения) Экспорт Если ОписаниеНастройки = Неопределено Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки); ТекущаяСтрока = Элементы.СтруктураВарианта.ТекущиеДанные; СтрокиПеремещаемыеВНовуюГруппировку = Новый Массив; Если ПараметрыВыполнения.Оборачивать Тогда Если ПараметрыВыполнения.СледующийУровень Тогда Найденные = ТекущаяСтрока.ПолучитьЭлементы(); Для Каждого ПеремещаемаяСтрока Из Найденные Цикл СтрокиПеремещаемыеВНовуюГруппировку.Добавить(ПеремещаемаяСтрока); КонецЦикла; Иначе СтрокиПеремещаемыеВНовуюГруппировку.Добавить(ТекущаяСтрока); КонецЕсли; КонецЕсли; // Добавление новой группировки. Результат = ВставитьЭлементСтруктурыНастроек(Тип("ГруппировкаКомпоновкиДанных"), ТекущаяСтрока, ПараметрыВыполнения.СледующийУровень); ЭлементНастройки = Результат.ЭлементНастройки; ЭлементНастройки.Использование = Истина; ЭлементНастройки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); ЭлементНастройки.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); Если ОписаниеНастройки = "<>" Тогда // Детальные записи - добавлять поле не требуется. Представление = НСтр("ru = '<Детальные записи>'"); Иначе ПолеГруппировки = ЭлементНастройки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = ОписаниеНастройки.Поле; Представление = ОписаниеНастройки.Заголовок; КонецЕсли; Строка = Результат.Строка; Строка.Использование = ЭлементНастройки.Использование; Строка.Представление = Представление; Строка.ФлажокДоступен = Истина; Строка.Тип = ЭлементНастройки; ТипЭлемента = Тип(Строка.Тип); ПредставлениеТипаЭлемента = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЭлемента); СостояниеЭлемента = ?(Строка.ПометкаУдаления, "ПометкаУдаления", Неопределено); Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки(ПредставлениеТипаЭлемента, СостояниеЭлемента); Если Не ПараметрыВыполнения.СледующийУровень Тогда Строка.Заголовок = ТекущаяСтрока.Заголовок; ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка); ТекущаяСтрока.Заголовок = ""; ОбновитьЗаголовокЭлементаСтруктурыВарианта(ТекущаяСтрока); КонецЕсли; // Перемещение текущей группировки в новую. Для Каждого ПеремещаемаяСтрока Из СтрокиПеремещаемыеВНовуюГруппировку Цикл Результат = ПереместитьЭлементыСтруктурыВарианта(ПеремещаемаяСтрока, Строка); КонецЦикла; Элементы.СтруктураВарианта.Развернуть(Строка.ПолучитьИдентификатор(), Истина); Элементы.СтруктураВарианта.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры // Параметры: // ТипЭлемента - Тип // Строка - см. ЭлементКоллекцииФормыНастроек // СледующийУровень - Булево // // Возвращаемое значение: // Структура: // * Строка - см. ЭлементКоллекцииФормыНастроек // * СвойствоЭлементаСтруктуры - см. СвойствоЭлементаСтруктурыНастроек // * ЭлементНастройки - см. ЭлементНастройки // &НаКлиенте Функция ВставитьЭлементСтруктурыНастроек(ТипЭлемента, Строка, СледующийУровень) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); Если Строка = Неопределено Тогда Строка = КорневаяСтрокаПоУмолчанию("СтруктураВарианта"); КонецЕсли; Родитель = ПолучитьРодителя("СтруктураВарианта", Строка); Если Не ЗначениеЗаполнено(Строка.Подтип) Тогда Строка.Подтип = Родитель.Подтип; КонецЕсли; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ИмяКоллекции = ?(ЗначениеЗаполнено(Строка.Подтип), Строка.Подтип, Неопределено); Если СледующийУровень Тогда Строки = Строка.ПолучитьЭлементы(); Индекс = Неопределено; ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, ЭлементНастройки, ИмяКоллекции); ИндексЭлементаНастройки = Неопределено Иначе // Вставка на один уровень со строкой. Родитель = ПолучитьРодителя("СтруктураВарианта", Строка); Строки = Родитель.ПолучитьЭлементы(); Индекс = Строки.Индекс(Строка) + 1; РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки); ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки, ИмяКоллекции); ИндексЭлементаНастройки = ЭлементыНастроек.Индекс(ЭлементНастройки) + 1; КонецЕсли; Если Индекс = Неопределено Тогда НоваяСтрока = Строки.Добавить(); Иначе НоваяСтрока = Строки.Вставить(Индекс); КонецЕсли; Если ОтчетыКлиент.ПриДобавленииВКоллекциюНужноУказыватьТипЭлемента(ТипЗнч(ЭлементыНастроек)) Тогда Если ИндексЭлементаНастройки = Неопределено Тогда НовыйЭлементНастройки = ЭлементыНастроек.Добавить(ТипЭлемента); Иначе НовыйЭлементНастройки = ЭлементыНастроек.Вставить(ИндексЭлементаНастройки, ТипЭлемента); КонецЕсли; Иначе Если ИндексЭлементаНастройки = Неопределено Тогда НовыйЭлементНастройки = ЭлементыНастроек.Добавить(); Иначе НовыйЭлементНастройки = ЭлементыНастроек.Вставить(ИндексЭлементаНастройки); КонецЕсли; КонецЕсли; Элементы.СтруктураВарианта.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор(); НоваяСтрока.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(НовыйЭлементНастройки); Результат = Новый Структура("Строка, СвойствоЭлементаСтруктуры, ЭлементНастройки"); Результат.Строка = НоваяСтрока; Результат.СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктуры; Результат.ЭлементНастройки = НовыйЭлементНастройки; Возврат Результат; КонецФункции &НаКлиенте Функция ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта() ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ПередЧемВставить", Неопределено); ДополнительныеПараметры.Вставить("Индекс", Неопределено); ДополнительныеПараметры.Вставить("ИндексЭлементаНастройки", Неопределено); ДополнительныеПараметры.Вставить("Копировать", Ложь); Возврат ДополнительныеПараметры; КонецФункции &НаКлиенте Функция ПереместитьЭлементыСтруктурыВарианта(Знач Строка, Знач НовыйРодитель, Знач ДополнительныеПараметры = Неопределено) Результат = Новый Структура("Строка, ЭлементНастройки, Индекс, ИндексЭлементаНастройки"); Если ДополнительныеПараметры = Неопределено Тогда ДополнительныеПараметры = ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта(); КонецЕсли; ПередЧемВставить = ДополнительныеПараметры.ПередЧемВставить; Индекс = ДополнительныеПараметры.Индекс; ИндексЭлементаНастройки = ДополнительныеПараметры.ИндексЭлементаНастройки; Копировать = ДополнительныеПараметры.Копировать; ДобавлятьВКонец = (НовыйРодитель = Неопределено); КудаВставить = ПолучитьЭлементы(СтруктураВарианта, НовыйРодитель); УзелКД = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); ЭлементКД = ЭлементНастройки(УзелКД, Строка); НовыйРодительКД = ЭлементНастройки(УзелКД, НовыйРодитель); КудаВставитьКД = ЭлементыНастроек(УзелКД, НовыйРодительКД); ПередЧемВставитьКД = ЭлементНастройки(УзелКД, ПередЧемВставить); СтарыйРодитель = ПолучитьРодителя("СтруктураВарианта", Строка); ОткудаПереместить = ПолучитьЭлементы(СтруктураВарианта, СтарыйРодитель); СтарыйРодительКД = ЭлементНастройки(УзелКД, СтарыйРодитель); ОткудаПереместитьКД = ЭлементыНастроек(УзелКД, СтарыйРодительКД); Если ЭлементКД = ПередЧемВставитьКД Тогда Результат.ЭлементНастройки = ЭлементКД; Результат.Строка = Строка; Иначе Если Индекс = Неопределено Или ИндексЭлементаНастройки = Неопределено Тогда Если ПередЧемВставитьКД = Неопределено Тогда Если ДобавлятьВКонец Тогда Индекс = КудаВставить.Количество(); ИндексЭлементаНастройки = КудаВставитьКД.Количество(); Иначе Индекс = 0; ИндексЭлементаНастройки = 0; КонецЕсли; Иначе Индекс = КудаВставить.Индекс(ПередЧемВставить); ИндексЭлементаНастройки = КудаВставитьКД.Индекс(ПередЧемВставитьКД); Если СтарыйРодитель = НовыйРодитель Тогда СтарыйИндекс = ОткудаПереместить.Индекс(Строка); Если СтарыйИндекс <= Индекс Тогда Индекс = Индекс + 1; ИндексЭлементаНастройки = ИндексЭлементаНастройки + 1; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; ПоискЭлементовКД = Новый Соответствие; Результат.ЭлементНастройки = ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексЭлементаНастройки, ПоискЭлементовКД); ПоискСтрокТаблицы = Новый Соответствие; Результат.Строка = ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, Строка, КудаВставить, Индекс, ПоискСтрокТаблицы); Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл СтараяСтрока = КлючИЗначение.Ключ; // см. ЭлементКоллекцииФормыНастроек НоваяСтрока = КлючИЗначение.Значение; // см. ЭлементКоллекцииФормыНастроек НоваяСтрока.Идентификатор = ПоискЭлементовКД.Получить(СтараяСтрока.Идентификатор); КонецЦикла; Если Не Копировать Тогда ОткудаПереместить.Удалить(Строка); ОткудаПереместитьКД.Удалить(ЭлементКД); КонецЕсли; КонецЕсли; Результат.Индекс = КудаВставить.Индекс(Результат.Строка); Результат.ИндексЭлементаНастройки = КудаВставитьКД.Индекс(Результат.ЭлементНастройки); Возврат Результат; КонецФункции &НаКлиенте Процедура СтруктураВариантаПриИзмененииТекущейСтроки() Строка = Элементы.СтруктураВарианта.ТекущиеДанные; Элементы.КомандыСтруктурыВарианта_Добавление.Доступность = Строка <> Неопределено; Элементы.КомандыСтруктурыВарианта_Добавление1.Доступность = Элементы.КомандыСтруктурыВарианта_Добавление.Доступность; Если Строка <> Неопределено Тогда УстановитьДоступностьКомандСтруктурыВарианта(Строка.ПолучитьИдентификатор()); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УстановитьДоступностьКомандСтруктурыВарианта(ИдентификаторСтроки) Строка = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); ЕстьРодитель = (Родитель <> Неопределено); ЕстьПотенциальныеРодители = ЕстьРодитель И ПолучитьЭлементы(СтруктураВарианта, Родитель).Индекс(Строка) > 0; ЕстьПодчиненные = (Строка.ПолучитьЭлементы().Количество() > 0); ЕстьСоседние = ПолучитьЭлементы(СтруктураВарианта, Родитель).Количество() > 1; МожноДобавлятьВложенные = (Строка.Тип <> "ТаблицаКомпоновкиДанных" И Строка.Тип <> "ДиаграммаКомпоновкиДанных"); МожноГруппировать = (Строка.Тип <> "НастройкиКомпоновкиДанных" И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"); МожноОткрывать = (Строка.Тип <> "НастройкиКомпоновкиДанных" И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных" И Строка.Тип <> "ТаблицаКомпоновкиДанных" И Строка.Тип <> "ДиаграммаКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"); МожноУдалятьИПеремещать = (Строка.Тип <> "НастройкиКомпоновкиДанных" И Строка.Тип <> "НастройкиВложенногоОбъектаКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Строка.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"); МожноДобавлятьТаблицыИДиаграммы = (Строка.Тип = "НастройкиКомпоновкиДанных" Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных" Или Строка.Тип = "ГруппировкаКомпоновкиДанных"); РодителяМожноПеремещать = (ЕстьРодитель И Родитель.Тип <> "НастройкиКомпоновкиДанных" И Родитель.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Родитель.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"); Элементы.СтруктураВарианта_Добавить.Доступность = МожноДобавлятьВложенные; Элементы.СтруктураВарианта_Добавить1.Доступность = МожноДобавлятьВложенные; Элементы.СтруктураВарианта_Изменить.Доступность = МожноОткрывать; Элементы.СтруктураВарианта_Изменить1.Доступность = МожноОткрывать; Элементы.СтруктураВарианта_ДобавитьТаблицу.Доступность = МожноДобавлятьТаблицыИДиаграммы; Элементы.СтруктураВарианта_ДобавитьТаблицу1.Доступность = МожноДобавлятьТаблицыИДиаграммы; Элементы.СтруктураВарианта_ДобавитьДиаграмму.Доступность = МожноДобавлятьТаблицыИДиаграммы; Элементы.СтруктураВарианта_ДобавитьДиаграмму1.Доступность = МожноДобавлятьТаблицыИДиаграммы; Элементы.СтруктураВарианта_Удалить.Доступность = МожноУдалятьИПеремещать; Элементы.СтруктураВарианта_Удалить1.Доступность = МожноУдалятьИПеремещать; Элементы.СтруктураВарианта_Сгруппировать.Доступность = МожноГруппировать; Элементы.СтруктураВарианта_Сгруппировать1.Доступность = МожноГруппировать; Элементы.СтруктураВарианта_ПереместитьВышеИЛевее.Доступность = МожноУдалятьИПеремещать И РодителяМожноПеремещать И МожноДобавлятьВложенные И МожноГруппировать; Элементы.СтруктураВарианта_ПереместитьВышеИЛевее1.Доступность = МожноУдалятьИПеремещать И РодителяМожноПеремещать И МожноДобавлятьВложенные И МожноГруппировать; Элементы.СтруктураВарианта_ПереместитьНижеИПравее.Доступность = МожноУдалятьИПеремещать И ЕстьПодчиненные И МожноДобавлятьВложенные И МожноГруппировать; Элементы.СтруктураВарианта_ПереместитьНижеИПравее1.Доступность = МожноУдалятьИПеремещать И ЕстьПодчиненные И МожноДобавлятьВложенные И МожноГруппировать; Элементы.СтруктураВарианта_ПереместитьВверх.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьВверх1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьВниз.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьВниз1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше.Доступность = МожноУдалятьИПеремещать И ЕстьРодитель И РодителяМожноПеремещать; Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше1.Доступность = МожноУдалятьИПеремещать И ЕстьРодитель И РодителяМожноПеремещать; Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже.Доступность = МожноУдалятьИПеремещать И ЕстьПотенциальныеРодители; Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже1.Доступность = МожноУдалятьИПеремещать И ЕстьПотенциальныеРодители; КонецПроцедуры &НаКлиенте Процедура ИзменитьЭлементСтруктуры(Строка, ИмяСтраницы = Неопределено, ИспользоватьФормуВарианта = Неопределено) Если Строка = Неопределено Тогда Строки = СтруктураВарианта.ПолучитьЭлементы(); Если Строки.Количество() = 0 Тогда Возврат; КонецЕсли; Строка = Строки[0]; КонецЕсли; Если ИспользоватьФормуВарианта = Неопределено Тогда ИспользоватьФормуВарианта = (Строка.Тип = "ТаблицаКомпоновкиДанных" Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных"); КонецЕсли; Обработчик = Новый ОписаниеОповещения("ИзменитьЭлементСтруктурыЗавершение", ЭтотОбъект); ШаблонЗаголовка = НСтр("ru = 'Настройка %1 отчета ""%2""'"); Если Строка.Тип = "ДиаграммаКомпоновкиДанных" Тогда ПредставлениеЭлемента = НСтр("ru = 'диаграммы'"); Иначе ПредставлениеЭлемента = НСтр("ru = 'группировки'"); КонецЕсли; Если ЗначениеЗаполнено(Строка.Заголовок) Тогда ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Заголовок + """"; ИначеЕсли ЗначениеЗаполнено(Строка.Представление) Тогда ПредставлениеЭлемента = ПредставлениеЭлемента + " """ + Строка.Представление + """"; КонецЕсли; СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ПутьКЭлементуСтруктурыНастроек = ОтчетыКлиент.ПолныйПутьКЭлементуНастроек( Отчет.КомпоновщикНастроек.Настройки, ЭлементНастройки); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование); ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", Строка.Идентификатор); ПараметрыФормы.Вставить("ПутьКЭлементуСтруктурыНастроек", ПутьКЭлементуСтруктурыНастроек); ПараметрыФормы.Вставить("ТипЭлементаСтруктурыНастроек", Строка.Тип); ПараметрыФормы.Вставить("Заголовок", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонЗаголовка, ПредставлениеЭлемента, ВариантНаименование)); Если ИмяСтраницы <> Неопределено Тогда ПараметрыФормы.Вставить("ИмяСтраницы", ИмяСтраницы); КонецЕсли; ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров); Если ВыполнятьЗамеры Тогда МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); МодульОценкаПроизводительностиКлиент.ЗамерВремени( НастройкиОтчета.КлючЗамеров + ".Настройки", Ложь, Ложь); КонецЕсли; ИмяОткрываемойФормы = НастройкиОтчета.ПолноеИмя + ?(ИспользоватьФормуВарианта, ".ФормаВарианта", ".ФормаНастроек"); ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект,,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаКлиенте Процедура ИзменитьЭлементСтруктурыЗавершение(Результат, Контекст) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Или Результат = КодВозвратаДиалога.Отмена Тогда Возврат; КонецЕсли; Если Результат.ВариантМодифицирован Тогда ОбновитьФорму(Результат); Раздел = КорневаяСтрокаПоУмолчанию("СтруктураВарианта"); Элементы.СтруктураВарианта.Развернуть(Раздел.ПолучитьИдентификатор(), Истина); КонецЕсли; КонецПроцедуры #КонецОбласти #Область Общее #Область ОбработчикиОповещений &НаКлиенте Функция ПараметрыЗаполненияСписка(ЗакрыватьПриВыборе = Ложь, МножественныйВыбор = Истина, ДобавлятьСтроку = Истина) ПараметрыЗаполнения = Новый Структура("ПутьКСписку, Индекс, Владелец, ВыбранныйТип, ВыборГруппИЭлементов"); ПараметрыЗаполнения.Вставить("ДобавлятьСтроку", ДобавлятьСтроку); // Стандартные параметры формы. ПараметрыЗаполнения.Вставить("ЗакрыватьПриВыборе", ЗакрыватьПриВыборе); ПараметрыЗаполнения.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина); ПараметрыЗаполнения.Вставить("Отбор", Новый Структура); // Стандартные параметры формы выбора (см. Расширение управляемой формы для динамического списка). ПараметрыЗаполнения.Вставить("МножественныйВыбор", МножественныйВыбор); ПараметрыЗаполнения.Вставить("РежимВыбора", Истина); // Предполагаемые реквизиты. ПараметрыЗаполнения.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); ПараметрыЗаполнения.Вставить("РазрешитьНачалоПеретаскивания", Ложь); Возврат ПараметрыЗаполнения; КонецФункции &НаКлиенте Процедура НачатьЗаполнениеСписка(Элемент, ПараметрыЗаполнения, ВыборПереопределен = Неопределено, ЭтоПодбор = Ложь) ТипЗначения = ЭтотОбъект[ПараметрыЗаполнения.ПутьКСписку].ТипЗначения; ПолеСписка = Элементы[ПараметрыЗаполнения.ПутьКСписку]; // ТаблицаФормы ПолеЗначения = Элементы[ПараметрыЗаполнения.ПутьКСписку + "Значение"]; Сведения = ОтчетыКлиент.СведенияОЭлементеНастройки(Отчет.КомпоновщикНастроек, ПараметрыЗаполнения.Индекс); ВыборГруппИЭлементов = Неопределено; Если Сведения.Описание <> Неопределено Тогда ВыборГруппИЭлементов = Сведения.Описание.ВыборГруппИЭлементов; КонецЕсли; ЭлементПользовательскойНастройки = Сведения.ЭлементПользовательскойНастройки; Условие = ОтчетыКлиентСервер.УсловиеЭлементаНастройки(ЭлементПользовательскойНастройки, Сведения.Описание); ПолеЗначения.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ЗначениеТипаГруппыИЭлементы( ВыборГруппИЭлементов, Условие); ПараметрыЗаполнения.ВыборГруппИЭлементов = ОтчетыКлиент.ЗначениеТипаИспользованиеГруппИЭлементов( ВыборГруппИЭлементов, Условие); РасширенноеОписаниеТипов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства, "РасширенноеОписаниеТипов", Новый Соответствие); РасширенноеОписаниеТипа = РасширенноеОписаниеТипов[ПараметрыЗаполнения.Индекс]; Если РасширенноеОписаниеТипа <> Неопределено Тогда ТипЗначения = РасширенноеОписаниеТипа.ОписаниеТиповДляФормы; КонецЕсли; Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ЭтоПодбор", Ложь) Тогда ТипЗначения = ОписаниеТиповБезПримитивных(ТипЗначения); КонецЕсли; ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; ПараметрыВыбора = ОтчетыКлиентСервер.ПараметрыВыбора(Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент); ПараметрыЗаполнения.Вставить("ПараметрыВыбора", ПараметрыВыбора); ТипЗначения = ОтчетыКлиент.ТипЗначенияОграниченныйСвязьюПоТипу( Сведения.Настройки, ПользовательскиеНастройки, Сведения.Элемент, Сведения.Описание, ТипЗначения); Если ТипЗнч(ЭлементПользовательскойНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда ТекущееЗначение = ЭлементПользовательскойНастройки.ПравоеЗначение; Иначе ТекущееЗначение = ЭлементПользовательскойНастройки.Значение; КонецЕсли; ОтмеченныеЗначения = ОтчетыКлиентСервер.ЗначенияСписком(ТекущееЗначение); Если ОтмеченныеЗначения.Количество() > 0 Тогда ПараметрыЗаполнения.Вставить("ТекущаяСтрока", ОтмеченныеЗначения[0].Значение); КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗавершитьЗаполнениеСписка", ЭтотОбъект, ПараметрыЗаполнения); Если ОтчетыКлиент.ВыборПереопределен(ЭтотОбъект, Обработчик, Сведения.Описание, ТипЗначения, ОтмеченныеЗначения, ПараметрыВыбора) Тогда ВыборПереопределен = Истина; Возврат; КонецЕсли; Если ВыборПереопределен <> Неопределено Тогда Возврат; КонецЕсли; Типы = ТипЗначения.Типы(); Если Типы.Количество() = 0 Тогда Если ПараметрыЗаполнения.ДобавлятьСтроку Тогда ПолеСписка.ДобавитьСтроку(); КонецЕсли; Возврат; КонецЕсли; Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ЭтоПодбор", Ложь) И ОтчетыКлиент.ЭтоВыборОбъектовМетаданных(ТипЗначения, ОтмеченныеЗначения, Обработчик) Тогда Возврат; КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("Типы", Типы); Контекст.Вставить("ПараметрыЗаполнения", ПараметрыЗаполнения); Контекст.Вставить("Элемент", Элемент); Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗаполнения, "ЭтоПодбор", Ложь) Тогда ОтчетыКлиент.НачатьВыборПользователей(ЭтотОбъект, Элемент, ТипЗначения, ОтмеченныеЗначения, ПараметрыВыбора, Обработчик, Новый ОписаниеОповещения("НачатьЗаполнениеСпискаПродолжение", ЭтотОбъект, Контекст)); Иначе НачатьЗаполнениеСпискаПродолжение(Неопределено, Контекст); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура НачатьЗаполнениеСпискаПродолжение(ВыбранныйЭлемент, Контекст) Экспорт Если ВыбранныйЭлемент <> Неопределено Тогда ПродолжитьЗаполнениеСписка(ВыбранныйЭлемент, Контекст.ПараметрыЗаполнения); Возврат; КонецЕсли; Если Контекст.Типы.Количество() = 1 Тогда Контекст.ПараметрыЗаполнения.ВыбранныйТип = Контекст.Типы[0]; ПродолжитьЗаполнениеСписка(-1, Контекст.ПараметрыЗаполнения); Возврат; КонецЕсли; ДоступныеТипы = Новый СписокЗначений; ДоступныеТипы.ЗагрузитьЗначения(Контекст.Типы); Обработчик = Новый ОписаниеОповещения("ПродолжитьЗаполнениеСписка", ЭтотОбъект, Контекст.ПараметрыЗаполнения); ПоказатьВыборИзМеню(Обработчик, ДоступныеТипы, Контекст.Элемент); КонецПроцедуры &НаКлиенте Процедура ПродолжитьЗаполнениеСписка(ВыбранныйЭлемент, ПараметрыЗаполнения) Экспорт Если ВыбранныйЭлемент = Неопределено Тогда Возврат; КонецЕсли; Если ВыбранныйЭлемент <> -1 Тогда ПараметрыЗаполнения.ВыбранныйТип = ВыбранныйЭлемент.Значение; КонецЕсли; ПараметрыПодбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства, "ПараметрыПодбора", Новый Соответствие); ПутьКФорме = ПараметрыПодбора[ПараметрыЗаполнения.Индекс]; Если Не ЗначениеЗаполнено(ПутьКФорме) Тогда ПутьКФорме = ПараметрыПодбора[ПараметрыЗаполнения.ВыбранныйТип]; КонецЕсли; Если Не ЗначениеЗаполнено(ПутьКФорме) Тогда Список = ЭтотОбъект[ПараметрыЗаполнения.ПутьКСписку]; Если ТипЗнч(Список) = Тип("СписокЗначений") И ЗначениеЗаполнено(Список) Тогда ПоследнийЭлемент = Список[Список.Количество()-1]; Если ПоследнийЭлемент.Значение = Неопределено Тогда ОписаниеТипа = Новый ОписаниеТипов( ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ВыбранныйЭлемент.Значение)); ПоследнийЭлемент.Значение = ОписаниеТипа.ПривестиЗначение(Неопределено); КонецЕсли; КонецЕсли; Возврат; КонецЕсли; Для Каждого Параметр Из ПараметрыЗаполнения.ПараметрыВыбора Цикл Если Не ЗначениеЗаполнено(Параметр.Имя) Тогда Продолжить; КонецЕсли; Если СтрНачинаетсяС(ВРег(Параметр.Имя), "ОТБОР.") Тогда ПараметрыЗаполнения.Отбор.Вставить(СтрРазделить(Параметр.Имя, ".")[1], Параметр.Значение); Иначе ПараметрыЗаполнения.Вставить(Параметр.Имя, Параметр.Значение); КонецЕсли; КонецЦикла; Владелец = ПараметрыЗаполнения.Владелец; ПараметрыЗаполнения.Удалить("Владелец"); ОткрытьФорму(ПутьКФорме, ПараметрыЗаполнения, Владелец); КонецПроцедуры &НаКлиенте Процедура ЗавершитьЗаполнениеСписка(ВыбранныеЗначения, ПараметрыЗаполнения) Экспорт Если ТипЗнч(ВыбранныеЗначения) = Тип("Массив") Тогда Значения = ВыбранныеЗначения; ВыбранныеЗначения = Новый СписокЗначений; ВыбранныеЗначения.ЗагрузитьЗначения(Значения); ВыбранныеЗначения.ЗаполнитьПометки(Истина); ИначеЕсли ТипЗнч(ВыбранныеЗначения) <> Тип("СписокЗначений") Тогда Возврат; КонецЕсли; ПутьКСписку = ПараметрыЗаполнения.ПутьКСписку; Список = ЭтотОбъект[ПутьКСписку]; Индекс = Список.Количество() - 1; Пока Индекс >= 0 Цикл Элемент = Список[Индекс]; Индекс = Индекс - 1; Если Элемент.Пометка И ВыбранныеЗначения.НайтиПоЗначению(Элемент.Значение) = Неопределено Тогда Список.Удалить(Элемент); КонецЕсли; КонецЦикла; Для Каждого Элемент Из ВыбранныеЗначения Цикл ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Список, Элемент.Значение, Элемент.Представление, Истина); КонецЦикла; КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; ЭлементНастройки.Использование = Истина; Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда ЭлементНастройки.ПравоеЗначение = ВыбранныеЗначения; Иначе ЭлементНастройки.Значение = ВыбранныеЗначения; КонецЕсли; ОформитьСписок(Элементы[ПутьКСписку], ЭлементНастройки); КонецПроцедуры &НаКлиенте Процедура ВставитьИзБуфераЗавершение(НайденныеОбъекты, ПутьКСписку) Экспорт Если НайденныеОбъекты = Неопределено Тогда Возврат; КонецЕсли; Список = ЭтотОбъект[ПутьКСписку]; КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Индекс = ПутьКДаннымЭлементов.ПоИмени[ПутьКСписку]; ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; Если ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда Если ЭлементНастройки.ПравоеЗначение = Неопределено Тогда ЭлементНастройки.ПравоеЗначение = Новый СписокЗначений; КонецЕсли; Отмеченные = ЭлементНастройки.ПравоеЗначение; Иначе Если ЭлементНастройки.Значение = Неопределено Тогда ЭлементНастройки.Значение = Новый СписокЗначений; КонецЕсли; Отмеченные = ЭлементНастройки.Значение; КонецЕсли; Для Каждого Значение Из НайденныеОбъекты Цикл ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Список, Значение, Неопределено, Истина); ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок(Отмеченные, Значение, Неопределено, Истина); КонецЦикла; ЭлементНастройки.Использование = Истина; ОформитьСписок(Элементы[ПутьКСписку], ЭлементНастройки); КонецПроцедуры #КонецОбласти &НаКлиентеНаСервереБезКонтекста Функция СвойствоЭлементаСтруктурыНастроек(КомпоновщикНастроек, Ключ, ИдентификаторЭлемента = Неопределено, Режим = Неопределено) Настройки = КомпоновщикНастроек.Настройки; Если Ключ = "Структура" Тогда Возврат Настройки; КонецЕсли; ЭлементСтруктуры = ЭлементСтруктурыНастроек(Настройки, ИдентификаторЭлемента); ТипЭлементаСтруктуры = ТипЗнч(ЭлементСтруктуры); Если ЭлементСтруктуры = Неопределено Или (ТипЭлементаСтруктуры = Тип("ТаблицаКомпоновкиДанных") И Ключ <> "Выбор" И Ключ <> "УсловноеОформление") Или (ТипЭлементаСтруктуры = Тип("ДиаграммаКомпоновкиДанных") И Ключ <> "Выбор" И Ключ <> "УсловноеОформление") Или (ТипЭлементаСтруктуры = Тип("НастройкиКомпоновкиДанных") И Ключ = "ПоляГруппировки") Или (ТипЭлементаСтруктуры = Тип("ГруппировкаКомпоновкиДанных") И Ключ = "ПараметрыДанных") Или (ТипЭлементаСтруктуры = Тип("ГруппировкаТаблицыКомпоновкиДанных") И Ключ = "ПараметрыДанных") Или (ТипЭлементаСтруктуры = Тип("ГруппировкаДиаграммыКомпоновкиДанных") И Ключ = "ПараметрыДанных") Тогда Возврат Неопределено; КонецЕсли; СвойствоЭлементаСтруктуры = ЭлементСтруктуры[Ключ]; Если Режим = 0 И (ТипЗнч(СвойствоЭлементаСтруктуры) = Тип("ВыбранныеПоляКомпоновкиДанных") Или ТипЗнч(СвойствоЭлементаСтруктуры) = Тип("ПорядокКомпоновкиДанных")) И ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Тогда СвойствоЭлементаСтруктуры = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти( СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки); КонецЕсли; Возврат СвойствоЭлементаСтруктуры; КонецФункции &НаКлиентеНаСервереБезКонтекста Функция ЭлементСтруктурыНастроек(Настройки, ИдентификаторЭлемента) Если ТипЗнч(ИдентификаторЭлемента) = Тип("ИдентификаторКомпоновкиДанных") Тогда ЭлементСтруктуры = Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлемента); Иначе ЭлементСтруктуры = Настройки; КонецЕсли; Возврат ЭлементСтруктуры; КонецФункции &НаКлиентеНаСервереБезКонтекста Функция КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка) Ключ = Неопределено; Если ИмяКоллекции = "СоставГруппировки" Тогда Ключ = "ПоляГруппировки"; ИначеЕсли ИмяКоллекции = "Параметры" Или ИмяКоллекции = "Отборы" Тогда Ключ = ?(Строка.ЭтоПараметр, "ПараметрыДанных", "Отбор"); ИначеЕсли ИмяКоллекции = "ВыбранныеПоля" Тогда Ключ = "Выбор"; ИначеЕсли ИмяКоллекции = "Сортировка" Тогда Ключ = "Порядок"; ИначеЕсли ИмяКоллекции = "Оформление" Тогда Ключ = ?(Строка.ЭтоПараметрВывода, "ПараметрыВывода", "УсловноеОформление"); ИначеЕсли ИмяКоллекции = "СтруктураВарианта" Тогда Ключ = "Структура"; КонецЕсли; Возврат Ключ; КонецФункции &НаКлиенте Процедура УдалитьСтроки(Элемент, Отказ) Отказ = Истина; ИдентификаторыСтрок = Элемент.ВыделенныеСтроки; Индекс = ИдентификаторыСтрок.ВГраница(); Пока Индекс >= 0 Цикл Строка = ЭтотОбъект[Элемент.Имя].НайтиПоИдентификатору(ИдентификаторыСтрок[Индекс]); Индекс = Индекс - 1; Если ТипЗнч(Строка.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Или (Элемент.Имя = "Отборы" И (Строка.ЭтоРаздел Или Строка.ЭтоПараметр)) Или (Элемент.Имя = "Оформление" И Строка.ЭтоПараметрВывода) Тогда Продолжить; КонецЕсли; Строки = ПолучитьРодителя(Элемент.Имя, Строка).ПолучитьЭлементы(); Если Строки.Индекс(Строка) < 0 Тогда Продолжить; КонецЕсли; КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(Элемент.Имя, Строка); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если ТипЗнч(ЭлементНастройки) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Или ТипЗнч(ЭлементНастройки) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда Продолжить; КонецЕсли; РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки); ИмяКоллекции = ИмяКоллекцииНастроекПоИдентификатору(Строка.Идентификатор); ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки, ИмяКоллекции); Строка.Использование = Ложь; ИзменитьИспользованиеСвязанныхЭлементовНастроек(Элемент.Имя, Строка, ЭлементНастройки); ЭлементыНастроек.Удалить(ЭлементНастройки); Строки.Удалить(Строка); КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура СкопироватьНастройки(Элемент) СтрокаКопирования = Элемент.ТекущиеДанные; Если ТипЗнч(СтрокаКопирования.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Или (СтрокаКопирования.Свойство("ЭтоРаздел") И СтрокаКопирования.ЭтоРаздел) Или (СтрокаКопирования.Свойство("ЭтоПараметр") И СтрокаКопирования.ЭтоПараметр) Или (СтрокаКопирования.Свойство("ЭтоПараметрВывода") И СтрокаКопирования.ЭтоПараметрВывода) Тогда Возврат; КонецЕсли; Родитель = СтрокаКопирования.ПолучитьРодителя(); КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(Элемент.Имя, СтрокаКопирования); УзелКД = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); КудаВставить = ПолучитьЭлементы(ЭтотОбъект[Элемент.Имя], Родитель); ЭлементКД = ЭлементНастройки(УзелКД, СтрокаКопирования); РодительКД = ЭлементНастройки(УзелКД, Родитель); КудаВставитьКД = ЭлементыНастроек(УзелКД, РодительКД); Индекс = КудаВставить.Количество(); ИндексЭлементаНастройки = КудаВставитьКД.Количество(); ПоискЭлементовКД = Новый Соответствие; ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексЭлементаНастройки, ПоискЭлементовКД); ПоискСтрокТаблицы = Новый Соответствие; ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, СтрокаКопирования, КудаВставить, Индекс, ПоискСтрокТаблицы); Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл СтараяСтрока = КлючИЗначение.Ключ; НоваяСтрока = КлючИЗначение.Значение; НоваяСтрока.Идентификатор = ПоискЭлементовКД.Получить(СтараяСтрока.Идентификатор); КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьИспользование(ИмяКоллекции, Использование = Истина, ЭлементыКоллекции = Неопределено) Если ЭлементыКоллекции = Неопределено Тогда КорневаяСтрока = КорневаяСтрокаПоУмолчанию(ИмяКоллекции); Если КорневаяСтрока = Неопределено Тогда Возврат; КонецЕсли; ЭлементыКоллекции = КорневаяСтрока.ПолучитьЭлементы(); КонецЕсли; Для Каждого Элемент Из ЭлементыКоллекции Цикл Элемент.Использование = Использование; КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Элемент); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Элемент); Если ТипЗнч(ЭлементНастройки) <> Тип("НастройкиКомпоновкиДанных") И ТипЗнч(ЭлементНастройки) <> Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") И ТипЗнч(ЭлементНастройки) <> Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда ЭлементНастройки.Использование = Использование; КонецЕсли; ИзменитьИспользование(ИмяКоллекции, Использование, Элемент.ПолучитьЭлементы()); КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьИспользованиеЭлементаНастройки(ИмяКоллекции) Строка = Элементы[ИмяКоллекции].ТекущиеДанные; КомпоновщикНастроек = Отчет.КомпоновщикНастроек; КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, Строка); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки); Если ТипЗнч(РодительЭлементаНастройки) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда ЭлементНастройки = РодительЭлементаНастройки; КонецЕсли; ЭлементНастройки.Использование = Строка.Использование; Если ИмяКоллекции = "Оформление" И Строка.ЭтоПараметрВывода И Строка(Строка.Идентификатор) = "DATAPARAMETERSOUTPUT" Тогда ЭлементНастройки.Использование = Истина; ЭлементНастройки.Значение = ?(Строка.Использование, ТипВыводаТекстаКомпоновкиДанных.Авто, ТипВыводаТекстаКомпоновкиДанных.НеВыводить); КонецЕсли; Если РасширенныйРежим = 0 И ИмяКоллекции = "СтруктураВарианта" Тогда ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти( ЭлементНастройки.ИдентификаторПользовательскойНастройки); Если ЭлементПользовательскойНастройки <> Неопределено Тогда ЭлементПользовательскойНастройки.Использование = ЭлементНастройки.Использование; КонецЕсли; КонецЕсли; ИзменитьИспользованиеСвязанныхЭлементовНастроек(ИмяКоллекции, Строка, ЭлементНастройки); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ИзменитьИспользованиеСвязанныхЭлементовНастроек(ИмяКоллекции, Строка, ЭлементНастройки) Если ИмяКоллекции = "Оформление" Тогда Если Строка.ЭтоПараметрВывода Тогда СинхронизироватьПредопределенныеПараметрыВывода(Строка.Использование, ЭлементНастройки); КонецЕсли; Возврат; КонецЕсли; СвязанныеКоллекции = Новый Массив; Если ИмяКоллекции = "СоставГруппировки" Тогда СвязанныеКоллекции = СтрРазделить("ВыбранныеПоля,Сортировка", ","); ИначеЕсли ИмяКоллекции = "ВыбранныеПоля" Тогда СвязанныеКоллекции = СтрРазделить("СоставГруппировки,Сортировка", ","); КонецЕсли; Для Каждого СвязаннаяКоллекция Из СвязанныеКоллекции Цикл ИзменитьИспользованиеПоля(СвязаннаяКоллекция, Строка.Поле, Строка.Использование); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ИзменитьИспользованиеПоля(ИмяКоллекции, Поле, Использование) Если Не ЗначениеЗаполнено(Поле) Тогда Возврат; КонецЕсли; Условие = Новый Структура("Поле", Поле); СтрокиТаблицы = ОтчетыКлиентСервер.НайтиСтрокиТаблицы(ЭтотОбъект[ИмяКоллекции], Условие); СвойствоЭлементаСтруктуры = Неопределено; Для Каждого СтрокаТаблицы Из СтрокиТаблицы Цикл Если СтрокаТаблицы.Использование = Использование Тогда Продолжить; КонецЕсли; Если СвойствоЭлементаСтруктуры = Неопределено Тогда КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(ИмяКоллекции, СтрокаТаблицы); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); КонецЕсли; ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, СтрокаТаблицы); Если ЭлементНастройки <> Неопределено Тогда СтрокаТаблицы.Использование = Использование; ЭлементНастройки.Использование = Использование; КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервере Процедура УстановитьПометкуУдаления(ИмяКоллекции, Строка) Строка.ПометкаУдаления = Истина; Если ИмяКоллекции = "Оформление" Тогда Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Ошибка"); Иначе Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент", "ПометкаУдаления"); КонецЕсли; КонецПроцедуры #Область Клиент &НаКлиенте Процедура ЗаписатьИЗакрыть(Переформировать) ОповеститьОВыборе(РезультатВыбора(Переформировать)); КонецПроцедуры &НаКлиенте Функция РезультатВыбора(Переформировать) РезультатВыбораСформирован = Истина; Если РежимИзмененияЭлементаСтруктурыНастроек И Не Переформировать Тогда Возврат Неопределено; КонецЕсли; РезультатВыбора = ОтчетыКлиентСервер.ПараметрыОбновленияФормыОтчета(ВариантыОтчетовСлужебныйКлиентСервер.ИмяСобытияФормыНастроек()); РезультатВыбора.Переформировать = Переформировать; РезультатВыбора.СброситьПользовательскиеНастройки = (РасширенныйРежим = 1); РезультатВыбора.ФормаНастроекРасширенныйРежим = РасширенныйРежим; РезультатВыбора.ФормаНастроекИмяСтраницы = Элементы.СтраницыНастроек.ТекущаяСтраница.Имя; РезультатВыбора.КомпоновщикНастроекКД = Отчет.КомпоновщикНастроек; РезультатВыбора.ВариантМодифицирован = ВариантИзменен; РезультатВыбора.ПользовательскиеНастройкиМодифицированы = ВариантИзменен Или ПользовательскиеНастройкиМодифицированы; Возврат РезультатВыбора; КонецФункции // Параметры: // Настройки - НастройкиКомпоновкиДанных // // Возвращаемое значение: // Структура: // * TITLE - Структура: // ** Объект - ЗначениеПараметраКомпоновкиДанных // ** Идентификатор - ИдентификаторКомпоновкиДанных // * TITLEOUTPUT - Структура: // ** Объект - ЗначениеПараметраКомпоновкиДанных // ** Идентификатор - ИдентификаторКомпоновкиДанных // * DATAPARAMETERSOUTPUT - Структура: // ** Объект - ЗначениеПараметраКомпоновкиДанных // ** Идентификатор - ИдентификаторКомпоновкиДанных // * FILTEROUTPUT - Структура: // ** Объект - ЗначениеПараметраКомпоновкиДанных // ** Идентификатор - ИдентификаторКомпоновкиДанных // &НаКлиентеНаСервереБезКонтекста Функция ПредопределенныеПараметрыВывода(Настройки) ПредопределенныеПараметры = Новый Структура("TITLE, TITLEOUTPUT, DATAPARAMETERSOUTPUT, FILTEROUTPUT"); ПараметрыВывода = Настройки.ПараметрыВывода; Для Каждого Параметр Из ПредопределенныеПараметры Цикл СвойстваПараметра = Новый Структура("Объект, Идентификатор"); СвойстваПараметра.Объект = ПараметрыВывода.Элементы.Найти(Параметр.Ключ); СвойстваПараметра.Идентификатор = ПараметрыВывода.ПолучитьИдентификаторПоОбъекту(СвойстваПараметра.Объект); ПредопределенныеПараметры[Параметр.Ключ] = СвойстваПараметра; КонецЦикла; Возврат ПредопределенныеПараметры; КонецФункции &НаКлиенте Процедура УстановитьПараметрВывода(ЭлементСтруктуры, ИмяПараметра, Значение = Неопределено, Использование = Истина) ЗначениеПараметра = ЭлементСтруктуры.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); Если ЗначениеПараметра = Неопределено Тогда Возврат; КонецЕсли; Если Значение <> Неопределено Тогда ЗначениеПараметра.Значение = Значение; КонецЕсли; Если Использование <> Неопределено Тогда ЗначениеПараметра.Использование = Использование; КонецЕсли; КонецПроцедуры // Параметры: // ТаблицаИмя - Строка // Действие - Строка // // Возвращаемое значение: // Структура: // * Действие - Строка // * ТаблицаИмя - Строка // * ПричинаОтказа - Строка // * СтрокиДерева - Массив из ДанныеФормыЭлементДерева // * ТекущаяСтрока - см. ЭлементКоллекцииФормыНастроек // * ТекущийРодитель - см. ЭлементКоллекцииФормыНастроек // &НаКлиенте Функция НовыйКонтекст(Знач ТаблицаИмя, Знач Действие) Результат = Новый Структура; Результат.Вставить("ПричинаОтказа", ""); Результат.Вставить("ТаблицаИмя", ТаблицаИмя); Результат.Вставить("Действие", Действие); Возврат Результат; КонецФункции &НаКлиенте Процедура ОпределитьВыделенныеСтроки(Контекст) Контекст.Вставить("СтрокиДерева", Новый Массив); // Выделенные строки (не идентификаторы). Контекст.Вставить("ТекущаяСтрока", Неопределено); // Активная строка (не идентификатор). ТаблицаЭлемент = Элементы[Контекст.ТаблицаИмя]; ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя]; ТекущаяСтрокаИдентификатор = ТаблицаЭлемент.ТекущаяСтрока; Особенности = Новый Структура("МогутБытьРазделы, МогутБытьПараметры, |МогутБытьПараметрыВывода, МогутБытьГруппы, ТребоватьОдногоРодителя"); Особенности.МогутБытьРазделы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля" Или Контекст.ТаблицаИмя = "Сортировка" Или Контекст.ТаблицаИмя = "Оформление"); Особенности.МогутБытьПараметры = (Контекст.ТаблицаИмя = "Отборы"); Особенности.МогутБытьПараметрыВывода = (Контекст.ТаблицаИмя = "Оформление"); Особенности.ТребоватьОдногоРодителя = (Контекст.Действие = "Переместить" Или Контекст.Действие = "ПереместитьВИерархии" Или Контекст.Действие = "Сгруппировать"); Особенности.МогутБытьГруппы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля"); Если Особенности.ТребоватьОдногоРодителя Тогда Контекст.Вставить("ТекущийРодитель", -1); КонецЕсли; Если Особенности.МогутБытьГруппы Тогда БылиГруппы = Ложь; КонецЕсли; ВыделенныеСтроки = МассивСортировать(ТаблицаЭлемент.ВыделенныеСтроки, НаправлениеСортировки.Возр); Для Каждого СтрокаИдентификатор Из ВыделенныеСтроки Цикл СтрокаДерева = ТаблицаРеквизит.НайтиПоИдентификатору(СтрокаИдентификатор); Если Не СтрокаДобавлена(Контекст, СтрокаДерева, Особенности) Тогда Возврат; КонецЕсли; Если Особенности.МогутБытьГруппы И СтрокаДерева.ЭтоГруппа Тогда БылиГруппы = Истина; КонецЕсли; Если СтрокаИдентификатор = ТекущаяСтрокаИдентификатор Тогда Контекст.ТекущаяСтрока = СтрокаДерева; КонецЕсли; КонецЦикла; Если Контекст.СтрокиДерева.Количество() = 0 Тогда Контекст.ПричинаОтказа = НСтр("ru = 'Выберите элементы.'"); Возврат; КонецЕсли; Если Контекст.ТекущаяСтрока = Неопределено Тогда Если Контекст.Действие = "ИзменитьГруппу" Тогда Контекст.ПричинаОтказа = НСтр("ru = 'Выберите группу.'"); Возврат; КонецЕсли; КонецЕсли; // Исключение из списка удаляемых строк всех подчиненных строк, для которых включены родители. Если Контекст.Действие = "Удалить" И Особенности.МогутБытьГруппы И БылиГруппы Тогда Количество = Контекст.СтрокиДерева.Количество(); Для Номер = 1 По Количество Цикл ОбратныйИндекс = Количество - Номер; Родитель = Контекст.СтрокиДерева[ОбратныйИндекс]; Пока Родитель <> Неопределено Цикл Родитель = Родитель.ПолучитьРодителя(); Если Контекст.СтрокиДерева.Найти(Родитель) <> Неопределено Тогда Контекст.СтрокиДерева.Удалить(ОбратныйИндекс); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецПроцедуры &НаКлиенте Функция СтрокаДобавлена(Строки, СтрокаДерева, Особенности) Если Строки.СтрокиДерева.Найти(СтрокаДерева) <> Неопределено Тогда Возврат Истина; // Пропустить строку. КонецЕсли; Если Особенности.МогутБытьРазделы И СтрокаДерева.ЭтоРаздел Тогда Возврат Истина; // Пропустить строку. КонецЕсли; Если (Особенности.МогутБытьПараметры И СтрокаДерева.ЭтоПараметр) Или (Особенности.МогутБытьПараметрыВывода И СтрокаДерева.ЭтоПараметрВывода) Тогда Если Строки.Действие = "Переместить" Тогда Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть перемещены.'"); ИначеЕсли Строки.Действие = "Сгруппировать" Тогда Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть участниками групп.'"); ИначеЕсли Строки.Действие = "Удалить" Тогда Строки.ПричинаОтказа = НСтр("ru = 'Параметры не могут быть удалены.'"); КонецЕсли; Возврат Ложь; КонецЕсли; Если Особенности.ТребоватьОдногоРодителя Тогда Родитель = СтрокаДерева.ПолучитьРодителя(); Если Строки.ТекущийРодитель = -1 Тогда Строки.ТекущийРодитель = Родитель; ИначеЕсли Строки.ТекущийРодитель <> Родитель Тогда Если Строки.Действие = "Переместить" Тогда Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть перемещены, поскольку они принадлежат разным родителям.'"); ИначеЕсли Строки.Действие = "Сгруппировать" Тогда Строки.ПричинаОтказа = НСтр("ru = 'Выбранные элементы не могут быть сгруппированы, поскольку они принадлежат разным родителям.'"); КонецЕсли; Возврат Ложь; КонецЕсли; КонецЕсли; Строки.СтрокиДерева.Добавить(СтрокаДерева); Возврат Истина; // Следующая строка. КонецФункции &НаКлиенте Процедура СдвинутьСтроки(Контекст) ТекущийРодитель = Контекст.ТекущийРодитель; // см. ЭлементКоллекцииФормыНастроек УзелКД = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); Если Контекст.ТекущийРодитель = Неопределено Тогда ТаблицаРеквизит = ЭтотОбъект[Контекст.ТаблицаИмя]; Если Контекст.ТаблицаИмя = "Отборы" И Не РежимИзмененияЭлементаСтруктурыНастроек Тогда ТекущийРодитель = ТаблицаРеквизит.ПолучитьЭлементы()[1]; Иначе ТекущийРодитель = ТаблицаРеквизит; КонецЕсли; ТекущийРодительКД = УзелКД; ИначеЕсли ТипЗнч(ТекущийРодитель.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") Тогда ТекущийРодительКД = УзелКД; Иначе ТекущийРодительКД = УзелКД.ПолучитьОбъектПоИдентификатору(ТекущийРодитель.Идентификатор); КонецЕсли; СтрокиРодителя = ТекущийРодитель.ПолучитьЭлементы(); СтрокиРодителяКД = ЭлементыНастроек(УзелКД, ТекущийРодительКД); ВерхняяГраницаСтрок = СтрокиРодителя.Количество() - 1; ВыделеноСтрок = Контекст.СтрокиДерева.Количество(); // Массив выделенных строк на встречу движению: // Если двигаем строки в "+", то обходим "от большего к меньшему"; // Если в "-", то обходим "от меньшего к большему". ДвигаемсяПоВозрастанию = (Контекст.Направление < 0); Для Номер = 1 По ВыделеноСтрок Цикл Если ДвигаемсяПоВозрастанию Тогда ИндексВМассиве = Номер - 1; Иначе ИндексВМассиве = ВыделеноСтрок - Номер; КонецЕсли; СтрокаДерева = Контекст.СтрокиДерева[ИндексВМассиве]; // см. ЭлементКоллекцииФормыНастроек ЭлементКД = УзелКД.ПолучитьОбъектПоИдентификатору(СтрокаДерева.Идентификатор); ИндексВДереве = СтрокиРодителя.Индекс(СтрокаДерева); ГдеОкажетсяСтрока = ИндексВДереве + Контекст.Направление; Если ГдеОкажетсяСтрока < 0 Тогда // Перемещаем "в конец". СтрокиРодителя.Сдвинуть(ИндексВДереве, ВерхняяГраницаСтрок - ИндексВДереве); СтрокиРодителяКД.Сдвинуть(ЭлементКД, ВерхняяГраницаСтрок - ИндексВДереве); ИначеЕсли ГдеОкажетсяСтрока > ВерхняяГраницаСтрок Тогда // Перемещаем "в начало". СтрокиРодителя.Сдвинуть(ИндексВДереве, -ИндексВДереве); СтрокиРодителяКД.Сдвинуть(ЭлементКД, -ИндексВДереве); Иначе СтрокиРодителя.Сдвинуть(ИндексВДереве, Контекст.Направление); СтрокиРодителяКД.Сдвинуть(ЭлементКД, Контекст.Направление); КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры // Параметры: // Контекст - см. НовыйКонтекст // &НаКлиенте Процедура ПереместитьВИерархии(Контекст) Если Контекст.ТекущийРодитель = Неопределено Тогда Возврат; КонецЕсли; Если Контекст.Направление > 0 Тогда Строки = Контекст.ТекущийРодитель.ПолучитьЭлементы(); Индекс = Строки.Индекс(Контекст.ТекущаяСтрока) - 1; НовыйРодитель = ?(Индекс < 0, Неопределено, Строки.Получить(Индекс)); Иначе НовыйРодитель = ПолучитьРодителя(Контекст.ТаблицаИмя, Контекст.ТекущийРодитель); КонецЕсли; Если НовыйРодитель = Неопределено Или НовыйРодитель.Тип = "ТаблицаКомпоновкиДанных" Или НовыйРодитель.Тип = "ДиаграммаКомпоновкиДанных" Тогда Возврат; КонецЕсли; Если Контекст.Направление > 0 Тогда Индекс = НовыйРодитель.ПолучитьЭлементы().Количество(); Иначе Индекс = НовыйРодитель.ПолучитьЭлементы().Индекс(Контекст.ТекущийРодитель) + 1; КонецЕсли; Если Индекс < 0 Тогда Индекс = 0; КонецЕсли; ДополнительныеПараметры = ДополнительныеПараметрыПеремещенияЭлементовСтруктурыВарианта(); ДополнительныеПараметры.Индекс = Индекс; ДополнительныеПараметры.ИндексЭлементаНастройки = Индекс; Результат = ПереместитьЭлементыСтруктурыВарианта(Контекст.ТекущаяСтрока, НовыйРодитель, ДополнительныеПараметры); Элементы.СтруктураВарианта.Развернуть(НовыйРодитель.ПолучитьИдентификатор(), Истина); Элементы.СтруктураВарианта.ТекущаяСтрока = Результат.Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Функция ЭтоПодчиненныеЭлементы(РодительскийЭлементДерева, ЭлементДерева) РодительскийЭлемент = ЭлементДерева; Пока РодительскийЭлемент <> Неопределено Цикл Если РодительскийЭлементДерева = РодительскийЭлемент Тогда Возврат Истина; КонецЕсли; РодительскийЭлемент = РодительскийЭлемент.ПолучитьРодителя(); КонецЦикла; Возврат Ложь; КонецФункции #КонецОбласти #Область КлиентТаблицыПолейУниверсальныеТочкиВхода &НаКлиенте Процедура ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, ИмяКоллекции, ПоказыватьРежимыФлажков = Ложь, ТекущийРежимОтображения = Неопределено) ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков); РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения); Если РежимОтображения = Неопределено Тогда Возврат; КонецЕсли; ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения(); КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение]; Для Каждого СвойстваЭлементаНастроек Из СвойстваЭлементовНастроек Цикл Строка = ЭтотОбъект[ИмяКоллекции].НайтиПоИдентификатору(СвойстваЭлементаНастроек.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек ЭлементНастроек = СвойстваЭлементаНастроек.ЭлементНастроек; Если Строка <> Неопределено И ЭлементНастроек <> Неопределено Тогда УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастроек, КартинкаРежимаОтображения); КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Процедура ВыбратьРежимОтображенияДляСтроки(ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков, ТекущийРежимОтображения = Неопределено) Контекст = Новый Структура("ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки", ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки); Обработчик = Новый ОписаниеОповещения("ПослеВыбораРежимаОтображенияСтроки", ЭтотОбъект, Контекст); ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков); Если ТекущийРежимОтображения = Неопределено Тогда ПоказатьВыборИзМеню(Обработчик, ДоступныеРежимыОтображения); Иначе РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения); ВыполнитьОбработкуОповещения(Обработчик, РежимОтображения); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПослеВыбораРежимаОтображенияСтроки(РежимОтображения, Контекст) Экспорт Если РежимОтображения = Неопределено Тогда Возврат; КонецЕсли; Строка = ЭтотОбъект[Контекст.ИмяКоллекции].НайтиПоИдентификатору(Контекст.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек Если Строка = Неопределено Тогда Возврат; КонецЕсли; ЭлементНастройки = Контекст.ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); Если ЭлементНастройки = Неопределено Тогда Возврат; КонецЕсли; ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения(); КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение]; УстановитьРежимОтображения(Контекст.ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения); УстановитьМодифицированность(); КонецПроцедуры &НаКлиенте Функция ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков) ДоступныеРежимыОтображения = Новый СписокЗначений; ДоступныеРежимыОтображения.Добавить("ПоказыватьВШапкеОтчета", НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ); Если ПоказыватьРежимыФлажков Тогда ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВШапкеОтчета", НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком); КонецЕсли; ДоступныеРежимыОтображения.Добавить("ПоказыватьВНастройкахОтчета", НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит); Если ПоказыватьРежимыФлажков Тогда ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВНастройкахОтчета", НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком); КонецЕсли; ДоступныеРежимыОтображения.Добавить("НеПоказывать", НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СерыйКрест); Возврат ДоступныеРежимыОтображения; КонецФункции &НаКлиенте Функция ДоступныеКартинкиРежимовОтображения() ДоступныеКартинки = Новый Соответствие; ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВШапкеОтчета", 1); ДоступныеКартинки.Вставить("ПоказыватьВШапкеОтчета", 2); ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВНастройкахОтчета", 3); ДоступныеКартинки.Вставить("ПоказыватьВНастройкахОтчета", 4); ДоступныеКартинки.Вставить("НеПоказывать", 5); Возврат ДоступныеКартинки; КонецФункции // Параметры: // ИмяКоллекции - Строка // Строка - см. ЭлементКоллекцииФормыНастроек // ЭлементНастройки - см. ЭлементНастройки // КартинкаРежимаОтображения - Неопределено // - Число // &НаКлиенте Процедура УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения = Неопределено) Если КартинкаРежимаОтображения = Неопределено Тогда КартинкаРежимаОтображения = Строка.КартинкаРежимаОтображения; Иначе Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображения; КонецЕсли; Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 2 Тогда ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; ИначеЕсли КартинкаРежимаОтображения = 3 Или КартинкаРежимаОтображения = 4 Тогда ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный; Иначе ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецЕсли; Если ИмяКоллекции = "Отборы" И Не Строка.ЭтоПараметр Тогда Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда // Когда ПредставлениеПользовательскойНастройки заполнено, // то Представление работает как переключатель, // но также может использоваться для вывода в табличный документ. ЭлементНастройки.Представление = Строка.Заголовок; Иначе ЭлементНастройки.Представление = ""; КонецЕсли; Если Не Строка.ЭтоПредопределенныйЗаголовок Тогда ЭлементНастройки.ПредставлениеПользовательскойНастройки = Строка.Заголовок; КонецЕсли; ИначеЕсли ИмяКоллекции = "Оформление" Тогда // Особенность УО - ПредставлениеПользовательскойНастройки может очищаться после ПолучитьНастройки(). Если Строка.ЭтоПредопределенныйЗаголовок Тогда Если КартинкаРежимаОтображения = 1 Или КартинкаРежимаОтображения = 3 Тогда // Когда ПредставлениеПользовательскойНастройки заполнено, // то Представление работает как переключатель, // но также может использоваться для вывода в табличный документ. ЭлементНастройки.Представление = Строка.Заголовок; Иначе ЭлементНастройки.Представление = ""; КонецЕсли; Иначе // Когда ПредставлениеПользовательскойНастройки заполнено, // то Представление работает как переключатель, // но также может использоваться для вывода в табличный документ. ЭлементНастройки.Представление = Строка.Заголовок; КонецЕсли; КонецЕсли; Если ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда ЭлементНастройки.ИдентификаторПользовательскойНастройки = ""; ИначеЕсли Не ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда ЭлементНастройки.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор; КонецЕсли; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Функция КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки) КартинкаРежимаОтображения = 5; Если ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда Если ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда КартинкаРежимаОтображения = 2; Иначе КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 1, 2); КонецЕсли; ИначеЕсли ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Или ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда КартинкаРежимаОтображения = 4; Иначе КартинкаРежимаОтображения = ?(ЗначениеЗаполнено(ЭлементНастройки.Представление), 3, 4); КонецЕсли; КонецЕсли; КонецЕсли; Возврат КартинкаРежимаОтображения; КонецФункции #КонецОбласти #Область КлиентТаблицыПолейФункциональнаяЧасть // Параметры: // УзелНастроек - НастройкиКомпоновкиДанных // - НастройкиВложенногоОбъектаКомпоновкиДанных // - СтруктураНастроекКомпоновкиДанных // - ДиаграммаКомпоновкиДанных // - ПорядокКомпоновкиДанных // - ГруппировкаКомпоновкиДанных // - ГруппировкаТаблицыКомпоновкиДанных // - ГруппировкаДиаграммыКомпоновкиДанных // - УсловноеОформлениеКомпоновкиДанных // - ГруппаВыбранныхПолейКомпоновкиДанных // - ГруппаЭлементовОтбораКомпоновкиДанных // - ЭлементОтбораКомпоновкиДанных // - ЭлементУсловногоОформленияКомпоновкиДанных // - ЗначенияПараметровВыводаКомпоновкиДанных // - ЗначениеПараметраНастроекКомпоновкиДанных // - ОтборКомпоновкиДанных // - ВыбранныеПоляКомпоновкиДанных // - ТаблицаКомпоновкиДанных // - Неопределено // ЭлементНастройки - см. ЭлементКоллекцииФормыНастроек // // Возвращаемое значение: // - НастройкиКомпоновкиДанных // - НастройкиВложенногоОбъектаКомпоновкиДанных // - СтруктураНастроекКомпоновкиДанных // - ГруппировкаКомпоновкиДанных // - ТаблицаКомпоновкиДанных // - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных // - ГруппировкаТаблицыКомпоновкиДанных // - ДиаграммаКомпоновкиДанных // - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных // - ГруппировкаДиаграммыКомпоновкиДанных // - ОтборКомпоновкиДанных // - ЭлементОтбораКомпоновкиДанных // - ГруппаЭлементовОтбораКомпоновкиДанных // - ЭлементУсловногоОформленияКомпоновкиДанных // - ЗначенияПараметровВыводаКомпоновкиДанных // - ЗначениеПараметраНастроекКомпоновкиДанных // - ВыбранныеПоляКомпоновкиДанных // - ГруппаВыбранныхПолейКомпоновкиДанных // - ПорядокКомпоновкиДанных // - УсловноеОформлениеКомпоновкиДанных // - КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных // - Неопределено // &НаКлиентеНаСервереБезКонтекста Функция ЭлементНастройки(Знач УзелНастроек, Знач ЭлементНастройки) Результат = Неопределено; Если ЭлементНастройки <> Неопределено И ТипЗнч(ЭлементНастройки.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда Результат = УзелНастроек.ПолучитьОбъектПоИдентификатору(ЭлементНастройки.Идентификатор); КонецЕсли; Если ТипЗнч(Результат) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Результат = ЭлементНастройки.Настройки; КонецЕсли; Возврат Результат; КонецФункции &НаКлиентеНаСервереБезКонтекста Функция ЭлементыНастроек(Знач СвойствоЭлементаСтруктуры, Знач ЭлементНастройки = Неопределено, Знач ИмяКоллекции = Неопределено) Если ЭлементНастройки = Неопределено Тогда ЭлементНастройки = СвойствоЭлементаСтруктуры; КонецЕсли; ТипОбъекта = ТипЗнч(ЭлементНастройки); Если ИмяКоллекции <> Неопределено Тогда ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Таблица", ""); ИмяКоллекции = СтрЗаменить(ИмяКоллекции, "Диаграмма", ""); Если ТипОбъекта = Тип("ТаблицаКомпоновкиДанных") И (ИмяКоллекции = "Строки" Или ИмяКоллекции = "Колонки") Или ТипОбъекта = Тип("ДиаграммаКомпоновкиДанных") И (ИмяКоллекции = "Серии" Или ИмяКоллекции = "Точки") Тогда Возврат ЭлементНастройки[ИмяКоллекции]; КонецЕсли; КонецЕсли; Если ТипОбъекта = Тип("НастройкиКомпоновкиДанных") Или ТипОбъекта = Тип("ГруппировкаКомпоновкиДанных") Или ТипОбъекта = Тип("ГруппировкаТаблицыКомпоновкиДанных") Или ТипОбъекта = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда Возврат ЭлементНастройки.Структура; ИначеЕсли ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Или ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Или ТипОбъекта = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда Возврат ЭлементНастройки; ИначеЕсли ТипОбъекта = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Возврат ЭлементНастройки.Настройки.Структура; КонецЕсли; Возврат ЭлементНастройки.Элементы; КонецФункции &НаКлиенте Функция ИмяКоллекцииНастроекПоИдентификатору(Идентификатор) ИмяКоллекции = Неопределено; Путь = ВРег(Идентификатор); Если СтрНайти(Путь, "SERIES") > 0 Тогда ИмяКоллекции = "Серии"; ИначеЕсли СтрНайти(Путь, "POINT") > 0 Тогда ИмяКоллекции = "Точки"; ИначеЕсли СтрНайти(Путь, "ROW") > 0 Тогда ИмяКоллекции = "Строки"; ИначеЕсли СтрНайти(Путь, "COLUMN") > 0 Тогда ИмяКоллекции = "Колонки"; КонецЕсли; Возврат ИмяКоллекции; КонецФункции &НаКлиенте Функция ПолучитьРодителяЭлементаНастройки(Знач СвойствоЭлементаСтруктуры, Знач ЭлементНастройки) Родитель = Неопределено; ТипЭлемента = ТипЗнч(ЭлементНастройки); Если ЭлементНастройки <> Неопределено И ТипЭлемента <> Тип("ПолеГруппировкиКомпоновкиДанных") И ТипЭлемента <> Тип("АвтоПолеГруппировкиКомпоновкиДанных") И ТипЭлемента <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") И ТипЭлемента <> Тип("ЭлементПорядкаКомпоновкиДанных") И ТипЭлемента <> Тип("ЭлементУсловногоОформленияКомпоновкиДанных") И ТипЭлемента <> Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда Родитель = ЭлементНастройки.Родитель; КонецЕсли; Если Родитель = Неопределено Тогда Родитель = СвойствоЭлементаСтруктуры; КонецЕсли; Возврат Родитель; КонецФункции &НаКлиентеНаСервереБезКонтекста Функция ПолучитьЭлементы(Знач Дерево, Знач Строка) Если Строка = Неопределено Тогда Строка = Дерево; КонецЕсли; Возврат Строка.ПолучитьЭлементы(); КонецФункции &НаКлиенте Функция ПолучитьРодителя(Знач ИмяКоллекции, Знач Строка = Неопределено) Родитель = Неопределено; Если Строка <> Неопределено Тогда Родитель = Строка.ПолучитьРодителя(); КонецЕсли; Если Родитель = Неопределено Тогда Родитель = КорневаяСтрокаПоУмолчанию(ИмяКоллекции); КонецЕсли; Если Родитель = Неопределено Тогда Родитель = ЭтотОбъект[ИмяКоллекции]; КонецЕсли; Возврат Родитель; КонецФункции &НаКлиенте Функция КорневаяСтрокаПоУмолчанию(Знач ИмяКоллекции) КорневаяСтрока = Неопределено; Если ИмяКоллекции = "ВыбранныеПоля" Тогда КорневаяСтрока = ВыбранныеПоля.ПолучитьЭлементы()[0]; ИначеЕсли ИмяКоллекции = "Сортировка" Тогда КорневаяСтрока = Сортировка.ПолучитьЭлементы()[0]; ИначеЕсли ИмяКоллекции = "СтруктураВарианта" Тогда КорневаяСтрока = СтруктураВарианта.ПолучитьЭлементы()[0]; ИначеЕсли ИмяКоллекции = "Параметры" Тогда Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда КорневаяСтрока = Отборы.ПолучитьЭлементы()[0]; КонецЕсли; ИначеЕсли ИмяКоллекции = "Отборы" Тогда Если РежимИзмененияЭлементаСтруктурыНастроек Тогда КорневаяСтрока = Отборы.ПолучитьЭлементы()[0]; Иначе КорневаяСтрока = Отборы.ПолучитьЭлементы()[1]; КонецЕсли; ИначеЕсли ИмяКоллекции = "Оформление" Тогда Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда КорневаяСтрока = Оформление; КонецЕсли; КонецЕсли; Возврат КорневаяСтрока; КонецФункции &НаКлиенте Процедура ВыбратьПоле(ИмяКоллекции, Обработчик, Поле = Неопределено, ИдентификаторУзлаНастроек = Неопределено) ПараметрыВыбора = Новый Структура; ПараметрыВыбора.Вставить("НастройкиОтчета", НастройкиОтчета); ПараметрыВыбора.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек); ПараметрыВыбора.Вставить("Режим", ИмяКоллекции); ПараметрыВыбора.Вставить("ПолеКД", Поле); ПараметрыВыбора.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ?(ИдентификаторУзлаНастроек = Неопределено, ИдентификаторЭлементаСтруктурыНастроек, ИдентификаторУзлаНастроек)); ОткрытьФорму( "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ВыборПоляОтчета", ПараметрыВыбора, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры &НаКлиенте Процедура ОбновитьЗаголовокЭлементаСтруктурыВарианта(Строка) СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Структура"); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); Если ЭлементНастройки = Неопределено Тогда Возврат; КонецЕсли; ЗначениеПараметра = ЭлементНастройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьЗаголовок")); Если ЗначениеПараметра <> Неопределено Тогда ЗначениеПараметра.Использование = Истина; Если ЗначениеЗаполнено(Строка.Заголовок) Тогда ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить; Иначе ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить; КонецЕсли; КонецЕсли; ЗначениеПараметра = ЭлементНастройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Заголовок")); Если ЗначениеПараметра <> Неопределено Тогда ЗначениеПараметра.Использование = Истина; ЗначениеПараметра.Значение = Строка.Заголовок; КонецЕсли; КонецПроцедуры #КонецОбласти #Область КлиентИлиСервер &НаКлиентеНаСервереБезКонтекста Функция МассивСортировать(ИсходныйМассив, Направление = Неопределено) Если Направление = Неопределено Тогда Направление = НаправлениеСортировки.Возр; КонецЕсли; Список = Новый СписокЗначений; Список.ЗагрузитьЗначения(ИсходныйМассив); Список.СортироватьПоЗначению(Направление); Возврат Список.ВыгрузитьЗначения(); КонецФункции #КонецОбласти #Область ВызовСервера &НаСервере Процедура ОбновитьФорму(ПараметрыОбновления) СодержитВложенныеОтчеты = Ложь; СодержитВложенныеОтборы = Ложь; СодержитВложенныеПоляИлиСортировки = Ложь; СодержитВложенноеУсловноеОформление = Ложь; СодержитПользовательскиеЭлементыСтруктуры = Ложь; ЗагрузитьНастройкиВКомпоновщик(ПараметрыОбновления); Если РасширенныйРежим = 0 Тогда ОтчетыСервер.ОбновитьЭлементыФормыНастроек(ЭтотОбъект, Элементы.Основное, ПараметрыОбновления); КонецЕсли; ОбновитьКоллекцииФормыНастроек(); УстановитьТипДиаграммы(); ОбновитьСвойстваЭлементовФормы(); КонецПроцедуры &НаСервере Процедура ОбновитьКоллекцииФормыНастроек() // Очистка настроек. СоставГруппировки.ПолучитьЭлементы().Очистить(); Отборы.ПолучитьЭлементы().Очистить(); ВыбранныеПоля.ПолучитьЭлементы().Очистить(); Сортировка.ПолучитьЭлементы().Очистить(); Оформление.ПолучитьЭлементы().Очистить(); СтруктураВарианта.ПолучитьЭлементы().Очистить(); УстановитьТипДиаграммы(); // Обновление настроек. ОбновитьПоляГруппировки(); ОбновитьПараметрыДанных(); ОбновитьОтборы(); ОбновитьВыбранныеПоля(); ОбновитьСортировку(); ОбновитьОформление(); ОбновитьСтруктуру(); // Поиск помеченных на удаление. ПомеченныеНаУдаление.Очистить(); НесуществующиеПоля = Новый Соответствие; НайтиПомеченныеНаУдалениеПоля(); УстановитьПодсказкуНесуществующихПолей(НесуществующиеПоля); КонецПроцедуры &НаСервере Процедура УстановитьТипДиаграммы() Элементы.ТекущийТипДиаграммы.Видимость = Ложь; Если ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных" Тогда Возврат; КонецЕсли; Элементы.ТекущийТипДиаграммы.ОграничениеТипа = Новый ОписаниеТипов("ТипДиаграммы"); ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(ИдентификаторЭлементаСтруктурыНастроек); Если ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда ЭлементСтруктуры = ЭлементСтруктуры.Настройки; КонецЕсли; ЭлементНастройки = ЭлементСтруктуры.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТипДиаграммы")); Если ЭлементНастройки <> Неопределено Тогда ТекущийТипДиаграммы = ЭлементНастройки.Значение; КонецЕсли; Элементы.ТекущийТипДиаграммы.Видимость = (ЭлементНастройки <> Неопределено); КонецПроцедуры &НаСервере Процедура ОбновитьСвойстваЭлементовФормы() КомпоновщикНастроек = Отчет.КомпоновщикНастроек; #Область ОбщиеПризнакиСвойствЭлементов ЭтоРасширенныйРежим = Булево(РасширенныйРежим); ОтображатьИнформацию = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек; #КонецОбласти #Область СвойстваЭлементовПростогоРежимаРедактирования Элементы.Основное.Видимость = Не ЭтоРасширенныйРежим; Элементы.Дополнительно.Видимость = Не ЭтоРасширенныйРежим И Не ЭтоМобильныйКлиент; Элементы.ВыводитьЗаголовок.Видимость = Не ЭтоРасширенныйРежим; Элементы.ВыводитьФильтры.Видимость = Не ЭтоРасширенныйРежим; #КонецОбласти #Область СвойстваЭлементовСтраницыСоставГруппировки ОтображатьСоставГруппировки = (ЭтоРасширенныйРежим И РежимИзмененияЭлементаСтруктурыНастроек И ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных"); Элементы.СтраницаСоставГруппировки.Видимость = ОтображатьСоставГруппировки; Элементы.КомандыСоставаГруппировки.Видимость = ОтображатьСоставГруппировки; Элементы.СоставГруппировки.Видимость = ОтображатьСоставГруппировки; #КонецОбласти #Область СвойстваЭлементовСтраницыОтборы ОтображатьОтборы = (ЭтоРасширенныйРежим И ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных"); Если ЭтоРасширенныйРежим Тогда Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Фильтры'"); Иначе Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Основное'"); Если ЭтоМобильныйКлиент Тогда ГруппаПользовательскиеНастройкиОсновные = Элементы.Основное.ПодчиненныеЭлементы.Найти("КомпоновщикНастроекПользовательскиеНастройкиОсновные"); Если ГруппаПользовательскиеНастройкиОсновные <> Неопределено Тогда Если Элементы.Основное.ПодчиненныеЭлементы.Количество() = 1 И Элементы.Основное.Вид = ВидГруппыФормы.Страницы Тогда // ГруппаФормы Элементы.Основное.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; Иначе Для Каждого ПодчиненныйЭлемент Из Элементы.Основное.ПодчиненныеЭлементы Цикл Если ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные Тогда Продолжить; КонецЕсли; Для Каждого ПодчиненныйЭлемент1 Из ПодчиненныйЭлемент.ПодчиненныеЭлементы Цикл Если ТипЗнч(ПодчиненныйЭлемент1) = Тип("ТаблицаФормы") Тогда ПодчиненныйЭлемент1.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; ПодчиненныйЭлемент1.Шапка = Ложь; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; Если ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы.Найти(ГруппаПользовательскиеНастройкиОсновные.Имя+"1") = Неопределено Тогда ГруппаПользовательскиеНастройкиОсновные1 = Элементы.Добавить(ГруппаПользовательскиеНастройкиОсновные.Имя+"1", Тип("ГруппаФормы"), ГруппаПользовательскиеНастройкиОсновные); ГруппаПользовательскиеНастройкиОсновные1.Вид = ВидГруппыФормы.ОбычнаяГруппа; // ГруппаФормы ГруппаПользовательскиеНастройкиОсновные1.ОтображатьЗаголовок = Ложь; ГруппаПользовательскиеНастройкиОсновные1.ГоризонтальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; ГруппаПользовательскиеНастройкиОсновные1.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; Счетчик = 0; Пока Счетчик < ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы.Количество() Цикл ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные.ПодчиненныеЭлементы[Счетчик]; Если ПодчиненныйЭлемент = ГруппаПользовательскиеНастройкиОсновные1 Тогда Счетчик = Счетчик + 1; Иначе Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда ПодчиненныйЭлемент.Объединенная = Ложь; КонецЕсли; Элементы.Переместить(ПодчиненныйЭлемент, ГруппаПользовательскиеНастройкиОсновные1); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Элементы.Отборы.Видимость = ОтображатьОтборы; Элементы.ГруппаЕстьВложенныеОтборы.Видимость = ОтображатьОтборы И СодержитВложенныеОтборы И ОтображатьИнформацию; Элементы.ОтборыПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек; #КонецОбласти #Область СвойстваЭлементовСтраницыПоляИСортировки СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ОтображатьВыбранныеПоля = СвойствоЭлементаСтруктуры <> Неопределено И (ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Или ЭтоРасширенныйРежим); СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); ОтображатьСортировки = ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных" И СвойствоЭлементаСтруктуры <> Неопределено И (ЗначениеЗаполнено(СвойствоЭлементаСтруктуры.ИдентификаторПользовательскойНастройки) Или ЭтоРасширенныйРежим); Если ОтображатьВыбранныеПоля И ОтображатьСортировки Тогда Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Поля и сортировки'"); ИначеЕсли ОтображатьВыбранныеПоля Тогда Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Поля'"); ИначеЕсли ОтображатьСортировки Тогда Элементы.СтраницаВыбранныеПоляИСортировки.Заголовок = НСтр("ru = 'Сортировки'"); КонецЕсли; Элементы.ВыбранныеПоля.Видимость = ОтображатьВыбранныеПоля; Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим; Элементы.КомандыВыбранныхПолей_ДобавлениеУдаление1.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим; Элементы.КомандыВыбранныхПолей_Группы.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим; Элементы.КомандыВыбранныхПолей_Группы1.Видимость = ОтображатьВыбранныеПоля И ЭтоРасширенныйРежим; Элементы.КомандыПолейИСортировок.Видимость = ОтображатьВыбранныеПоля И ОтображатьСортировки; Элементы.Сортировка.Видимость = ОтображатьСортировки; Элементы.КомандыСортировки_ДобавлениеУдаление.Видимость = ОтображатьСортировки И ЭтоРасширенныйРежим; Элементы.КомандыСортировки_ДобавлениеУдаление1.Видимость = ОтображатьСортировки И ЭтоРасширенныйРежим; Элементы.ГруппаЕстьВложенныеПоляИлиСортировки.Видимость = СодержитВложенныеПоляИлиСортировки И ОтображатьИнформацию; Элементы.ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек; #КонецОбласти #Область СвойстваЭлементовСтраницыОформление ОтображатьОформление = ЭтоРасширенныйРежим; Элементы.Оформление.Видимость = ОтображатьОформление; Элементы.ГруппаЕстьВложенноеОформление.Видимость = ОтображатьОформление И СодержитВложенноеУсловноеОформление И ОтображатьИнформацию; Элементы.ОформлениеПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек; #КонецОбласти #Область СвойстваЭлементовСтраницыСтруктураВарианта ОтображатьСтруктуруВарианта = НастройкиОтчета.РазрешеноИзменятьСтруктуру И Не РежимИзмененияЭлементаСтруктурыНастроек И (СодержитПользовательскиеЭлементыСтруктуры Или ЭтоРасширенныйРежим); Элементы.СтраницаСтруктураВарианта.Видимость = ОтображатьСтруктуруВарианта; Элементы.КомандыСтруктурыВарианта_Добавление.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_Добавление1.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_Изменение.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_Изменение1.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеПоИерархии.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеПоИерархии1.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя1.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии1.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.ИзменятьСоставСтрок = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.ИзменятьПорядокСтрок = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.РазрешитьНачалоПеретаскивания = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.РазрешитьПеретаскивание = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.Шапка = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаЗаголовок.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаСодержитОтборы.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаСодержитПоляИлиСортировки.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаСодержитУсловноеОформление.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим И Не РежимИзмененияЭлементаСтруктурыНастроек; #КонецОбласти #Область ОбщиеСвойстваЭлементов Если ТипЗнч(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ОтображатьСтраницы", Неопределено)) = Тип("Булево") Тогда ОтображатьСтраницы = (Параметры.ОтображатьСтраницы <> Ложь); ИначеЕсли Не ЭтоРасширенныйРежим Тогда ОтображатьСтраницы = Ложь; Иначе ОтображатьСтраницы = ОтображатьСоставГруппировки Или ОтображатьОтборы Или ОтображатьВыбранныеПоля Или ОтображатьСортировки Или ОтображатьОформление Или ОтображатьСтруктуруВарианта; КонецЕсли; Если ОтображатьСтраницы Тогда Элементы.СтраницыНастроек.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху; Иначе Элементы.СтраницыНастроек.ТекущаяСтраница = Элементы.СтраницаОтборы; Элементы.СтраницыНастроек.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; КонецЕсли; Элементы.ГруппаЕстьВложенныеОтчеты.Видимость = СодержитВложенныеОтчеты И ОтображатьИнформацию; Элементы.ГруппаЕстьНесуществующиеПоля.Видимость = ПомеченныеНаУдаление.Количество() > 0 И ОтображатьИнформацию; Элементы.РасширенныйРежим.Видимость = НастройкиОтчета.РазрешеноИзменятьВарианты И Не РежимИзмененияЭлементаСтруктурыНастроек; Элементы.ИзменитьУсловияОтборов.Видимость = РазрешитьИзменятьУсловияОтборов(); Если РежимИзмененияЭлементаСтруктурыНастроек Тогда Элементы.ЗакрытьИСформировать.Заголовок = НСтр("ru = 'Завершить редактирование'"); Элементы.Закрыть.Заголовок = НСтр("ru = 'Отмена'"); Иначе Элементы.ЗакрытьИСформировать.Заголовок = НСтр("ru = 'Закрыть и сформировать'"); Элементы.Закрыть.Заголовок = НСтр("ru = 'Закрыть'"); КонецЕсли; КоличествоДоступныхНастроек = ОтчетыСервер.КоличествоДоступныхНастроек(Отчет.КомпоновщикНастроек); Элементы.ЗакрытьИСформировать.Видимость = КоличествоДоступныхНастроек.Итог > 0 Или Элементы.Дополнительно.Видимость Или ОтображатьСтраницы; Если ЭтоМобильныйКлиент Тогда Элементы.РасширенныйРежим.Видимость = Ложь; Элементы.ГруппаНастройка.Видимость = Ложь; Элементы.ГруппаЕстьВложенныеОтчеты.Видимость = Истина; Элементы.ПодсказкаЕстьВложенныеОтчеты.Заголовок = НСтр( "ru='Расширенный режим настройки недоступен в мобильном клиенте'"); Элементы.ЗакрытьИСформировать.Отображение = ОтображениеКнопки.КартинкаИТекст; Элементы.Закрыть.Видимость = Ложь; Элементы.Справка.Видимость = Ложь; КонецЕсли; #КонецОбласти КонецПроцедуры #КонецОбласти #Область Сервер &НаСервере Процедура ОпределитьПоведениеВМобильномКлиенте() ЭтоМобильныйКлиент = ОбщегоНазначения.ЭтоМобильныйКлиент(); Если Не ЭтоМобильныйКлиент Тогда Возврат; КонецЕсли; ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто; Элементы.ЗакрытьИСформировать.Отображение = ОтображениеКнопки.Картинка; КонецПроцедуры &НаСервере Процедура УстановитьУсловноеОформление() УсловноеОформление.Элементы.Очистить(); #Область УсловноеОформлениеТаблицыФормыСоставГруппировки // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипГруппировки.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.ПоказыватьТипДополнения"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипДополнения.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.Поле"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Неопределено; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиТипГруппировки.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СоставГруппировки.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("СоставГруппировки.Заголовок")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СоставГруппировкиПоле.Имя); #КонецОбласти #Область УсловноеОформлениеТаблицыФормыОтборы // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИспользование.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПериод"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ОтображатьИспользование"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыИспользование.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПараметр"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыКартинкаРежимаОтображения.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыВидСравнения.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.ТипГруппы")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоУникальныйИдентификатор"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.Заголовок")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПараметр.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыТипГруппы.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПоле.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ПредставлениеЗначения"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.ПредставлениеЗначения")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыЗначение.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПравоеЗначение.Имя); // ЦветТекстаЗапрещеннойЯчейки = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет; Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отборы.ЭтоПредопределенныйЗаголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаЗапрещеннойЯчейки.Значение); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОтборыПредставлениеПользовательскойНастройки.Имя); #КонецОбласти #Область УсловноеОформлениеТаблицыФормыВыбранныеПоля // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВыбранныеПоля.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВыбранныеПоляИспользование.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВыбранныеПоля.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("ВыбранныеПоля.Заголовок")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВыбранныеПоляПоле.Имя); #КонецОбласти #Область УсловноеОформлениеТаблицыФормыСортировка // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаИспользование.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаТипУпорядочивания.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.ЭтоАвтоПоле"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаТипУпорядочивания.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сортировка.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Сортировка.Заголовок")); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СортировкаПоле.Имя); #КонецОбласти #Область УсловноеОформлениеТаблицыФормыОформление Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеЗаголовок.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоПараметрВывода"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); // Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИндексКартинкиДоступа.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоПараметрВывода"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); // Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИспользование.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеЗаголовок.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИндексКартинкиДоступа.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоРаздел"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); #КонецОбласти #Область УсловноеОформлениеТаблицыФормыСтруктураВарианта ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт.Значение; Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ЭтоГруппа"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.Заголовок"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РасширенныйРежим"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = 0; Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("СтруктураВарианта.Заголовок")); Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаПредставление.Имя); // Элемент = УсловноеОформление.Элементы.Добавить(); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктураВарианта.ФлажокДоступен"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Ложь; Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтруктураВариантаИспользование.Имя); #КонецОбласти КонецПроцедуры &НаСервере Процедура ЗагрузитьНастройкиВКомпоновщик(ПараметрыЗагрузки) Если Не ПараметрыЗагрузки.ВариантМодифицирован Тогда ПараметрыЗагрузки.ВариантМодифицирован = ВариантМодифицирован; КонецЕсли; Если Не ПараметрыЗагрузки.ПользовательскиеНастройкиМодифицированы Тогда ПараметрыЗагрузки.ПользовательскиеНастройкиМодифицированы = ПользовательскиеНастройкиМодифицированы; КонецЕсли; ПараметрыЗагрузки.ОтчетОбъектИлиПолноеИмя = НастройкиОтчета.ПолноеИмя; ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); Если НастройкиОтчета.События.ПередЗаполнениемПанелиБыстрыхНастроек Тогда ОтчетОбъект.ПередЗаполнениемПанелиБыстрыхНастроек(ЭтотОбъект, ПараметрыЗагрузки); КонецЕсли; ДоступныеНастройки = ОтчетыСервер.ДоступныеНастройки(ПараметрыЗагрузки, НастройкиОтчета); ОбновитьНастройкиВарианта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗагрузки, "ОбновитьНастройкиВарианта", Ложь); Если ОбновитьНастройкиВарианта Тогда ДоступныеНастройки.Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки(); Отчет.КомпоновщикНастроек.ЗагрузитьФиксированныеНастройки(Новый НастройкиКомпоновкиДанных); ДоступныеНастройки.ФиксированныеНастройки = Отчет.КомпоновщикНастроек.ФиксированныеНастройки; КонецЕсли; ОтчетыСервер.СброситьПользовательскиеНастройки(ДоступныеНастройки, ПараметрыЗагрузки); ОтчетыСервер.ЗаполнитьДополнительныеСвойства(ОтчетОбъект, ДоступныеНастройки.Настройки, КлючТекущегоВарианта, НастройкиОтчета.КлючПредопределенногоВарианта); Если НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда ОтчетОбъект.ПередЗагрузкойНастроекВКомпоновщик( ЭтотОбъект, НастройкиОтчета.КлючСхемы, КлючТекущегоВарианта, ДоступныеНастройки.Настройки, ДоступныеНастройки.ПользовательскиеНастройки); КонецЕсли; НастройкиЗагружены = ОтчетыКлиентСервер.ЗагрузитьНастройки( Отчет.КомпоновщикНастроек, ДоступныеНастройки.Настройки, ДоступныеНастройки.ПользовательскиеНастройки, ДоступныеНастройки.ФиксированныеНастройки); // Установка фиксированных отборов выполняется через компоновщик, т.к. в нем наиболее полная коллекция настроек. // В ПередЗагрузкой в параметрах могут отсутствовать те параметры, настройки которые не переопределялись. Если НастройкиЗагружены И ВариантыОтчетов.ДопустимоУстановитьКонтекст(ЭтотОбъект) И ТипЗнч(ФормаПараметры.Отбор) = Тип("Структура") Тогда ОтчетыСервер.УстановитьФиксированныеОтборы(ФормаПараметры.Отбор, Отчет.КомпоновщикНастроек.Настройки, НастройкиОтчета); КонецЕсли; Если ФормаПараметры.Свойство("ФиксированныеНастройки") Тогда ФормаПараметры.ФиксированныеНастройки = Отчет.КомпоновщикНастроек.ФиксированныеНастройки; КонецЕсли; ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); Если НастройкиОтчета.События.ПослеЗагрузкиНастроекВКомпоновщик Тогда ОтчетОбъект.ПослеЗагрузкиНастроекВКомпоновщик(Новый Структура); КонецЕсли; ОтчетыСервер.УстановитьДоступныеЗначения(ОтчетОбъект, ЭтотОбъект); ОтчетыСервер.ИнициализироватьПредопределенныеПараметрыВывода(НастройкиОтчета, ДоступныеНастройки.Настройки); Если ПараметрыЗагрузки.УсловияОтборов <> Неопределено Тогда ПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; Для Каждого Условие Из ПараметрыЗагрузки.УсловияОтборов Цикл ЭлементПользовательскойНастройки = ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Условие.Ключ); Если ЭлементПользовательскойНастройки <> Неопределено Тогда ЭлементПользовательскойНастройки.ВидСравнения = Условие.Значение; КонецЕсли; КонецЦикла; КонецЕсли; ИнициализироватьРеквизитыПредопределенныхПараметровВывода(); КомпоновщикНастроек = Отчет.КомпоновщикНастроек; ОтчетыСервер.УстановитьУсловияОтборов(ПараметрыЗагрузки, КомпоновщикНастроек); Если ПараметрыЗагрузки.ВариантМодифицирован Тогда ВариантИзменен = Истина; КонецЕсли; Если ПараметрыЗагрузки.ПользовательскиеНастройкиМодифицированы Тогда ПользовательскиеНастройкиМодифицированы = Истина; КонецЕсли; КонецПроцедуры &НаСервере Процедура ИнициализироватьРеквизитыПредопределенныхПараметровВывода() ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы; Объект = ПредопределенныеПараметры.Найти("TITLE"); ВыводитьЗаголовок = Объект.Использование; ПолеВыводаЗаголовка = Элементы.Найти("ВыводитьЗаголовок"); Если ПолеВыводаЗаголовка <> Неопределено Тогда ПолеВыводаЗаголовка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выводить заголовок для печати: %1'"), ?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'"))); КонецЕсли; Объект = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT"); СвязанныйОбъект = ПредопределенныеПараметры.Найти("FILTEROUTPUT"); ВыводитьФильтры = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить); КонецПроцедуры &НаСервере Функция ПолноеИмяРеквизита(Реквизит) Возврат ?(ПустаяСтрока(Реквизит.Путь), "", Реквизит.Путь + ".") + Реквизит.Имя; КонецФункции &НаКлиентеНаСервереБезКонтекста Функция ОписаниеТиповБезПримитивных(ИсходноеОписаниеТипов) ВычитаемыеТипы = Новый Массив; Если ИсходноеОписаниеТипов.СодержитТип(Тип("Строка")) Тогда ВычитаемыеТипы.Добавить(Тип("Строка")); КонецЕсли; Если ИсходноеОписаниеТипов.СодержитТип(Тип("Дата")) Тогда ВычитаемыеТипы.Добавить(Тип("Дата")); КонецЕсли; Если ИсходноеОписаниеТипов.СодержитТип(Тип("Число")) Тогда ВычитаемыеТипы.Добавить(Тип("Число")); КонецЕсли; Если ВычитаемыеТипы.Количество() = 0 Тогда Возврат ИсходноеОписаниеТипов; КонецЕсли; Возврат Новый ОписаниеТипов(ИсходноеОписаниеТипов, , ВычитаемыеТипы); КонецФункции &НаКлиенте Процедура ОформитьСписок(Элемент, ЭлементНастройки) Значение = Неопределено; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда Значение = ЭлементНастройки.Значение; ИначеЕсли ТипЗнч(ЭлементНастройки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда Значение = ЭлементНастройки.ПравоеЗначение; КонецЕсли; Если ТипЗнч(Значение) <> Тип("СписокЗначений") Тогда Возврат; КонецЕсли; Индекс = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Индекс(ЭлементНастройки); ПутьКСписку = ПутьКДаннымЭлементов.ПоИндексу[Индекс]; Если ПутьКСписку = Неопределено Тогда Возврат; КонецЕсли; Список = Элементы.Найти(ПутьКСписку); Если ЭлементНастройки.Использование Тогда Список.ЦветТекста = Новый Цвет; Иначе ПараметрКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); Список.ЦветТекста = ПараметрКлиента.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет; КонецЕсли; КонецПроцедуры &НаСервере Функция РазрешитьИзменятьУсловияОтборов() Если Булево(РасширенныйРежим) Тогда Возврат Ложь; КонецЕсли; КомпоновщикНастроек = Отчет.КомпоновщикНастроек; ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки; Для Каждого ЭлементПользовательскойНастройки Из ПользовательскиеНастройки.Элементы Цикл ЭлементНастройки = ОтчетыКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору( КомпоновщикНастроек.Настройки, ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки,, ПользовательскиеНастройки); Если ТипЗнч(ЭлементНастройки) <> Тип("ЭлементОтбораКомпоновкиДанных") Или ТипЗнч(ЭлементНастройки.ПравоеЗначение) = Тип("СтандартныйПериод") Или ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда Продолжить; КонецЕсли; Возврат Истина; КонецЦикла; Возврат Ложь; КонецФункции &НаКлиенте Процедура УстановитьМодифицированность() ПользовательскиеНастройкиМодифицированы = Истина; Если РасширенныйРежим = 1 Тогда ВариантИзменен = Истина; КонецЕсли; КонецПроцедуры #КонецОбласти #КонецОбласти #Область ОбработкаПомеченныхНаУдалениеПолей // Поиск полей, помеченных на удаление. &НаСервере Процедура НайтиПомеченныеНаУдалениеПоля(Знач ЭлементыСтруктуры = Неопределено) Если РежимИзмененияЭлементаСтруктурыНастроек Тогда Возврат; КонецЕсли; Настройки = Отчет.КомпоновщикНастроек.Настройки; Если ЭлементыСтруктуры = Неопределено Тогда ЭлементыСтруктуры = Настройки.Структура; НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки); НайтиПомеченныеНаУдалениеПоляОтбора(Настройки); НайтиПомеченныеНаУдалениеПоляПорядка(Настройки); НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки); КонецЕсли; Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл ТипЭлемента = ТипЗнч(ЭлементСтруктуры); Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки, ЭлементСтруктуры); НайтиПомеченныеНаУдалениеПоляОтбора(Настройки, ЭлементСтруктуры); НайтиПомеченныеНаУдалениеПоляПорядка(Настройки, ЭлементСтруктуры); НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки, ЭлементСтруктуры); НайтиПомеченныеНаУдалениеПоляГруппировки(Настройки, ЭлементСтруктуры); КонецЕсли; ИменаКоллекций = ИменаКоллекцийЭлементаСтруктуры(ЭлементСтруктуры); Для Каждого ИмяКоллекции Из ИменаКоллекций Цикл КоллекцияЭлементаСтруктуры = ЭлементыНастроек(ЭлементСтруктуры,, ИмяКоллекции); НайтиПомеченныеНаУдалениеПоля(КоллекцияЭлементаСтруктуры); КонецЦикла; КонецЦикла; Обработанные = ПомеченныеНаУдаление.Выгрузить(); Обработанные.Свернуть("ИдентификаторЭлементаСтруктуры, ИдентификаторЭлемента, КлючСвойстваЭлементаСтруктуры"); Обработанные.Сортировать("ИдентификаторЭлементаСтруктуры Убыв, КлючСвойстваЭлементаСтруктуры, ИдентификаторЭлемента"); ПомеченныеНаУдаление.Загрузить(Обработанные); КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки, Знач ЭлементСтруктуры = Неопределено, Группа = Неопределено) Если ЭлементСтруктуры = Неопределено Тогда ЭлементСтруктуры = Настройки; КонецЕсли; СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Выбор; ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляВыбора; ТипАвтоПоля = Тип("АвтоВыбранноеПолеКомпоновкиДанных"); ТипГруппы = Тип("ГруппаВыбранныхПолейКомпоновкиДанных"); ЭлементыНастроек = ?(Группа = Неопределено, СвойствоЭлементаСтруктуры.Элементы, Группа.Элементы); Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда НайтиПомеченныеНаУдалениеВыбранныеПоля(Настройки, ЭлементСтруктуры, ЭлементНастройки); Продолжить; КонецЕсли; Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Запись.КлючСвойстваЭлементаСтруктуры = "Выбор"; ДобавитьНесуществующееПоле(ЭлементНастройки.Поле, НСтр("ru = 'Выбор'")); КонецЦикла; КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеПоляОтбора(Настройки, Знач ЭлементСтруктуры = Неопределено, Группа = Неопределено) Если ЭлементСтруктуры = Неопределено Тогда ЭлементСтруктуры = Настройки; КонецЕсли; СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Отбор; ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляОтбора; ТипГруппы = Тип("ГруппаЭлементовОтбораКомпоновкиДанных"); ЭлементыНастроек = ?(Группа = Неопределено, СвойствоЭлементаСтруктуры.Элементы, Группа.Элементы); Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда НайтиПомеченныеНаУдалениеПоляОтбора(Настройки, ЭлементСтруктуры, ЭлементНастройки); Продолжить; КонецЕсли; Если ТипЗнч(ЭлементНастройки.ЛевоеЗначение) <> Тип("ПолеКомпоновкиДанных") Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.ЛевоеЗначение) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Запись.КлючСвойстваЭлементаСтруктуры = "Отбор"; ДобавитьНесуществующееПоле(ЭлементНастройки.ЛевоеЗначение, НСтр("ru = 'Отбор'")); КонецЦикла; КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеПоляПорядка(Настройки, Знач ЭлементСтруктуры = Неопределено) Если ЭлементСтруктуры = Неопределено Тогда ЭлементСтруктуры = Настройки; КонецЕсли; СвойствоЭлементаСтруктуры = ЭлементСтруктуры.Порядок; ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляПорядка; ТипАвтоПоля = Тип("АвтоЭлементПорядкаКомпоновкиДанных"); Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Запись.КлючСвойстваЭлементаСтруктуры = "Порядок"; ДобавитьНесуществующееПоле(ЭлементНастройки.Поле, НСтр("ru = 'Порядок'")); КонецЦикла; КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеЭлементыУсловногоОформления(Настройки, Знач ЭлементСтруктуры = Неопределено) Если ЭлементСтруктуры = Неопределено Тогда ЭлементСтруктуры = Настройки; КонецЕсли; СвойствоЭлементаСтруктуры = ЭлементСтруктуры.УсловноеОформление; Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл ДоступныеПоля = ЭлементНастройки.Поля.ДоступныеПоляОформляемыхПолей; Для Каждого Элемент Из ЭлементНастройки.Поля.Элементы Цикл Если ДоступныеПоля.НайтиПоле(Элемент.Поле) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Запись.КлючСвойстваЭлементаСтруктуры = "УсловноеОформление"; ДобавитьНесуществующееПоле(Элемент.Поле, НСтр("ru = 'Условное оформление'")); КонецЦикла; НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления(Настройки, ЭлементСтруктуры, ЭлементНастройки); КонецЦикла; КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления(Настройки, ЭлементСтруктуры, ЭлементОформления, Группа = Неопределено) СвойствоЭлементаСтруктуры = ЭлементСтруктуры.УсловноеОформление; ДоступныеПоля = ЭлементОформления.Отбор.ДоступныеПоляОтбора; ТипГруппы = Тип("ГруппаЭлементовОтбораКомпоновкиДанных"); ЭлементыНастроек = ?(Группа = Неопределено, ЭлементОформления.Отбор.Элементы, Группа.Элементы); Для Каждого ЭлементНастройки Из ЭлементыНастроек Цикл Если ТипЗнч(ЭлементНастройки) = ТипГруппы Тогда НайтиПомеченныеНаУдалениеЭлементыОтбораУсловногоОформления( Настройки, ЭлементСтруктуры, ЭлементОформления, ЭлементНастройки); Продолжить; КонецЕсли; Если ДоступныеПоля.НайтиПоле(ЭлементНастройки.ЛевоеЗначение) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементОформления); Запись.КлючСвойстваЭлементаСтруктуры = "УсловноеОформление"; ДобавитьНесуществующееПоле(ЭлементНастройки.ЛевоеЗначение, НСтр("ru = 'Условное оформление'")); КонецЦикла; КонецПроцедуры &НаСервере Процедура НайтиПомеченныеНаУдалениеПоляГруппировки(Настройки, ЭлементСтруктуры) СвойствоЭлементаСтруктуры = ЭлементСтруктуры.ПоляГруппировки; ДоступныеПоля = СвойствоЭлементаСтруктуры.ДоступныеПоляПолейГруппировок; ТипАвтоПоля = Тип("АвтоПолеГруппировкиКомпоновкиДанных"); Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл Если ТипЗнч(ЭлементНастройки) = ТипАвтоПоля Или ДоступныеПоля.НайтиПоле(ЭлементНастройки.Поле) <> Неопределено Тогда Продолжить; КонецЕсли; Запись = ПомеченныеНаУдаление.Добавить(); Запись.ИдентификаторЭлементаСтруктуры = Настройки.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); Запись.ИдентификаторЭлемента = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); Запись.КлючСвойстваЭлементаСтруктуры = "ПоляГруппировки"; ДобавитьНесуществующееПоле(ЭлементНастройки.Поле, НСтр("ru = 'Поля группировки'")); КонецЦикла; КонецПроцедуры &НаСервере Функция ИменаКоллекцийЭлементаСтруктуры(Элемент) ИменаКоллекций = ""; ТипЭлемента = ТипЗнч(Элемент); Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Или ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда ИменаКоллекций = "Структура"; ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда ИменаКоллекций = "Строки,Колонки"; ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда ИменаКоллекций = "Точки,Серии"; КонецЕсли; Возврат СтрРазделить(ИменаКоллекций, ","); КонецФункции &НаСервере Функция ПредставлениеКоллекцииЭлементаСтруктуры(ИмяКоллекции) ПредставлениеКоллекций = Новый Соответствие; ПредставлениеКоллекций.Вставить("Структура", НСтр("ru = 'Структура'")); ПредставлениеКоллекций.Вставить("Строки", НСтр("ru = 'Строки'")); ПредставлениеКоллекций.Вставить("Колонки", НСтр("ru = 'Колонки'")); ПредставлениеКоллекций.Вставить("Точки", НСтр("ru = 'Точки'")); ПредставлениеКоллекций.Вставить("Серии", НСтр("ru = 'Серии'")); Возврат ПредставлениеКоллекций[ИмяКоллекции]; КонецФункции &НаСервере Процедура ДобавитьНесуществующееПоле(Знач ИмяПоля, Знач ИмяКоллекции) ИмяПоля = Строка(ИмяПоля); ИмяКоллекции = Строка(ИмяКоллекции); Свойства = НесуществующиеПоля.Получить(ИмяПоля); Если Свойства = Неопределено Тогда Свойства = Новый Массив; НесуществующиеПоля.Вставить(ИмяПоля, Свойства); КонецЕсли; Если Свойства.Найти(ИмяКоллекции) = Неопределено Тогда Свойства.Добавить(ИмяКоллекции); КонецЕсли; КонецПроцедуры &НаСервере Процедура УстановитьПодсказкуНесуществующихПолей(НесуществующиеПоля) ТекстПодсказки = НСтр("ru = 'Несуществующие поля могут появиться, если разработчик отчета удалил поле или запретил его вывод. |Использование таких полей может привести к ошибкам при формировании отчета. |Рекомендуется удалить несуществующие поля из настроек отчета или заменить их на существующие.'"); Строки = Новый Массив; Для Каждого КлючИЗначение Из НесуществующиеПоля Цикл Строки.Добавить("- " + КлючИЗначение.Ключ + " (" + СтрСоединить(КлючИЗначение.Значение, ", ") + ")"); КонецЦикла; Элементы.ГруппаЕстьНесуществующиеПоля.РасширеннаяПодсказка.Заголовок = ТекстПодсказки + Символы.ПС + Символы.ПС + НСтр("ru = 'Несуществующие поля:'") + Символы.ПС + СтрСоединить(Строки, Символы.ПС); КонецПроцедуры // Удаление полей, помеченных на удаление. &НаКлиенте Процедура УдалитьПомеченныеНаУдалениеПоля() КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Для Каждого Запись Из ПомеченныеНаУдаление Цикл СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( КомпоновщикНастроек, Запись.КлючСвойстваЭлементаСтруктуры, Запись.ИдентификаторЭлементаСтруктуры, РасширенныйРежим); Если СвойствоЭлементаСтруктуры = Неопределено Тогда Продолжить; КонецЕсли; ЭлементНастройки = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Запись.ИдентификаторЭлемента); Если ЭлементНастройки = Неопределено Тогда Продолжить; КонецЕсли; РодительЭлементаНастройки = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементНастройки); ЭлементыНастроек = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаНастройки); ЭлементыНастроек.Удалить(ЭлементНастройки); Если ЭлементыНастроек.Количество() = 0 И ТипЗнч(РодительЭлементаНастройки) = Тип("ПоляГруппировкиКомпоновкиДанных") Тогда ЭлементСтруктуры = КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(Запись.ИдентификаторЭлементаСтруктуры); Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаКомпоновкиДанных") Тогда ЭлементыСтруктуры = ЭлементСтруктуры.Структура; Если ЭлементыСтруктуры.Количество() = 0 Тогда Продолжить; КонецЕсли; Индекс = ЭлементыСтруктуры.Количество() - 1; Пока Индекс >= 0 Цикл ЭлементыСтруктуры.Удалить(ЭлементыСтруктуры[Индекс]); Индекс = Индекс - 1; КонецЦикла; Иначе // ГруппировкаТаблицыКомпоновкиДанных или ГруппировкаДиаграммыКомпоновкиДанных. РодительЭлементаСтруктуры = ПолучитьРодителяЭлементаНастройки(СвойствоЭлементаСтруктуры, ЭлементСтруктуры); ИмяКоллекции = ИмяКоллекцииНастроекПоИдентификатору(Запись.ИдентификаторЭлементаСтруктуры); ЭлементыСтруктуры = ЭлементыНастроек(СвойствоЭлементаСтруктуры, РодительЭлементаСтруктуры, ИмяКоллекции); ЭлементыСтруктуры.Удалить(ЭлементСтруктуры); КонецЕсли; КонецЕсли; КонецЦикла; УстановитьМодифицированность(); КонецПроцедуры #КонецОбласти // АПК:568-выкл выполняет задачу адаптации кода (исправление проблем типизации). // Параметры: // Коллекция - ДанныеФормыДерево // // Возвращаемое значение: // ДанныеФормыЭлементДерева: // * Идентификатор - ИдентификаторКомпоновкиДанных // * Использование - Булево // * ОтображатьИспользование - Булево // * ПредставлениеПользовательскойНастройки - Строка // * ВидСравнения - ВидСравненияКомпоновкиДанных // * Значение - Неопределено // * ПредставлениеЗначения - Строка // * ТипЗначения - ОписаниеТипов // * ДоступныеЗначения - СписокЗначений // * ДоступенСписокЗначений - Булево // * КартинкаРежимаОтображения - Число // * Заголовок - Строка // * ЭтоПредопределенныйЗаголовок - Булево // * ЭтоРаздел - Булево // * ЭтоГруппа - Булево // * ЭтоПараметр - Булево // * ЭтоПериод - Булево // * Картинка - Число // * ФормаВыбора - Строка // * ВыборГруппИЭлементов - ИспользованиеГруппИЭлементов // * ДоступныеВидыСравнения - СписокЗначений // * Параметр - ПараметрКомпоновкиДанных // * ЛевоеЗначение - ПолеКомпоновкиДанных // * ПравоеЗначение - Неопределено // * ПометкаУдаления - Булево // * ЭтоУникальныйИдентификатор - Булево // &НаКлиентеНаСервереБезКонтекста Функция ЭлементКоллекцииФормыНастроек(Коллекция) Если Коллекция.ПолучитьЭлементы().Количество() = 0 Тогда Возврат Неопределено; КонецЕсли; Возврат Коллекция.ПолучитьЭлементы()[0]; КонецФункции // АПК:568-вкл #Область ОпределениеДанныхВыбораЭлементаОтбора &НаКлиенте Процедура ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу(ИсходныйЗапрос, ДанныеВыбора, ДоступныеПоля, Запрос = Неопределено, Родитель = Неопределено, Индекс = 0) Если ДанныеВыбора = Неопределено Тогда ДанныеВыбора = Новый СписокЗначений; КонецЕсли; Если Запрос = Неопределено Тогда Запрос = ИсходныйЗапрос; КонецЕсли; ОписаниеЗапроса = СтрРазделить(Запрос, ".", Ложь); Если СтрЗаканчиваетсяНа(Запрос, ".") Тогда ОписаниеЗапроса.Добавить(". "); КонецЕсли; Пока Индекс <= ОписаниеЗапроса.ВГраница() Цикл ФрагментЗапроса = СокрЛП(ОписаниеЗапроса[Индекс]); ДочерниеЭлементы = ?(Родитель = Неопределено, ДоступныеПоля.Элементы, Родитель.Элементы); Если Индекс = ОписаниеЗапроса.ВГраница() Тогда ЗаполнитьДанныеВыбораЭлементаОтбора(ИсходныйЗапрос, ДочерниеЭлементы, ДанныеВыбора); ИначеЕсли ДанныеВыбора.Количество() = 0 Тогда ПутьКДанным = ФрагментЗапроса; Если Родитель <> Неопределено Тогда ПутьКДанным = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "%1.%2", Родитель.Поле, ФрагментЗапроса); КонецЕсли; Поле = Новый ПолеКомпоновкиДанных(ПутьКДанным); НайденноеПоле = ДоступныеПоля.НайтиПоле(Поле); Если НайденноеПоле = Неопределено Тогда НайденноеПоле = ДоступноеПолеОтбораПоЗаголовку(ФрагментЗапроса, ДочерниеЭлементы); КонецЕсли; ОписаниеЗапроса.Удалить(Индекс); НовыйЗапрос = СтрСоединить(ОписаниеЗапроса, "."); ОпределитьДанныеВыбораЭлементаОтбораПоЗапросу( ИсходныйЗапрос, ДанныеВыбора, ДоступныеПоля, НовыйЗапрос, НайденноеПоле, Индекс); КонецЕсли; Индекс = Индекс + 1; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ЗаполнитьДанныеВыбораЭлементаОтбора(ИсходныйЗапрос, ДочерниеЭлементы, ДанныеВыбора) Для Каждого Элемент Из ДочерниеЭлементы Цикл Если Не Элемент.Папка И Не Элемент.Таблица И СтрНачинаетсяС(ВРег(Элемент.Заголовок), ВРег(ИсходныйЗапрос)) Тогда ПредставлениеЭлемента = ПредставлениеЭлементаОтбора(Элемент, ИсходныйЗапрос); ДанныеВыбора.Добавить(Элемент.Поле, ПредставлениеЭлемента); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиенте Функция ПредставлениеЭлементаОтбора(ЭлементОтбора, ИсходныйЗапрос) НачалоЗапроса = СтрНайти(ВРег(ЭлементОтбора.Заголовок), ВРег(ИсходныйЗапрос)); КонецЗапроса = НачалоЗапроса + СтрДлина(ИсходныйЗапрос); ДлинаНайденногоФрагмента = ?(НачалоЗапроса = 0, 0, СтрДлина(ИсходныйЗапрос)); ФрагментДоЗапроса = Лев(ЭлементОтбора.Заголовок, НачалоЗапроса - 1); ФрагментЗапроса = ФрагментЗапросаЭлементаОтбора(Сред(ЭлементОтбора.Заголовок, НачалоЗапроса, ДлинаНайденногоФрагмента)); ФрагментПослеЗапроса = Сред(ЭлементОтбора.Заголовок, КонецЗапроса); Возврат Новый ФорматированнаяСтрока( ФрагментДоЗапроса, ФрагментЗапроса, ФрагментПослеЗапроса); КонецФункции &НаКлиенте Функция ФрагментЗапросаЭлементаОтбора(Запрос) ШаблонФрагментаЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "%3", "МоиВариантыОтчетовЦвет", "ВажнаяНадписьШрифт", Запрос); #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ФрагментЗапроса = СтроковыеФункции.ФорматированнаяСтрока(ШаблонФрагментаЗапроса); #Иначе ФрагментЗапроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ШаблонФрагментаЗапроса); #КонецЕсли Возврат ФрагментЗапроса; КонецФункции &НаКлиенте Функция ДоступноеПолеОтбораПоЗаголовку(ЗаголовокПоля, ДочерниеЭлементы) Для Каждого Элемент Из ДочерниеЭлементы Цикл Если Не Элемент.Папка И Не Элемент.Таблица И ВРег(Элемент.Заголовок) = ВРег(ЗаголовокПоля) Тогда Возврат Элемент; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции #КонецОбласти &НаКлиенте Процедура ОткрытьФормуНастроекДляТехническогоСпециалиста(ИмяСтраницы, ОбработчикЗавершения = Неопределено) ПараметрыФормы = Новый Структура; ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование); ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек); ПараметрыФормы.Вставить("ИмяСтраницы", ИмяСтраницы); ПараметрыФормы.Вставить("ПредставлениеВарианта", ВариантНаименование); ПараметрыФормы.Вставить("ВариантМодифицирован", ВариантИзменен); ПараметрыФормы.Вставить("ПользовательскиеНастройкиМодифицированы", ВариантИзменен Или ПользовательскиеНастройкиМодифицированы); Если ОбработчикЗавершения <> Неопределено Тогда ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы, , , , ОбработчикЗавершения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); Иначе ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы); Если ОбработчикЗавершения = Неопределено Тогда РезультатВыбораСформирован = Истина; Закрыть(); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПриЗакрытииФормыНастроекДляТехническогоСпециалиста(Результат, ДополнительныеПараметры) Экспорт Если ТипЗнч(Результат) = Тип("Структура") Тогда ОбновитьФорму(Результат); КонецЕсли; КонецПроцедуры #КонецОбласти