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