Files
uas_ep/src/CommonForms/ФормаНастроекОтчета/Ext/Form/Module.bsl
T

8318 lines
574 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 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);
ФрагментЗапроса = ФрагментЗапросаЭлементаОтбора(Сред(ЭлементОтбора.Заголовок, НачалоЗапроса, ДлинаНайденногоФрагмента));
ФрагментПослеЗапроса = Сред(ЭлементОтбора.Заголовок, КонецЗапроса);
Возврат Новый ФорматированнаяСтрока(
ФрагментДоЗапроса,
ФрагментЗапроса,
ФрагментПослеЗапроса);
КонецФункции
&НаКлиенте
Функция ФрагментЗапросаЭлементаОтбора(Запрос)
ШаблонФрагментаЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
"<span style=""color: %1; font: %2"">%3</span>",
"МоиВариантыОтчетовЦвет",
"ВажнаяНадписьШрифт",
Запрос);
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
ФрагментЗапроса = СтроковыеФункции.ФорматированнаяСтрока(ШаблонФрагментаЗапроса);
#Иначе
ФрагментЗапроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ШаблонФрагментаЗапроса);
#КонецЕсли
Возврат ФрагментЗапроса;
КонецФункции
&НаКлиенте
Функция ДоступноеПолеОтбораПоЗаголовку(ЗаголовокПоля, ДочерниеЭлементы)
Для Каждого Элемент Из ДочерниеЭлементы Цикл
Если Не Элемент.Папка
И Не Элемент.Таблица
И ВРег(Элемент.Заголовок) = ВРег(ЗаголовокПоля) Тогда
Возврат Элемент;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
#КонецОбласти
&НаКлиенте
Процедура ОткрытьФормуНастроекДляТехническогоСпециалиста(ИмяСтраницы, ОбработчикЗавершения = Неопределено)
ПараметрыФормы = Новый Структура;
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина);
ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта));
ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета);
ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование);
ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек);
ПараметрыФормы.Вставить("ИмяСтраницы", ИмяСтраницы);
ПараметрыФормы.Вставить("ПредставлениеВарианта", ВариантНаименование);
ПараметрыФормы.Вставить("ВариантМодифицирован", ВариантИзменен);
ПараметрыФормы.Вставить("ПользовательскиеНастройкиМодифицированы",
ВариантИзменен Или ПользовательскиеНастройкиМодифицированы);
Если ОбработчикЗавершения <> Неопределено Тогда
ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы, , , ,
ОбработчикЗавершения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Иначе
ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы);
Если ОбработчикЗавершения = Неопределено Тогда
РезультатВыбораСформирован = Истина;
Закрыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытииФормыНастроекДляТехническогоСпециалиста(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
ОбновитьФорму(Результат);
КонецЕсли;
КонецПроцедуры
#КонецОбласти