#Область ОписаниеПеременных
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ЯчейкаПослеВвода;
&НаКлиенте
Перем ПринудительноеЗавершение;
&НаКлиенте
Перем ОткрытДиалогВопросаДубли;
&НаКлиенте
Перем ИзмененияВСпискеОтраженыВДокументе;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
Если Не ВыполняетсяЗаданиеРасчетаИзменений Тогда
ЗапуститьПроверкуВыполненияОтчета();
Иначе
ЗапуститьПроверкуРасчетаИзменений();
КонецЕсли;
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей);
РассчитатьПоказатели(ОсновнойПоказатель);
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Если Параметры.Свойство("Основание") И ТипЗнч(Параметры.Основание) = Тип("ДокументСсылка.ЭкземплярБюджета") Тогда
СтатусОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Основание, "Статус");
Если СтатусОснования = Перечисления.СтатусыПланов.ВПодготовке
Или СтатусОснования = Перечисления.СтатусыПланов.Отменен Тогда
ВызватьИсключение НСтр(
"ru='Недопустимо вводить корректировку бюджета со статусом ""В подготовке"" или ""Отменен""'");
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПриЧтенииСозданииНаСервере();
КонецЕсли;
СтруктураПараметров = ПодготовитьПараметрыВыводаВидаБюджета();
КэшПараметровСтатей = БюджетированиеСервер.ЗаполнитьКэшПараметровСтатей(СтруктураПараметров);
Если СтруктураПараметров = Неопределено
Или Не ЗначениеЗаполнено(Объект.Сценарий)
Или Не ЗначениеЗаполнено(Объект.НачалоПериода)
Или Не ЗначениеЗаполнено(Объект.ОкончаниеПериода) Тогда
Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаОсновное;
Иначе
Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаБюджет;
КонецЕсли;
УстановитьПоляШапкиДокумента();
УстановитьДоступностьМоделиБюджетирования();
УстановитьДоступностьЭлементовПоСтатусуСервер();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
УстановитьПараметрыСценария();
УстановитьПараметрыВыбораСтатьиБюджетаДляКорректировкиОборотов();
Если Объект.Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета Тогда
ЗаполнитьТаблицуКорректировкиПоСтатьямБюджетов();
РассчитатьИтоговыеСуммыКорректировки(ЭтотОбъект);
УстановитьВидимостьКолонокПоКорректировкам(ЭтотОбъект);
КонецЕсли;
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Объект", Объект);
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
ФайловаяИБ = ОбщегоНазначения.ИнформационнаяБазаФайловая();
Справочники.ВидыБюджетов.НастроитьГруппуЭлементовПериода(Объект.ВидБюджета, Элементы, Объект.ГраницаФактДанных);
АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
Если ЗначениеЗаполнено(Объект.ВидБюджета) И Элементы.СтраницаБюджет.Видимость Тогда
РежимРедактирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ВидБюджета_" + XMLСтрока(Объект.ВидБюджета), "РежимРедактирования");
Если ЗначениеЗаполнено(РежимРедактирования) Тогда
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы[РежимРедактирования];
КонецЕсли;
КонецЕсли;
ПриИзмененииСпособаРедактированияБюджета();
ПредыдущаяСтрокаДереваЭлементов = -1;
УстановитьДоступностьКомандБуфераОбмена();
СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
ПараметрыОпций = Новый Структура("МодельБюджетирования", Объект.МодельБюджетирования);
УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыОпций);
ИспользоватьУтверждениеБюджетов = ПолучитьФункциональнуюОпциюФормы("ИспользоватьУтверждениеБюджетов");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(Результат, ИсточникВыбора)
Если ТипЗнч(Результат) = Тип("СправочникСсылка.ЭкземплярБюджетаПрисоединенныеФайлы") Тогда
ВозможностьЧтения = ВозможностьЧтенияПрисоединенногоФайла(Результат);
Если НЕ ВозможностьЧтения.ЧтениеВозможно Тогда
ПоказатьПредупреждение(, ВозможностьЧтения.ТекстОшибки);
Иначе
ЗагрузитьИзExcelНаКлиенте(Результат);
КонецЕсли;
КонецЕсли;
Если ИсточникВыбора.ИмяФормы = "Документ.ЭкземплярБюджета.Форма.ФормаСопоставленияЗагружаемыхДанныхИзExcel" Тогда
ЗагрузитьБюджетНаСервере(Результат);
ОбновитьБюджет();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ПриЧтенииСозданииНаСервере();
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ПроверитьДанныеПередЗаписью(ТекущийОбъект);
Если Объект.Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета Тогда
ЗаписатьТаблицуКорректировкиПоСтатьямБюджетов(ТекущийОбъект);
КонецЕсли;
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы,
"АвтоматическийПересчет",
"Пометка",
АвтоматическоеОбновлениеБюджета);
ВосстановитьРазмерыЯчеек();
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
СохраняемаяШиринаКолонок = Новый Массив;
Для Сч = 1 По Бюджет.ШиринаТаблицы Цикл
СохраняемаяШиринаКолонок.Добавить(Бюджет.Область(,Сч,,Сч).ШиринаКолонки);
КонецЦикла;
ХранилищеНастроекДанныхФорм.Сохранить(ИмяФормы,
"ШиринаКолонок_" + Объект.Ссылка.УникальныйИдентификатор(),
СохраняемаяШиринаКолонок);
СохраняемаяВысотаСтрок = Новый Массив;
Для Сч = 1 По Бюджет.ВысотаТаблицы Цикл
СохраняемаяВысотаСтрок.Добавить(Бюджет.Область(Сч,,Сч,).ВысотаСтроки);
КонецЦикла;
ХранилищеНастроекДанныхФорм.Сохранить(ИмяФормы,
"ВысотаСтрок_" + Объект.Ссылка.УникальныйИдентификатор(),
СохраняемаяВысотаСтрок);
Если Не Элементы.Бюджет.ОтображениеСостояния.Видимость Тогда
СохранитьХранимыйМакет();
КонецЕсли;
Если Элементы.СтраницаБюджет.Видимость Тогда
РежимРедактирования = Элементы.ПанельБюджет.ТекущаяСтраница.Имя;
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ВидБюджета_" + XMLСтрока(Объект.ВидБюджета), "РежимРедактирования", РежимРедактирования);
КонецЕсли;
Если Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаБюджет Тогда
ОтразитьИзмененияБюджета();
КонецЕсли;
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ЭкземплярБюджета", , Объект.Ссылка);
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЭлементовБюджета", 1, Истина);
КонецЕсли;
УстановитьНадписьОбновленияИтогов(Истина);
ЗапуститьПроверкуРасчетаИзменений();
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
КонецЕсли;
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ВидБюджетаПриИзменении(Элемент)
ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЭкземплярБюджета.ФормаДокумента.Элемент.ВидБюджета.ПриИзменении",,
Истина);
ПриИзмененииВидаБюджетаСервер();
ЗапуститьПроверкуВыполненияОтчета();
КонецПроцедуры
&НаКлиенте
Процедура МодельБюджетированияПриИзменении(Элемент)
ПриИзмененииМоделиБюджетированияСервер();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура МодельБюджетированияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если Не МодельБюджетированияДействует(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
ТекстПредупреждения = НСтр("ru = 'Модель бюджетирования не действует.
|Измените статус у модели для выбора в документе'");
ПоказатьПредупреждение(,ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
ПриИзмененииСценарияСервер();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
Объект.ОкончаниеПериода = ?(Объект.НачалоПериода > Объект.ОкончаниеПериода, Объект.НачалоПериода, Объект.ОкончаниеПериода);
ПриИзмененииПериодаСервер();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура ОкончаниеПериодаПриИзменении(Элемент)
Объект.НачалоПериода = ?(Объект.НачалоПериода > Объект.ОкончаниеПериода, Объект.ОкончаниеПериода, Объект.НачалоПериода);
ПриИзмененииПериодаСервер();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(
Элемент.ТекстРедактирования,
ЭтотОбъект,
"Объект.Комментарий");
КонецПроцедуры
&НаКлиенте
Процедура ДействиеПриИзменении(Элемент)
Если Объект.Действие = ПредопределенноеЗначение(
"Перечисление.ТипыДействийЭкземпляровБюджетов.ИсправлениеЭкземпляраБюджета") Тогда
ДополнительныеПараметры = Новый Структура("Действие", Объект.Действие);
ОписаниеОповещения = Новый ОписаниеОповещения("ДействиеПриИзмененииЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = НСтр("ru = 'Документ будет заполнен актуальными данными бюджета. Продолжить?'");
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Иначе
ПриИзмененииДействияСервер();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БюджетПриИзмененииСодержимогоОбласти(Элемент, Область)
Если Не Область.СодержитЗначение Тогда
Элементы.Бюджет.Редактирование = Ложь;
Область.Текст = "";
ТекстПредупреждения = НСтр("ru = 'Редактирование ячейки не предусмотрено'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
КонецЕсли;
УстановитьНадписьОбновленияИтогов(Истина);
Расшифровка = Область.Расшифровка;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Расшифровка, АдресДанныхРасшифровки);
Значение = Область.Значение;
СокращенныеРазряды = 0;
Если Расшифровка.Свойство("СокращенныеРазряды", СокращенныеРазряды) Тогда
Значение = Значение * Pow(10, СокращенныеРазряды);
КонецЕсли;
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
РезультатОтражения = БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, Значение);
ЯчейкаПослеВвода = Истина;
ПараметрыНеконтекстногоВызова = ПараметрыНеконтекстногоВызова(РезультатОтражения, Расшифровка, Область.Имя);
Если АвтоматическоеОбновлениеБюджета Тогда
БюджетПриИзмененииСерверАвтоПересчет(ПараметрыНеконтекстногоВызова);
ЗапуститьПроверкуРасчетаИзменений();
Иначе
СтруктураРезультат = БюджетПриИзмененииСервер(ПараметрыНеконтекстногоВызова);
Если СтруктураРезультат <> Неопределено Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, СтруктураРезультат);
КонецЕсли;
УстановитьНадписьОбновленияИтогов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БюджетОбработкаРасшифровки(Элемент, ИндексРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ИндексРасшифровки, АдресДанныхРасшифровки);
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
Если Не Расшифровка.Свойство("ИндексСтрокиДанных") И Расшифровка.Свойство("Значение") Тогда
Если Расшифровка.Значение <> Неопределено Тогда
ПоказатьЗначение(Неопределено, Расшифровка.Значение);
КонецЕсли;
Иначе
Если Не Объект.ПометкаУдаления И ПроверитьЗаполнение() Тогда
Если Модифицированность ИЛИ Объект.Ссылка.Пустая() Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеСохраненияДокументаПередРасшифровкой", ЭтотОбъект);
ТекстВопроса = НСтр("ru = 'Расшифровка возможна только в проведенном документе. Провести документ?'");
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Иначе
ПослеСохраненияДокументаПередРасшифровкой(КодВозвратаДиалога.Да, Неопределено);
КонецЕсли;
Иначе
ТекстПредупреждения = НСтр("ru = 'Расшифровка возможна только в проведенном документе'");
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БюджетПриАктивизацииОбласти(Элемент)
ТекущаяОбласть = Бюджет.ТекущаяОбласть;
Если ЯчейкаПослеВвода = Истина Тогда
Если ТекущаяОбласть.Лево = 1 Тогда
ЕстьВводимыеЯчейкиВСтроке = Ложь;
ВерхПоиска = ТекущаяОбласть.Верх;
Пока Не ЕстьВводимыеЯчейкиВСтроке Цикл
ПравоПоиска = ТекущаяОбласть.Право + 1;
ЕстьКолонкиДляВвода = Ложь;
Пока ПравоПоиска <= Бюджет.ШиринаТаблицы Цикл
ОбластьСправа = Бюджет.Область(ВерхПоиска, ПравоПоиска);
Если ОбластьСправа.СодержитЗначение Тогда
ЕстьВводимыеЯчейкиВСтроке = Истина;
Элементы.Бюджет.ТекущаяОбласть = ОбластьСправа;
Прервать;
КонецЕсли;
ПравоПоиска = ПравоПоиска + 1;
КонецЦикла;
Если ЕстьВводимыеЯчейкиВСтроке Тогда
Прервать;
КонецЕсли;
ВерхПоиска = ВерхПоиска + 1;
Если ВерхПоиска > Бюджет.ВысотаТаблицы Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ИначеЕсли Не ТекущаяОбласть.СодержитЗначение = Истина Тогда
ОбластьСнизуСлева = Бюджет.Область(ТекущаяОбласть.Верх + 1, ТекущаяОбласть.Лево - 1);
Если ОбластьСнизуСлева.СодержитЗначение Тогда
ЛевоПоиска = ОбластьСнизуСлева.Лево;
Пока ЛевоПоиска >= 2 Цикл
Область = Бюджет.Область(ОбластьСнизуСлева.Верх, ЛевоПоиска);
Если Не Область.СодержитЗначение Тогда
Прервать;
КонецЕсли;
ОбластьСлеваСнизу = Область;
ЛевоПоиска = ЛевоПоиска - 1;
КонецЦикла;
Элементы.Бюджет.ТекущаяОбласть = ОбластьСлеваСнизу;
Иначе
ЛевоПоиска = ТекущаяОбласть.Лево + 1;
ЕстьКолонкиДляВвода = Ложь;
Пока ЛевоПоиска <= Бюджет.ШиринаТаблицы Цикл
ОбластьСправа = Бюджет.Область(ТекущаяОбласть.Верх, ЛевоПоиска);
Если ОбластьСправа.СодержитЗначение Тогда
ЕстьКолонкиДляВвода = Истина;
Прервать;
КонецЕсли;
ЛевоПоиска = ЛевоПоиска + 1;
КонецЦикла;
Если ЕстьКолонкиДляВвода Тогда
ОбластьВвода = ОбластьСправа;
ВерхПоиска = ОбластьСправа.Верх;
Пока Истина Цикл
ОбластьСверху = Бюджет.Область(ВерхПоиска, ЛевоПоиска);
Если Не ОбластьСверху.СодержитЗначение Тогда
Прервать;
Иначе
ОбластьВвода = ОбластьСверху;
КонецЕсли;
ВерхПоиска = ВерхПоиска - 1;
КонецЦикла;
Элементы.Бюджет.ТекущаяОбласть = ОбластьВвода;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЯчейкаПослеВвода = Ложь;
ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВидБюджетаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ИспользоватьДляВводаПлана = Неопределено;
ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЭкземплярБюджета.ФормаДокумента.Элемент.ВидБюджета.ОбработкаВыбора");
Если Не ВидБюджетаОбработкаВыбораНаСервере(ВыбранноеЗначение, ИспользоватьДляВводаПлана) Тогда
ВыбранноеЗначение = Неопределено;
СтандартнаяОбработка = Ложь;
ТекстПредупреждения = НСтр("ru = 'Вид бюджета не доступен для выбора в экземпляре бюджета:
|%1'");
Если ИспользоватьДляВводаПлана Тогда
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстПредупреждения,
НСтр("ru = 'Обнаружены ошибки'"));
Иначе
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстПредупреждения,
НСтр("ru = 'Установите флаг ""Использовать для ввода плана""'"));
КонецЕсли;
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
ОрганизацияПриИзмененииНаСервере();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура ПодразделениеПриИзменении(Элемент)
ПодразделениеПриИзмененииНаСервере();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура ГраницаФактДанныхНажатие(Элемент)
ПараметрыФормы = Новый Структура("ВидБюджета, НачалоПериода, ГраницаФактДанных", Объект.ВидБюджета, Объект.НачалоПериода, Объект.ГраницаФактДанных);
ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьГраницуФакта", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.НастройкаГраницыФакта", ПараметрыФормы,,,,,
ОписаниеОповещения,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоЭлементовБюджета
&НаКлиенте
Процедура ДеревоЭлементовБюджетаПриАктивизацииСтроки(Элемент)
ПодключитьОбработчикОжидания("ОбработкаАктивацииСтрокиДереваЭлементов", 0.1, Истина);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРедактированияБюджета
&НаКлиенте
Процедура СписокРедактированияБюджетаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ИзмененияВСпискеОтраженыВДокументе = Ложь;
Если НоваяСтрока Тогда
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
ФиксированныеЗначения = ПараметрыРедактирования.ФиксированныеЗначения;
Для Каждого КлючИЗначение Из ФиксированныеЗначения Цикл
Элемент.ТекущиеДанные[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
КонецЦикла;
Для Каждого ИмяКолонки Из ПараметрыРедактирования.ИзменяемыеИзмерения Цикл
Если СтрНайти(ИмяКолонки, "Период") Тогда
Если ЗначениеЗаполнено(Элемент.ТекущиеДанные[ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
ПериодичностьСтрокой = СтрЗаменить(ИмяКолонки, "Период", "");
Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность." + ПериодичностьСтрокой);
Элемент.ТекущиеДанные[ИмяКолонки] = БюджетированиеКлиентСервер.ДатаНачалаПериода(Объект.НачалоПериода, Периодичность);
КонецЕсли;
КонецЦикла;
Иначе
ИзменяемыеКолонки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(РедактируемыеКолонкиСписка);
Расшифровка = Новый Структура();
Для Каждого Измерение Из ИзменяемыеКолонки Цикл
Расшифровка.Вставить(Измерение, Элемент.ТекущиеДанные[Измерение]);
КонецЦикла;
ПоместитьВоВременноеХранилище(Расшифровка, АдресРедактируемыхЗначенийСтрокиСписка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ВыполнитьПроверкиПередОкончаниемРедактирования(Элемент, Отказ, СтрокаБудетУдаленаАвтоматически)
РезультатПроверки = Неопределено;
ЕстьОшибки = ЕстьОшибкиВСтрокеРедактированияБюджета(Элемент.ТекущаяСтрока, РезультатПроверки);
Если ЕстьОшибки Тогда
Если Не СтрокаБудетУдаленаАвтоматически Тогда
Отказ = Истина;
Если РезультатПроверки.Результат = "ПослеВводаЗначенияБудетДубль" Тогда
ДопПараметры = Новый Структура("Идентификатор", Элемент.ТекущаяСтрока);
ОповещениеОРешении = Новый ОписаниеОповещения("ВыборУвеличенияСтроки", ЭтотОбъект, ДопПараметры);
ТекстВопроса = НСтр("ru = 'Строка с такими полями уже существует. Объединить строки?
|Да - объединить строки
|Нет - удалить строку
|Отмена - продолжить редактирование'");
ПоказатьВопрос(ОповещениеОРешении, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
ОткрытДиалогВопросаДубли = Истина;
ИначеЕсли РезультатПроверки.Результат = "ЕстьНедоступныеДляВводаЭлемента" Тогда
КолонкаСОшибкой = РезультатПроверки.КолонкаСОшибкой;
ШаблонСообщения = НСтр("ru = 'Значение не может быть выбрано в колонке ""%1""'");
ЭлементПоКолонке = Элементы[КолонкаСОшибкой];
ЗаголовокКолонки = ЭлементПоКолонке.Заголовок;
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ЗаголовокКолонки);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(Элемент.ТекущаяСтрока);
ИндексСтроки = СписокРедактированияБюджета.Индекс(РедактируемаяСтрока);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("СписокРедактированияБюджета", ИндексСтроки + 1, КолонкаСОшибкой);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, Объект.Ссылка, Поле, "Объект");
ИначеЕсли РезультатПроверки.Результат = "ОтличаетсяВалютаАналитики" Тогда
ШаблонСообщения = НСтр("ru = 'По строке валюта ввода ""%1"" определена аналитикой. Ввод в другой валюте не допускается'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, РезультатПроверки.ДопустимаяВалюта);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(Элемент.ТекущаяСтрока);
ИндексСтроки = СписокРедактированияБюджета.Индекс(РедактируемаяСтрока);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("СписокРедактированияБюджета", ИндексСтроки + 1, КолонкаСОшибкой);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, Объект.Ссылка, Поле, "Объект");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат РезультатПроверки;
КонецФункции
&НаКлиенте
Процедура СписокРедактированияБюджетаПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
Если ПринудительноеЗавершение = Истина Тогда
ПринудительноеЗавершение = Ложь;
Возврат;
КонецЕсли;
Если ОткрытДиалогВопросаДубли = Истина Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
СтрокаБудетУдаленаАвтоматически = НоваяСтрока И ОтменаРедактирования;
МассивРедактируемых = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(РедактируемыеКолонкиСписка);
Для Каждого Измерение Из МассивРедактируемых Цикл
Если Не ЗначениеЗаполнено(Элемент.ТекущиеДанные[Измерение]) Тогда
Элемент.ТекущиеДанные[Измерение] = Неопределено;
КонецЕсли;
КонецЦикла;
РезультатПроверки = ВыполнитьПроверкиПередОкончаниемРедактирования(Элемент, Отказ, СтрокаБудетУдаленаАвтоматически);
Если РезультатПроверки.Результат <> "ПослеВводаЗначенияБудетДубль" Тогда
Если СтрокаБудетУдаленаАвтоматически Тогда
УдалитьСвязанныеСтрокиБюджетаНаСервере(Элемент.ТекущаяСтрока);
ИначеЕсли Не Отказ И Не НоваяСтрока Тогда
ОчиститьДанныеИзменыемыхКолонок(Элемент.ТекущаяСтрока);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокРедактированияБюджетаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
СтрокаБудетУдаленаАвтоматически = НоваяСтрока И ОтменаРедактирования;
Если Не СтрокаБудетУдаленаАвтоматически Тогда
Если Не ИзмененияВСпискеОтраженыВДокументе = Истина Тогда
ЕстьИзмененияВСвязанныхЯчейках = Ложь;
ОтразитьИзмененияВДанных(Элементы.СписокРедактированияБюджета.ТекущаяСтрока,, ЕстьИзмененияВСвязанныхЯчейках);
ЗапуститьОтражениеИзмененияБюджета(ЕстьИзмененияВСвязанныхЯчейках);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СписокРедактированияБюджетаОсновнаяКолонкаПриИзменении(Элемент)
РезультатПроверки = Неопределено;
Модифицированность = Истина;
ИмяКолонки = Элементы.СписокРедактированияБюджета.ТекущийЭлемент.Имя;
Если СтрНайти(РедактируемыеКолонкиСписка, ИмяКолонки) Тогда
ТекущиеДанные = Элементы.СписокРедактированияБюджета.ТекущиеДанные;
Если СтрНайти(ИмяКолонки, "Период") Тогда
ТекущиеДанные = Элементы.СписокРедактированияБюджета.ТекущиеДанные;
ПериодичностьСтрокой = СтрЗаменить(ИмяКолонки, "Период", "");
Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность." + ПериодичностьСтрокой);
Если ТекущиеДанные[ИмяКолонки] < Объект.НачалоПериода Тогда
ТекущиеДанные[ИмяКолонки] = Макс(ТекущиеДанные[ИмяКолонки], Объект.НачалоПериода);
ИначеЕсли ТекущиеДанные[ИмяКолонки] > Объект.ОкончаниеПериода Тогда
ТекущиеДанные[ИмяКолонки] = Мин(ТекущиеДанные[ИмяКолонки], Объект.ОкончаниеПериода);
КонецЕсли;
ТекущиеДанные[ИмяКолонки] = БюджетированиеКлиентСервер.ДатаНачалаПериода(ТекущиеДанные[ИмяКолонки], Периодичность);
КонецЕсли;
Иначе
ТекущаяСтрока = Элементы.СписокРедактированияБюджета.ТекущаяСтрока;
Если ЕстьОшибкиВСтрокеРедактированияБюджета(ТекущаяСтрока, РезультатПроверки) Тогда
Если РезультатПроверки.Результат = "ПослеВводаЗначенияБудетДубль" Тогда
ДопПараметры = Новый Структура("ИмяКолонки, Идентификатор", ИмяКолонки, ТекущаяСтрока);
ОповещениеОРешении = Новый ОписаниеОповещения("ВыборУвеличенияСтроки", ЭтотОбъект, ДопПараметры);
ТекстВопроса = НСтр("ru = 'Строка с такими полями уже существует. Объединить строки?
|Да - объединить строки
|Нет - удалить строку
|Отмена - продолжить редактирование'");
ПоказатьВопрос(ОповещениеОРешении, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
ОткрытДиалогВопросаДубли = Истина;
КонецЕсли;
Возврат;
КонецЕсли;
ЕстьИзмененияВСвязанныхЯчейках = Ложь;
Если Не Объект.ОборотыПоСтатьямБюджетов.Количество() Тогда
ИзмененияВСпискеОтраженыВДокументе = Истина;
ОтразитьИзмененияВДанных(Элементы.СписокРедактированияБюджета.ТекущаяСтрока,,
ЕстьИзмененияВСвязанныхЯчейках);
Иначе
ОтразитьИзмененияВДанных(Элементы.СписокРедактированияБюджета.ТекущаяСтрока,
ИмяКолонки,
ЕстьИзмененияВСвязанныхЯчейках);
КонецЕсли;
ЗапуститьОтражениеИзмененияБюджета(ЕстьИзмененияВСвязанныхЯчейках);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокРедактированияБюджетаПриАктивизацииЯчейки(Элемент)
Если Элементы.ПанельБюджет.ТекущаяСтраница <> Элементы.Список Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.СписокРедактированияБюджета.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ПримечаниеКЗначению = "";
Элементы.СписокРедактированияГруппаПримечание.ТекущаяСтраница = Элементы.ВводПримечанияНедоступен;
Возврат;
КонецЕсли;
ТекущийЭлементСписка = Элементы.СписокРедактированияБюджета.ТекущийЭлемент;
ИмяКолонки = ТекущийЭлементСписка.Имя;
МожноВводитьПримечание = Не СтрНайти(РедактируемыеКолонкиСписка, ИмяКолонки) И Не ТекущийЭлементСписка.ТолькоПросмотр;
Если МожноВводитьПримечание Тогда
ПримечаниеКЗначению = ТекущиеДанные[ИмяКолонки + "Примечание"];
Элементы.СписокРедактированияГруппаПримечание.ТекущаяСтраница = Элементы.МожноВводитьПримечание;
Иначе
ПримечаниеКЗначению = "";
Элементы.СписокРедактированияГруппаПримечание.ТекущаяСтраница = Элементы.ВводПримечанияНедоступен;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокРедактированияБюджетаПередУдалением(Элемент, Отказ)
УдалитьСвязанныеСтрокиБюджетаНаСервере(Элемент.ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура ПереместитьВверх(Команда)
ПереместитьНаСервере(-1);
КонецПроцедуры
&НаКлиенте
Процедура ПереместитьВниз(Команда)
ПереместитьНаСервере(1);
КонецПроцедуры
&НаКлиенте
Процедура УпорядочитьПоВозрастанию(Команда)
УпорядочитьНаСервере(Элементы.СписокРедактированияБюджета.ТекущийЭлемент.Имя, "ВОЗР");
КонецПроцедуры
&НаКлиенте
Процедура УпорядочитьПоУбыванию(Команда)
УпорядочитьНаСервере(Элементы.СписокРедактированияБюджета.ТекущийЭлемент.Имя, "УБЫВ");
КонецПроцедуры
&НаКлиенте
Процедура ПримечаниеКЗначениюПриИзменении(Элемент)
ИмяКолонки = Элементы.СписокРедактированияБюджета.ТекущийЭлемент.Имя;
ТекущиеДанные = Элементы.СписокРедактированияБюджета.ТекущиеДанные;
ТекущиеДанные[ИмяКолонки + "Примечание"] = ПримечаниеКЗначению;
ЕстьИзмененияВСвязанныхЯчейках = Ложь;
ОтразитьИзмененияВДанных(Элементы.СписокРедактированияБюджета.ТекущаяСтрока,
ИмяКолонки,
ЕстьИзмененияВСвязанныхЯчейках);
ЗапуститьОтражениеИзмененияБюджета(ЕстьИзмененияВСвязанныхЯчейках);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыКорректировкиПоСтатьямБюджетов
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовПриИзменении(Элемент)
РассчитатьИтоговыеСуммыКорректировки(ЭтотОбъект);
УстановитьВидимостьКолонокПоКорректировкам(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Если Не ЗначениеЗаполнено(Объект.ВидБюджета) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не указан вид бюджета.'"), , "ВидБюджета", "Объект", Отказ);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
Элемент.ТекущиеДанные.Валюта = ВалютаСценария;
КонецЕсли;
Если ЗначениеЗаполнено(Элемент.ТекущиеДанные.СтатьяБюджетов) Тогда
РеквизитыСтатьи = КэшПараметровСтатей.Получить(Элемент.ТекущиеДанные.СтатьяБюджетов);
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для Счетчик = 1 По МаксимальноеКоличествоАналитик Цикл
МассивПараметровВыбора = Новый Массив;
Если ЗначениеЗаполнено(Элемент.ТекущиеДанные["ВидАналитики"+Счетчик]) Тогда
ВидАналитикиОписаниеТипов = РеквизитыСтатьи["ВидАналитики"+Счетчик+"ТипЗначения"];
Элементы["КорректировкиПоСтатьямБюджетовАналитика"+Счетчик].ОграничениеТипа = ВидАналитикиОписаниеТипов;
Если ВидАналитикиОписаниеТипов.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда
МассивПараметровВыбора.Добавить(Новый ПараметрВыбора("Отбор.Владелец",
РеквизитыСтатьи["ВидАналитики" + Счетчик + "ДополнительноеСвойство"]));
КонецЕсли;
КонецЕсли;
Элементы["КорректировкиПоСтатьямБюджетовАналитика"
+ Счетчик].ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметровВыбора);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовСтатьяБюджетовПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ОбработатьСтрокуКорректировкиПоАналитикеСтатьиБюджетов(ТекущаяСтрока);
Если Не ТекущаяСтрока.УчитыватьПоВалюте Тогда
ТекущаяСтрока.СуммаВВалютеУменьшение = 0;
ТекущаяСтрока.СуммаВВалютеУвеличение = 0;
КонецЕсли;
Если Не ТекущаяСтрока.УчитыватьПоКоличеству Тогда
ТекущаяСтрока.КоличествоУменьшение = 0;
ТекущаяСтрока.КоличествоУвеличение = 0;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовПериодПланированияПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
Если ТекущаяСтрока.ПериодПланирования < Объект.НачалоПериода Тогда
ТекущаяСтрока.ПериодПланирования = Объект.НачалоПериода;
ИначеЕсли ТекущаяСтрока.ПериодПланирования > Объект.ОкончаниеПериода Тогда
ТекущаяСтрока.ПериодПланирования = Объект.ОкончаниеПериода;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовСуммаУвеличениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.СуммаУменьшение = 0;
Если ТекущаяСтрока.Валюта <> ВалютаСценария Тогда
ПересчитатьСуммыВВалютеПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
Иначе
ТекущаяСтрока.СуммаВВалютеУвеличение = ТекущаяСтрока.СуммаУвеличение;
ТекущаяСтрока.СуммаВВалютеУменьшение = ТекущаяСтрока.СуммаУменьшение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовВалютаПриИзменении(Элемент)
ПересчитатьСуммыВВалютеПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовСуммаУменьшениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.СуммаУвеличение = 0;
Если ТекущаяСтрока.Валюта <> ВалютаСценария Тогда
ПересчитатьСуммыВВалютеПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
Иначе
ТекущаяСтрока.СуммаВВалютеУвеличение = ТекущаяСтрока.СуммаУвеличение;
ТекущаяСтрока.СуммаВВалютеУменьшение = ТекущаяСтрока.СуммаУменьшение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовСуммаВВалютеУвеличениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.СуммаВВалютеУменьшение = 0;
Если ТекущаяСтрока.Валюта <> ВалютаСценария Тогда
ПересчитатьСуммыПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
Иначе
ТекущаяСтрока.СуммаУвеличение = ТекущаяСтрока.СуммаВВалютеУвеличение;
ТекущаяСтрока.СуммаУменьшение = ТекущаяСтрока.СуммаВВалютеУменьшение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовСуммаВВалютеУменьшениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.СуммаВВалютеУвеличение = 0;
Если ТекущаяСтрока.Валюта <> ВалютаСценария Тогда
ПересчитатьСуммыПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
Иначе
ТекущаяСтрока.СуммаУвеличение = ТекущаяСтрока.СуммаВВалютеУвеличение;
ТекущаяСтрока.СуммаУменьшение = ТекущаяСтрока.СуммаВВалютеУменьшение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовКоличествоУвеличениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.КоличествоУменьшение = 0;
КонецПроцедуры
&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовКоличествоУменьшениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
ТекущаяСтрока.КоличествоУвеличение = 0;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект,
Элемент,
ПараметрыПеретаскивания,
СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект,
Элемент,
ПараметрыПеретаскивания,
СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьБюджетИнтерактивно(Команда)
ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЭкземплярБюджета.ФормаДокумента.Команда.ОбновитьБюджет",,
Истина);
СброситьКэшПараметров();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервал()
ПараметрПериода = Новый СтандартныйПериод;
ПараметрПериода.ДатаНачала = Объект.НачалоПериода;
ПараметрПериода.ДатаОкончания = Объект.ОкончаниеПериода;
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период = ПараметрПериода;
Диалог.Показать(Новый ОписаниеОповещения("РедактироватьПериодЗавершение", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПровестиДокумент(Команда)
ОбщегоНазначенияУТКлиент.Провести(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура РедактироватьСписком(Команда)
ИДГруппировки = Неопределено;
Если Элементы.РедактироватьСписком.Заголовок = НСтр("ru = 'Редактировать в списке'") Тогда
Расшифровка = Бюджет.Область(Бюджет.ТекущаяОбласть.Верх, 1).Расшифровка;
Если Расшифровка <> Неопределено Тогда
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Расшифровка, АдресДанныхРасшифровки);
КонецЕсли;
Если ТипЗнч(Расшифровка) = Тип("Структура")
И Расшифровка.Свойство("ИДГруппировки", ИДГруппировки) Тогда
НайденнаяСтрока = ФинансоваяОтчетностьКлиент.ПодчиненныйЭлементЭлементаФормы(ДеревоЭлементовБюджета,
"ИДГруппировки", ИДГруппировки);
Иначе
СтрокиДерева = ДеревоЭлементовБюджета.ПолучитьЭлементы();
Если СтрокиДерева.Количество() > 0 Тогда
НайденнаяСтрока = СтрокиДерева[0];
КонецЕсли;
КонецЕсли;
Иначе
ТекущаяСтрока = Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено Тогда
ТекущаяСтрока = 0;
КонецЕсли;
Если ТекущаяСтрока <> Неопределено Тогда
СтрокаЭлементовБюджета = ДеревоЭлементовБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
Если СтрокаЭлементовБюджета <> Неопределено Тогда
ОбластьБюджета = ОбластьБюджетаПоСтроке(Бюджет, АдресДанныхРасшифровки, СтрокаЭлементовБюджета.ИДГруппировки);
Если ОбластьБюджета <> Неопределено Тогда
Элементы.Бюджет.ТекущаяОбласть = Бюджет.Область(ОбластьБюджета, 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список;
КонецЕсли;
УстановитьСтраницу();
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
Если НайденнаяСтрока <> Неопределено Тогда
Родитель = НайденнаяСтрока.ПолучитьРодителя();
Если Родитель <> Неопределено И Не Элементы.ДеревоЭлементовБюджета.Развернут(Родитель.ПолучитьИдентификатор()) = Истина Тогда
Пока Родитель <> Неопределено Цикл
Элементы.ДеревоЭлементовБюджета.Развернуть(Родитель.ПолучитьИдентификатор());
Родитель = Родитель.ПолучитьРодителя();
КонецЦикла;
КонецЕсли;
Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор();
УстановитьПараметрыСпискаВвода();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
ИДТаблицы = Неопределено;
КолонкиПоИзмерениям = Неопределено;
#Если ВебКлиент Тогда
ТекстПредупреждения = НСтр("ru = 'Функциональность не поддерживается в веб-клиенте'");
ПоказатьПредупреждение(,ТекстПредупреждения);
Возврат;
#КонецЕсли
#Если МобильныйКлиент Тогда
ТекстПредупреждения = НСтр("ru = 'Функциональность не поддерживается в мобильном клиенте'");
ПоказатьПредупреждение(,ТекстПредупреждения);
Возврат;
#КонецЕсли
Если Объект.Ссылка.Пустая() Тогда
ТекстПредупреждения = НСтр("ru = 'Перед выгрузкой в эксель документ следует записать'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
КонецЕсли;
Если Не МожноВыгрузитьТекущуюТаблицу(Бюджет.ТекущаяОбласть.Верх, ИДТаблицы, КолонкиПоИзмерениям) Тогда
ТекстПредупреждения = НСтр("ru = 'Невозможно выгрузить текущую таблицу в однородный структурированный файл'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения(
"ВыгрузитьВExcelРасширениеПодключено",
ЭтотОбъект,
Новый Структура("ИДТаблицы, КолонкиПоИзмерениям", ИДТаблицы, КолонкиПоИзмерениям));
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
#Если ВебКлиент Тогда
ПоказатьПредупреждение(,НСтр("ru = 'Функциональность не поддерживается в веб-клиенте'"));
Возврат;
#КонецЕсли
#Если МобильныйКлиент Тогда
ТекстПредупреждения = НСтр("ru = 'Функциональность не поддерживается в мобильном клиенте'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
#КонецЕсли
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения(
"ЗагрузитьИзExcelРасширениеПодключено",
ЭтотОбъект);
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
ОбщегоНазначенияУТКлиент.Записать(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоДаннымБюджетирования(Команда)
ПроверитьВозможностьЗаполненияПоДаннымБюджетирования();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоДаннымБюджетированияЗавершение(Результат, ДополнительныеПараметры) Экспорт
Действие = Неопределено;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
Действие = ДополнительныеПараметры.Действие;
КонецЕсли;
ЗаполнитьПоДаннымБюджетированияСервер(Действие);
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЭлементовБюджета", 1, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РедактироватьПериодЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Объект.НачалоПериода = Результат.ДатаНачала;
Объект.ОкончаниеПериода = Результат.ДатаОкончания;
Объект.НачалоПериода = ?(Объект.НачалоПериода > Объект.ОкончаниеПериода, Объект.ОкончаниеПериода, Объект.НачалоПериода);
ПриИзмененииПериодаСервер();
ОбновитьБюджет();
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьМоделиБюджетирования()
КоличествоДействующихМоделей
= Справочники.МоделиБюджетирования.КоличествоДействующихМоделейБюджетирования();
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы,
"МодельБюджетирования",
"Видимость",
КоличествоДействующихМоделей <> 1 Или Не ЗначениеЗаполнено(Объект.МодельБюджетирования));
КонецПроцедуры
&НаСервере
Процедура ПроверитьДанныеПередЗаписью(ТекущийОбъект)
Если Не ЗначениеЗаполнено(ТекущийОбъект.ВидБюджета)
Или Не ЗначениеЗаполнено(ТекущийОбъект.Сценарий) Тогда
Возврат;
КонецЕсли;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
СформироватьОтчетСервер(Истина);
КонецЕсли;
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
БюджетированиеСервер.ПроверитьИсправитьТЧЭкземпляраБюджета(ТекущийОбъект, ОбъектИПараметрыРасчета, Бюджет, ДанныеРасшифровки);
КонецПроцедуры
&НаСервере
Процедура СброситьКэшПараметров()
СтруктураПараметрыВыводаВидаБюджета = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Если СтруктураПараметрыВыводаВидаБюджета <> Неопределено Тогда
СтруктураПараметрыВыводаВидаБюджета = БюджетнаяОтчетностьРасчетКэшаСервер.ПолучитьПараметрыВыводаВидаБюджета(
Объект.ВидБюджета, Перечисления.РежимыФормированияБюджетныхОтчетов.Документ);
КонецЕсли;
ПоместитьВоВременноеХранилище(СтруктураПараметрыВыводаВидаБюджета, ПараметрыВыводаВидаБюджета);
АдресТаблицыКурсов = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура Вставить(Команда)
ТекстСообщения = Неопределено;
Если Не ВставитьНаСервере(ТекстСообщения) Тогда
ПоказатьПредупреждение(,ТекстСообщения);
Возврат;
КонецЕсли;
Если АвтоматическоеОбновлениеБюджета Тогда
УстановитьНадписьОбновленияИтогов(Истина);
ЗапуститьПроверкуРасчетаИзменений();
Иначе
УстановитьНадписьОбновленияИтогов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Копировать(Команда)
КопироватьЯчейкиНаСервере();
Оповестить("КопированиеСтрокВБуферОбмена");
КонецПроцедуры
&НаКлиенте
Процедура Очистить(Команда)
ОчиститьЯчейкиНаСервере();
Если АвтоматическоеОбновлениеБюджета Тогда
УстановитьНадписьОбновленияИтогов(Истина);
ЗапуститьПроверкуРасчетаИзменений();
Иначе
УстановитьНадписьОбновленияИтогов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьПоПериодам(Команда)
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
ТекущаяСтрока = Элементы.СписокРедактированияБюджета.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
КонецЕсли;
КопированиеВыполнено = СкопироватьПоПериодамНаСервере();
Если Не КопированиеВыполнено Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Текущая область недоступна для копирования!'"));
КонецЕсли;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица Тогда
ЗапуститьПроверкуВыполненияОтчета();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьПоказательНажатие(Элемент)
Меню = МенюВидовПоказателей(Элементы.КомандыВидовПоказателей);
ПоказатьВыборИзМеню(Новый ОписаниеОповещения("ПослеВыбораПоказателя", ЭтотОбъект), Меню, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСумму(Команда)
РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьКоличество(Команда)
РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСреднее(Команда)
РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьМинимум(Команда)
РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьМаксимум(Команда)
РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьВсеПоказатели(Команда)
РазвернутьОбластьПоказателей = Не Элементы.РассчитатьВсеПоказатели.Пометка;
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей);
КонецПроцедуры
&НаКлиенте
Процедура СвернутьПоказатели(Команда)
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы);
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьСтатьиБюджета(Команда)
ПараметрыФормы = Новый Структура(БюджетированиеКлиентСервер.ИменаРеквизитовБюджета());
ЗаполнитьЗначенияСвойств(ПараметрыФормы, Объект);
ПараметрыФормы.Дата = ПараметрыФормы.Дата - 1;
ПараметрыФормы.Вставить("МассивСтатейБюджетов",
ОбщегоНазначенияУТКлиентСервер.ПреобразоватьСоответствиеИлиСтруктуруВМассив(КэшПараметровСтатей));
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодбораОборотовПоСтатьямБюджетов", ЭтотОбъект,
Новый Структура("КоличествоСтрокДоПодбора", КорректировкиПоСтатьямБюджетов.Количество()));
ОткрытьФорму("Документ.ЭкземплярБюджета.Форма.ФормаПодбораСтатейБюджетов", ПараметрыФормы, ЭтотОбъект,
УникальныйИдентификатор, , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьПоляШапкиДокумента()
БюджетыПоПодразделениям = ПолучитьФункциональнуюОпциюФормы("ФормироватьБюджетыПоПодразделениям");
БюджетыПоОрганизациям = ПолучитьФункциональнуюОпциюФормы("ФормироватьБюджетыПоОрганизациям");
ЕстьГраницаФакта = Справочники.ВидыБюджетов.ВидБюджетаИспользуетГраницуФактическихДанных(Объект.ВидБюджета);
НачатьСПравойКолонки = (Число(БюджетыПоОрганизациям Или БюджетыПоПодразделениям) + Число(ЕстьГраницаФакта)) % 2;
ЛеваяКолонка = Не НачатьСПравойКолонки;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыБюджетовАналитикиШапки.НомерСтроки КАК НомерСтроки,
| ВидыБюджетовАналитикиШапки.ВидАналитики,
| ВидыБюджетовАналитикиШапки.ВидАналитики.ТипЗначения КАК ТипЗначения,
| ВидыБюджетовАналитикиШапки.ВидАналитики.Наименование КАК Наименование,
| ВидыБюджетовАналитикиШапки.ВидАналитики.ДополнительноеСвойство КАК ДополнительноеСвойство
|ИЗ
| Справочник.ВидыБюджетов.АналитикиШапки КАК ВидыБюджетовАналитикиШапки
|ГДЕ
| ВидыБюджетовАналитикиШапки.Ссылка = &ВидБюджета";
Запрос.УстановитьПараметр("ВидБюджета", Объект.ВидБюджета);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СоответствиеЗависимыхТипов = ФинансоваяОтчетностьПовтИсп.СоответствиеОтборовПоВладельцу();
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для Сч = 1 По МаксимальноеКоличествоАналитик Цикл
Элемент = Элементы.Найти("ШапкаАналитика" + Сч);
Если Элемент <> Неопределено Тогда
Элементы.Удалить(Элемент);
КонецЕсли;
КонецЦикла;
МассивВышестоящих = Новый Массив;
СписокАналитикШапки.Очистить();
Пока Выборка.Следующий() Цикл
СписокАналитикШапки.Добавить(Выборка.ВидАналитики);
НомерАналитики = Выборка.НомерСтроки;
Если ЛеваяКолонка Тогда
НовыйЭлемент = Элементы.Добавить("ШапкаАналитика" + НомерАналитики, Тип("ПолеФормы"), Элементы.ГруппаШапкаЛево);
Иначе
НовыйЭлемент = Элементы.Добавить("ШапкаАналитика" + НомерАналитики, Тип("ПолеФормы"), Элементы.ГруппаШапкаПраво);
КонецЕсли;
НовыйЭлемент.ПутьКДанным = "Объект.Аналитика" + НомерАналитики;
НовыйЭлемент.Заголовок = Выборка.Наименование;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ОграничениеТипа = Выборка.ТипЗначения;
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииАналитикиШапки");
НовыйЭлемент.РастягиватьПоГоризонтали = Ложь;
НовыйЭлемент.Ширина = 28;
НовыйЭлемент.ПодсказкаВвода = БюджетнаяОтчетностьКлиентСервер.ПредставлениеПрочейАналитикиБюджетирования(
Выборка.ВидАналитики,
"Прочие");
ЛеваяКолонка = Не ЛеваяКолонка;
МассивСвязей = Новый Массив();
Для Каждого ВышестоящаяАналитика Из МассивВышестоящих Цикл
Для Каждого Тип Из Выборка.ТипЗначения.Типы() Цикл
ПараметрыВладельца = СоответствиеЗависимыхТипов[Тип];
Если ПараметрыВладельца = Неопределено Тогда
Продолжить;
КонецЕсли;
ВВышестоящихАналитикахЕстьВладелец = Ложь;
Для Каждого ПараметрВладельца Из ПараметрыВладельца Цикл
Если ВышестоящаяАналитика.Типы.Найти(ПараметрВладельца.Тип) <> Неопределено Тогда
ВВышестоящихАналитикахЕстьВладелец = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ВВышестоящихАналитикахЕстьВладелец Тогда
Продолжить;
КонецЕсли;
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор." + ПараметрВладельца.Реквизит, "Объект.Аналитика" + ВышестоящаяАналитика.НомерАналитики);
МассивСвязей.Добавить(НоваяСвязь);
КонецЦикла;
КонецЦикла;
НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
НовыйЭлемент.СвязиПараметровВыбора = НовыеСвязи;
Если Выборка.ТипЗначения.Типы().Найти(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) <> Неопределено Тогда
ПараметрВыбора = Новый ПараметрВыбора("Отбор.Владелец", Выборка.ДополнительноеСвойство);
Массив = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПараметрВыбора);
НовыйЭлемент.ПараметрыВыбора = Новый ФиксированныйМассив(Массив);
КонецЕсли;
МассивВышестоящих.Добавить(Новый Структура("НомерАналитики, Типы", НомерАналитики, Выборка.ТипЗначения.Типы()));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииАналитикиШапки(Элемент)
СброситьКэшПараметров();
ОбновитьБюджет();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьГраницуФакта(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.ГраницаФактДанных = Результат;
УстановитьГраницуФактаСервер();
ОбновитьБюджет();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция МодельБюджетированияДействует(Модель)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Модель, "Статус") =
Перечисления.СтатусыМоделейБюджетирования.Действует;
КонецФункции
&НаКлиенте
Процедура ОбработатьСтрокуКорректировкиПоАналитикеСтатьиБюджетов(СтрокаКорректировки)
РеквизитыСтатьи = КэшПараметровСтатей.Получить(СтрокаКорректировки.СтатьяБюджетов);
Если РеквизитыСтатьи <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СтрокаКорректировки, РеквизитыСтатьи);
Иначе
СтрокаКорректировки.УчитыватьПоВалюте = Ложь;
СтрокаКорректировки.УчитыватьПоКоличеству = Ложь;
КонецЕсли;
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
КоличествоАналитик = 0;
Для Счетчик = 1 По МаксимальноеКоличествоАналитик Цикл
МассивПараметровВыбора = Новый Массив;
Если РеквизитыСтатьи <> Неопределено И ЗначениеЗаполнено(РеквизитыСтатьи["ВидАналитики"+Счетчик]) Тогда
ВидАналитикиОписаниеТипов = РеквизитыСтатьи["ВидАналитики"+Счетчик+"ТипЗначения"];
Элементы["КорректировкиПоСтатьямБюджетовАналитика"+Счетчик].ОграничениеТипа = ВидАналитикиОписаниеТипов;
СтрокаКорректировки["Аналитика" + Счетчик] = ВидАналитикиОписаниеТипов.ПривестиЗначение(
СтрокаКорректировки["Аналитика"+ Счетчик]);
Если ВидАналитикиОписаниеТипов.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда
МассивПараметровВыбора.Добавить(Новый ПараметрВыбора("Отбор.Владелец", РеквизитыСтатьи["ВидАналитики"
+ Счетчик + "ДополнительноеСвойство"]));
КонецЕсли;
КоличествоАналитик = Счетчик;
Иначе
СтрокаКорректировки["ВидАналитики"+Счетчик] = Неопределено;
СтрокаКорректировки["Аналитика"+Счетчик] = Неопределено;
КонецЕсли;
Элементы["КорректировкиПоСтатьямБюджетовАналитика"
+ Счетчик].ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметровВыбора);
Если ЗначениеЗаполнено(СтрокаКорректировки["ВидАналитики" + Счетчик]) Тогда
СтрокаКорректировки["ПредставлениеПрочейАналитики"
+ Счетчик] = БюджетнаяОтчетностьКлиентСервер.ПредставлениеПрочейАналитикиБюджетирования(
РеквизитыСтатьи["ВидАналитики" + Счетчик], "Прочие");
Иначе
СтрокаКорректировки["ПредставлениеПрочейАналитики"+Счетчик] = "";
КонецЕсли;
КонецЦикла;
СтрокаКорректировки.КоличествоАналитик = КоличествоАналитик;
КонецПроцедуры
&НаКлиенте
Процедура ДействиеПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПроверитьВозможностьЗаполненияПоДаннымБюджетирования(ДополнительныеПараметры);
Иначе
Если КорректировкиПоСтатьямБюджетов.Количество() > 0 Тогда
Объект.Действие = ПредопределенноеЗначение(
"Перечисление.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета");
Иначе
Объект.Действие = ПредопределенноеЗначение(
"Перечисление.ТипыДействийЭкземпляровБюджетов.ВводЭкземпляраБюджета");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодбораОборотовПоСтатьямБюджетов(Результат, ДополнительныеПараметры) Экспорт
Если Не КорректировкиПоСтатьямБюджетов.Количество() Тогда
Возврат;
КонецЕсли;
Для Счетчик = ДополнительныеПараметры.КоличествоСтрокДоПодбора По КорректировкиПоСтатьямБюджетов.Количество()-1 Цикл
ОбработатьСтрокуКорректировкиПоАналитикеСтатьиБюджетов(КорректировкиПоСтатьямБюджетов[Счетчик]);
КонецЦикла;
РассчитатьИтоговыеСуммыКорректировки(ЭтотОбъект);
УстановитьВидимостьКолонокПоКорректировкам(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для Счетчик = 1 По МаксимальноеКоличествоАналитик Цикл
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы["КорректировкиПоСтатьямБюджетовАналитика"+Счетчик].Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.ВидАналитики"+Счетчик);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.Аналитика"+Счетчик);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("Текст",
Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.ПредставлениеПрочейАналитики" + Счетчик));
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы["КорректировкиПоСтатьямБюджетовАналитика"+Счетчик].Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.ВидАналитики"+Счетчик);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<не используется>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
КонецЦикла;
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорректировкиПоСтатьямБюджетовВалюта.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорректировкиПоСтатьямБюджетовСуммаВВалютеУвеличение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорректировкиПоСтатьямБюджетовСуммаВВалютеУменьшение.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.УчитыватьПоВалюте");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорректировкиПоСтатьямБюджетовКоличествоУвеличение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорректировкиПоСтатьямБюджетовКоличествоУменьшение.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорректировкиПоСтатьямБюджетов.УчитыватьПоКоличеству");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВозможностьЧтенияПрисоединенногоФайла(ПрисоединенныйФайл)
РеквизитыФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, "ТипСлужебногоФайла, Расширение");
Результат = Новый Структура("ЧтениеВозможно, ТекстОшибки", Истина, "");
Если ЗначениеЗаполнено(РеквизитыФайла.ТипСлужебногоФайла) Тогда
Результат.ЧтениеВозможно = Ложь;
Результат.ТекстОшибки = НСтр("ru = 'Файл является служебным, выбор запрещен.'");
ИначеЕсли НРЕГ(РеквизитыФайла.Расширение) <> "xls"
И НРЕГ(РеквизитыФайла.Расширение) <> "xlsx"
И НРЕГ(РеквизитыФайла.Расширение) <> "ods" Тогда
Результат.ЧтениеВозможно = Ложь;
Результат.ТекстОшибки = НСтр("ru = 'Файл не является файлом формата Excel или Open Office (ods), выбор запрещен.'");
КонецЕсли;
Возврат Результат;
КонецФункции
#Область ЗаполнениеБюджета
&НаСервере
Функция ПодготовитьПараметрыОтчета(Заполнение = Ложь, Расшифровка = Неопределено)
РежимФормирования = ?(Заполнение,
Перечисления.РежимыФормированияБюджетныхОтчетов.Заполнение,
Перечисления.РежимыФормированияБюджетныхОтчетов.Документ);
ПараметрыДанных = Документы.ЭкземплярБюджета.ПараметрыВыводаВидаБюджетаВТабличныйДокумент(Объект,
СписокАналитикШапки,
ВалютаСценария,
ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета),
РежимФормирования,
ПолучитьИзВременногоХранилища(АдресДанныхЯчеек));
Если ЗначениеЗаполнено(Расшифровка) Тогда
ПараметрыДанных.Вставить("Расшифровка", Расшифровка);
КонецЕсли;
ПараметрыДанных.Вставить("КэшПараметровСтатей", Новый Соответствие);
Возврат ПараметрыДанных;
КонецФункции
&НаКлиенте
Процедура ОбновитьБюджет(ПересчитатьСвязанные = Ложь)
ПродолжительностьПоследнегоРасчета = 0;
СформироватьОтчетСервер(Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список);
Если Элементы.ПанельБюджет.ТекущаяСтраница <> Элементы.Список Тогда
ЗапуститьПроверкуВыполненияОтчета();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВозможностьЗаполненияПоДаннымБюджетирования(ДополнительныеПараметры = Неопределено)
ПараметрыПроверки = РаботаСТабличнымиЧастямиКлиент.ПараметрыПроверкиЗаполнения();
ПараметрыПроверки.ТабличнаяЧасть = Объект.ОборотыПоСтатьямБюджетов;
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("МодельБюджетирования", НСтр("ru = 'Модель бюджетирования'"));
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("НачалоПериода", НСтр("ru = 'Начало периода'"));
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("ОкончаниеПериода", НСтр("ru = 'Окончание периода'"));
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("Сценарий", НСтр("ru = 'Сценарий'"));
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("ВидБюджета", НСтр("ru = 'Вид бюджета'"));
Если ПолучитьФункциональнуюОпциюФормы("ФормироватьБюджетыПоОрганизациям") Тогда
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("Организация", НСтр("ru = 'Организация'"));
КонецЕсли;
Если ПолучитьФункциональнуюОпциюФормы("ФормироватьБюджетыПоПодразделениям") Тогда
ПараметрыПроверки.ПроверяемыеРеквизиты.Вставить("Подразделение", НСтр("ru = 'Подразделение'"));
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ЗаполнитьПоДаннымБюджетированияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
РаботаСТабличнымиЧастямиКлиент.ПроверитьВозможностьЗаполнения(ЭтотОбъект, Оповещение, ПараметрыПроверки);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоДаннымБюджетированияСервер(Действие = Неопределено)
Документы.ЭкземплярБюджета.ЗаполнитьБюджетПоДаннымИнформационнойБазы(Объект);
СформироватьОтчетСервер(Истина, , Истина);
Если Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.ИсправлениеЭкземпляраБюджета Тогда
ПриИзмененииДействияСервер(Ложь);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОтразитьИзмененияБюджета(Режим = "", СтрокиОснования = Неопределено, Расшифровка = Неопределено,
ОбновленыДанныеЯчеек = Ложь)
Если Элементы.Бюджет.ОтображениеСостояния.Видимость Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
Возврат;
КонецЕсли;
ОбновитьДанныеЯчеек = Режим = "ОбновитьДанныеЯчеек";
Пересчет = Режим = "Пересчет";
ЕстьИзмененияКОтражению = Ложь;
ПараметрыОтчета = ПодготовитьПараметрыОтчета(,Расшифровка);
Если СтрокиОснования <> Неопределено Тогда
ПараметрыОтчета.Вставить("СтрокиОснования", СтрокиОснования);
КонецЕсли;
Если Не ОбновитьДанныеЯчеек Тогда
ПараметрыОтчета.Вставить("ТолькоРасчетные", Истина);
КонецЕсли;
Если Не КэшПараметровСтатей = Неопределено Тогда
ПараметрыОтчета.Вставить("КэшПараметровСтатей", КэшПараметровСтатей);
КонецЕсли;
Если Не ПустаяСтрока(СтрокаСортировкиДанныхЯчеек) Тогда
ПараметрыОтчета.Вставить("СтрокаСортировкиДанныхЯчеек", СтрокаСортировкиДанныхЯчеек);
КонецЕсли;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьНеВФоне = ФайловаяИБ ИЛИ ОбновитьДанныеЯчеек ИЛИ Пересчет;
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Подготовка бюджета'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"БюджетнаяОтчетностьВыводСервер.ПоместитьИзмененияЭкземпляраБюджетаВХранилище",
ПараметрыОтчета,
ПараметрыВыполнения);
ФоновоеЗаданиеПодготовкаБюджета = РезультатВыполнения;
ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
АдресХранилища = РезультатВыполнения.АдресРезультата;
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ИзмененияЭкземпляраБюджета = ПолучитьИзВременногоХранилища(АдресХранилища);
ЗагрузитьРезультатРасчетаИзменений(Режим, ИзмененияЭкземпляраБюджета);
ОбновленыДанныеЯчеек = Истина;
Иначе
ВыполняетсяЗаданиеРасчетаИзменений = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчетСервер(Непосредственно = Ложь, ПересчитатьСвязанные = Ложь, УчитыватьДополнительныйОтборПоИерархии = Ложь)
Если Не МожноОбновитьБюджет() Тогда
Возврат;
КонецЕсли;
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
ПараметрыОтчета = ПодготовитьПараметрыОтчета();
ПараметрыОтчета.УчитыватьДополнительныйОтборПоИерархии = УчитыватьДополнительныйОтборПоИерархии;
ИдентификаторЗадания = Неопределено;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьНеВФоне = Непосредственно Или ФайловаяИБ;
ПараметрыВыполнения.ЗапуститьВФоне = Не ПараметрыВыполнения.ЗапуститьНеВФоне;
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Подготовка бюджета'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"БюджетнаяОтчетностьВыводСервер.ПоместитьДанныеЭкземпляраБюджетаВХранилище",
ПараметрыОтчета,
ПараметрыВыполнения);
ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
АдресХранилища = РезультатВыполнения.АдресРезультата;
ФоновоеЗаданиеПодготовкаБюджета = РезультатВыполнения;
Если ПараметрыВыполнения.ЗапуститьНеВФоне Тогда
ДанныеЭкземпляраБюджета = ПолучитьИзВременногоХранилища(АдресХранилища);
ЗагрузитьПодготовленныеДанные(ДанныеЭкземпляраБюджета);
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
УстановитьПараметрыСпискаВводаНаСервере(Ложь);
ИначеЕсли ДанныеЭкземпляраБюджета.Свойство("ТребуетсяПересчетИтоговЯчеек")
И Не ПересчитатьСвязанные Тогда
СформироватьОтчетСервер(Истина, Истина);
КонецЕсли;
ИдентификаторЗадания = Неопределено;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Бюджет, "ФормированиеОтчета");
Элементы.Бюджет.ТолькоПросмотр = Истина;
КонецЕсли;
ВыполняетсяЗаданиеРасчетаИзменений = Ложь;
КонецПроцедуры
&НаСервере
Функция МожноОбновитьБюджет(ПроверкаСПредупреждениями = Истина)
Отказ = Ложь;
ТекстСообщения = Неопределено;
НезаполненныеПоля = Новый Массив;
Если Не ЗначениеЗаполнено(Объект.ВидБюджета) Тогда
НезаполненныеПоля.Добавить(НСтр("ru = 'Вид бюджета'"));
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Сценарий) Тогда
НезаполненныеПоля.Добавить(НСтр("ru = 'Сценарий'"));
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.НачалоПериода) Или Не ЗначениеЗаполнено(Объект.ОкончаниеПериода) Тогда
НезаполненныеПоля.Добавить(НСтр("ru = 'Период'"));
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
ПараметрыФО = Новый Структура("МодельБюджетирования", Объект.МодельБюджетирования);
ФормироватьБюджетыПоОрганизациям = ПолучитьФункциональнуюОпцию("ФормироватьБюджетыПоОрганизациям", ПараметрыФО);
Если ФормироватьБюджетыПоОрганизациям Тогда
НезаполненныеПоля.Добавить(НСтр("ru = 'Организация'"));
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Подразделение) Тогда
ПараметрыФО = Новый Структура("МодельБюджетирования", Объект.МодельБюджетирования);
ФормироватьБюджетыПоПодразделениям = ПолучитьФункциональнуюОпцию("ФормироватьБюджетыПоПодразделениям", ПараметрыФО);
Если ФормироватьБюджетыПоПодразделениям Тогда
НезаполненныеПоля.Добавить(НСтр("ru = 'Подразделение'"));
КонецЕсли;
КонецЕсли;
ОтображениеСостояния = Элементы.Бюджет.ОтображениеСостояния;
Если НезаполненныеПоля.Количество() > 0 Тогда
Если ПроверкаСПредупреждениями Тогда
Бюджет.Очистить();
ШаблонСообщенияСостояния = ?(НезаполненныеПоля.Количество() = 1,
НСтр("ru = 'Заполните поле %1'"), НСтр("ru = 'Заполните поля: %1'"));
ОтображениеСостояния.Видимость = Истина;
ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
ОтображениеСостояния.Картинка = Новый Картинка;
ОтображениеСостояния.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонСообщенияСостояния,
СтрСоединить(НезаполненныеПоля, ", "));
КонецЕсли;
Возврат Ложь;
Иначе
ПроверитьЗаполнитьТаблицуКурсов(Отказ, ТекстСообщения);
Если Отказ = Истина Тогда
Если ПроверкаСПредупреждениями Тогда
Бюджет.Очистить();
ОтображениеСостояния.Видимость = Истина;
ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
ОтображениеСостояния.Картинка = Новый Картинка;
ОтображениеСостояния.Текст = ТекстСообщения;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецЕсли;
ОтображениеСостояния.Видимость = Ложь;
Возврат Истина;
КонецФункции
#КонецОбласти
#Область ОбработчикиСобытийЭлементовСервер
&НаСервере
Процедура ПриИзмененииСценарияСервер()
УстановитьПараметрыСценария();
СброситьКэшПараметров();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииМоделиБюджетированияСервер()
ПараметрыОпций = Новый Структура("МодельБюджетирования", Объект.МодельБюджетирования);
УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыОпций);
ИспользоватьУтверждениеБюджетов = ПолучитьФункциональнуюОпциюФормы("ИспользоватьУтверждениеБюджетов");
МодельВидаБюджета = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидБюджета, "Владелец");
Если МодельВидаБюджета <> Объект.МодельБюджетирования Тогда
Объект.ВидБюджета = Неопределено;
КонецЕсли;
Измерения = Документы.ЭкземплярБюджета.ИзмеренияБюджетаПоУмолчанию(Объект.МодельБюджетирования, Объект.Ответственный);
Для Каждого Измерение Из Измерения Цикл
Если Не ЗначениеЗаполнено(Объект[Измерение.Ключ]) Тогда
Объект[Измерение.Ключ] = Измерение.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииВидаБюджетаСервер()
Объект.ОборотыПоСтатьямБюджетов.Очистить();
Объект.АналитикаСтатейБюджетов.Очистить();
КорректировкиПоСтатьямБюджетов.Очистить();
СтруктураПараметров = ПодготовитьПараметрыВыводаВидаБюджета();
КэшПараметровСтатей = БюджетированиеСервер.ЗаполнитьКэшПараметровСтатей(СтруктураПараметров);
Справочники.ВидыБюджетов.ВыровнятьДатыПоПериодичностиБюджета(Объект.ВидБюджета, Объект.НачалоПериода, Объект.ОкончаниеПериода);
Объект.ГраницаФактДанных = Справочники.ВидыБюджетов.ГраницаФактическихДанныхПоВидуБюджета(Объект.ВидБюджета, Объект.НачалоПериода);
Справочники.ВидыБюджетов.НастроитьГруппуЭлементовПериода(Объект.ВидБюджета, Элементы, Объект.ГраницаФактДанных);
УстановитьПоляШапкиДокумента();
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
БюджетированиеСервер.УдалитьСохраненныеМакетыБюджетов(Объект.Ссылка);
КонецЕсли;
ПриИзмененииСпособаРедактированияБюджета();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
УстановитьПараметрыВыбораСтатьиБюджетаДляКорректировкиОборотов();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПериодаСервер()
МассивКУдалению = Новый Массив;
Для Каждого СтрокаОборотов Из Объект.ОборотыПоСтатьямБюджетов Цикл
Если СтрокаОборотов.ПериодПланирования < Объект.НачалоПериода
ИЛИ СтрокаОборотов.ПериодПланирования > Объект.ОкончаниеПериода Тогда
МассивКУдалению.Добавить(СтрокаОборотов);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаМассива Из МассивКУдалению Цикл
Объект.ОборотыПоСтатьямБюджетов.Удалить(СтрокаМассива);
КонецЦикла;
Идентификаторы = Объект.ОборотыПоСтатьямБюджетов.Выгрузить(,"ИдентификаторСтроки");
Идентификаторы.Свернуть("ИдентификаторСтроки");
Идентификаторы.Индексы.Добавить("ИдентификаторСтроки");
МассивКУдалению = Новый Массив;
Для Каждого СтрокаАналитики Из Объект.АналитикаСтатейБюджетов Цикл
Если Идентификаторы.Найти(СтрокаАналитики.ИдентификаторСтроки) = Неопределено Тогда
МассивКУдалению.Добавить(СтрокаАналитики);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаМассива Из МассивКУдалению Цикл
Объект.АналитикаСтатейБюджетов.Удалить(СтрокаМассива);
КонецЦикла;
МассивКУдалению = Новый Массив;
Для Каждого СтрокаАналитики Из Объект.АналитикаЗначений Цикл
Если Идентификаторы.Найти(СтрокаАналитики.ИдентификаторСтроки) = Неопределено Тогда
МассивКУдалению.Добавить(СтрокаАналитики);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаМассива Из МассивКУдалению Цикл
Объект.АналитикаЗначений.Удалить(СтрокаМассива);
КонецЦикла;
МассивКУдалению = Новый Массив;
Для Каждого СтрокаКорректировки Из КорректировкиПоСтатьямБюджетов Цикл
Если СтрокаКорректировки.ПериодПланирования < Объект.НачалоПериода
Или СтрокаКорректировки.ПериодПланирования > Объект.ОкончаниеПериода Тогда
МассивКУдалению.Добавить(СтрокаКорректировки);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаМассива Из МассивКУдалению Цикл
КорректировкиПоСтатьямБюджетов.Удалить(СтрокаМассива);
КонецЦикла;
МодельДействует = Справочники.МоделиБюджетирования.МодельБюджетированияДействует(Объект.МодельБюджетирования);
Если Не МодельДействует Тогда
Объект.МодельБюджетирования = Справочники.МоделиБюджетирования.МодельБюджетированияПоУмолчанию();
ПриИзмененииМоделиБюджетированияСервер();
КонецЕсли;
УстановитьДоступностьМоделиБюджетирования();
Справочники.ВидыБюджетов.ВыровнятьДатыПоПериодичностиБюджета(Объект.ВидБюджета, Объект.НачалоПериода, Объект.ОкончаниеПериода);
Объект.ГраницаФактДанных = Справочники.ВидыБюджетов.ГраницаФактическихДанныхПоВидуБюджета(Объект.ВидБюджета, Объект.НачалоПериода);
Справочники.ВидыБюджетов.НастроитьГруппуЭлементовПериода(Объект.ВидБюджета, Элементы, Объект.ГраницаФактДанных);
СброситьКэшПараметров();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры
&НаСервере
Функция ВидБюджетаОбработкаВыбораНаСервере(ВыбранноеЗначение, ИспользоватьДляВводаПлана)
ИспользоватьДляВводаПлана = ВыбранноеЗначение.ИспользоватьДляВводаПлана;
Если Не ИспользоватьДляВводаПлана Тогда
Возврат Ложь;
КонецЕсли;
Если Не Справочники.ВидыБюджетов.ВидБюджетаЗаполненПравильно(ВыбранноеЗначение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
СброситьКэшПараметров();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры
&НаСервере
Процедура ПодразделениеПриИзмененииНаСервере()
СброситьКэшПараметров();
УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры
&НаСервере
Процедура ПереместитьНаСервере(Направление)
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ИДТекущейСтроки = Элементы.СписокРедактированияБюджета.ТекущаяСтрока;
ТекущаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ИДТекущейСтроки);
Индекс = СписокРедактированияБюджета.Индекс(ТекущаяСтрока);
Если Индекс + Направление < 0 ИЛИ
Индекс + Направление >= СписокРедактированияБюджета.Количество() Тогда
Возврат;
КонецЕсли;
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
СтрокаСмещения = СписокРедактированияБюджета[Индекс + Направление];
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если КлючИЗначение.Значение.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, ТекущаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
СтрокаДанныхПоТекущей = БюджетнаяОтчетностьКлиентСервер.НайтиСтрокуОборотаПоРасшифровке(ОбъектИПараметрыРасчета, Расшифровка);
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, СтрокаСмещения, ПараметрыРедактирования.ИзменяемыеИзмерения);
СтрокаДанныхПоПредыдущей = БюджетнаяОтчетностьКлиентСервер.НайтиСтрокуОборотаПоРасшифровке(ОбъектИПараметрыРасчета, Расшифровка);
Тмп = СтрокаДанныхПоТекущей.НомерПоПорядку;
СтрокаДанныхПоТекущей.НомерПоПорядку = СтрокаДанныхПоПредыдущей.НомерПоПорядку;
СтрокаДанныхПоПредыдущей.НомерПоПорядку = Тмп;
КонецЦикла;
СписокРедактированияБюджета.Сдвинуть(Индекс, Направление);
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
КонецПроцедуры
&НаСервере
Процедура УпорядочитьНаСервере(ИмяЭлемента, Порядок)
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
Для Каждого СтрокаСписка Из СписокРедактированияБюджета Цикл
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если КлючИЗначение.Значение.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, СтрокаСписка, ПараметрыРедактирования.ИзменяемыеИзмерения);
СтрокаДанных = БюджетнаяОтчетностьКлиентСервер.НайтиСтрокуОборотаПоРасшифровке(ОбъектИПараметрыРасчета, Расшифровка);
СтрокаДанных.НомерПоПорядку = 0;
КонецЦикла;
КонецЦикла;
НомерПоПорядку = БюджетнаяОтчетностьКлиентСервер.МаксимальныйНомерПоПорядку(Объект);
СписокРедактированияБюджета.Сортировать(ИмяЭлемента + " " + Порядок);
Для Каждого СтрокаСписка Из СписокРедактированияБюджета Цикл
НомерПоПорядку = НомерПоПорядку + 1;
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если КлючИЗначение.Значение.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, СтрокаСписка, ПараметрыРедактирования.ИзменяемыеИзмерения);
СтрокаДанных = БюджетнаяОтчетностьКлиентСервер.НайтиСтрокуОборотаПоРасшифровке(ОбъектИПараметрыРасчета, Расшифровка);
СтрокаДанных.НомерПоПорядку = НомерПоПорядку;
КонецЦикла;
КонецЦикла;
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
КонецПроцедуры
&НаСервере
Процедура СкопироватьПоПериодамПоРасшифровке(Расшифровка, Значение, ИсключаяПериоды = Неопределено)
СтруктураПараметровВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Периодичности = СтруктураПараметровВывода.СтруктураКолонокТаблицыДанных.Периодичности;
МинимальнаяПериодичность = БюджетнаяОтчетностьКлиентСервер.МинимальнаяПериодичность(Периодичности);
РабочаяРасшифровка = ОбщегоНазначения.СкопироватьРекурсивно(Расшифровка);
НачалоПериода = Неопределено;
Расшифровка.Свойство(ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(МинимальнаяПериодичность).Период, НачалоПериода);
Если НачалоПериода = Неопределено Тогда
Возврат;
КонецЕсли;
МассивПериодов = БюджетнаяОтчетностьВыводСервер.ПериодыБюджетногоОтчета(
НачалоПериода,
Объект.ОкончаниеПериода,
МинимальнаяПериодичность);
Для Каждого Период Из МассивПериодов Цикл
ИмяКолонки = ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(МинимальнаяПериодичность).Период;
Если Период = Расшифровка[ИмяКолонки]
ИЛИ (Не ИсключаяПериоды = Неопределено И Не ИсключаяПериоды.Найти(Период) = Неопределено) Тогда
Продолжить;
КонецЕсли;
Для Каждого Периодичность Из Периодичности Цикл
РабочаяРасшифровка.Вставить(ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(Периодичность).Период,
БюджетированиеКлиентСервер.ДатаНачалаПериода(Период, Периодичность));
КонецЦикла;
РезультатОтражения = ОтразитьИзменениеЯчейки(РабочаяРасшифровка, Значение);
РасшифровкаСвязанных = ОбщегоНазначения.СкопироватьРекурсивно(РабочаяРасшифровка);
РасшифровкаСвязанных.Удалить("ИндексСтрокиДанных");
РасшифровкаСвязанных.Удалить("Значение");
Для Каждого КлючИЗначение Из РасшифровкаСвязанных.ЗначенияАналитик Цикл
РасшифровкаСвязанных.Вставить(ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(КлючИЗначение.Ключ), КлючИЗначение.Значение);
КонецЦикла;
РасшифровкаСвязанных.Удалить("ЗначенияАналитик");
РасшифровкаСвязанных.Удалить("СокращенныеРазряды");
ПараметрыОтчета = БюджетнаяОтчетностьКлиентСервер.ПараметрыПериода(Объект);
ИзмененияЭкземпляраБюджета = БюджетнаяОтчетностьВыводСервер.РассчитатьСвязанныеСтатьиБюджетов(
СтруктураПараметровВывода,
АдресДанныхЯчеек,
ПараметрыОтчета,
РасшифровкаСвязанных,
РезультатОтражения);
ЗагрузитьРезультатРасчетаИзменений(, ИзмененияЭкземпляраБюджета);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СкопироватьПоПериодамНаСервере()
КопированиеВыполнено = Ложь;
Модифицированность = Истина;
ПараметрыВидаБюджета = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Периодичности = ПараметрыВидаБюджета.СтруктураКолонокТаблицыДанных.Периодичности;
МинимальнаяПериодичность = БюджетнаяОтчетностьКлиентСервер.МинимальнаяПериодичность(Периодичности);
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица Тогда
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
ИсключаяПериоды = Новый Массив();
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
ОбластьЗначения = Бюджет.Область(Строка, Колонка);
Если ОбластьЗначения.СодержитЗначение Тогда
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьЗначения.Расшифровка, АдресДанныхРасшифровки);
Период = Неопределено;
Расшифровка.Свойство(ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(
МинимальнаяПериодичность).Период, Период);
Если ИсключаяПериоды.Найти(Период) = Неопределено Тогда
ИсключаяПериоды.Добавить(Период);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
ОбластьЗначения = Бюджет.Область(Строка, Колонка);
Если ОбластьЗначения.СодержитЗначение Тогда
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьЗначения.Расшифровка, АдресДанныхРасшифровки);
Значение = ОбластьЗначения.Значение;
СокращенныеРазряды = 0;
Если Расшифровка.Свойство("СокращенныеРазряды", СокращенныеРазряды) Тогда
Значение = Значение * Pow(10, СокращенныеРазряды);
КонецЕсли;
СкопироватьПоПериодамПоРасшифровке(Расшифровка, Значение, ИсключаяПериоды);
КопированиеВыполнено = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СформироватьОтчетСервер();
Иначе
ИмяКолонки = Элементы.СписокРедактированияБюджета.ТекущийЭлемент.Имя;
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(Элементы.СписокРедактированияБюджета.ТекущаяСтрока);
Если Не ПараметрыРедактирования.СтруктураАналогРасшифровки.Свойство(ИмяКолонки) Тогда
Возврат КопированиеВыполнено;
КонецЕсли;
ЗначенияКолонок = ПараметрыРедактирования.СтруктураАналогРасшифровки[ИмяКолонки];
Расшифровка = РасшифровкаОтчетаПоСтроке(ЗначенияКолонок, РедактируемаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
Расшифровка.Вставить("Строка", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
СкопироватьПоПериодамПоРасшифровке(Расшифровка, РедактируемаяСтрока[ИмяКолонки]);
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
ЗагрузитьДанныеСписка(ПараметрыРедактирования.КолонкиПоИзмерениям,
ПараметрыРедактирования.ФиксированныеЗначения,
ПараметрыРедактирования.СтруктураАналогРасшифровки);
КопированиеВыполнено = Истина;
КонецЕсли;
Возврат КопированиеВыполнено;
КонецФункции
&НаСервере
Функция ВставитьНаСервере(ТекстПредупреждения)
БуферОбмена = ОбщегоНазначения.СтрокиИзБуфераОбмена();
Если БуферОбмена.Источник <> "ЯчейкиБюджета" Или Не ЗначениеЗаполнено(БуферОбмена.Данные) Тогда
ТекстПредупреждения = НСтр("ru = 'Нет данных для вставки'");
Возврат Ложь;
ИначеЕсли БуферОбмена.Данные.Количество() = 1 Тогда
Если БуферОбмена.Данные[0].Количество() = 1 Тогда
ЕдиничноеЗначение = Истина;
Значение = БуферОбмена.Данные[0][0];
Иначе
ТекстПредупреждения = НСтр("ru = 'В данных для вставки нечисловое значение'");
Возврат Ложь;
КонецЕсли;
Иначе
ЕдиничноеЗначение = Ложь;
Значение = БуферОбмена.Данные;
КонецЕсли;
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураОбъектаДляРасчетаЯчейки();
ПараметрыРасчета.ВалютаСценария = ВалютаСценария;
ПараметрыРасчета.КэшПараметровСтатей = КэшПараметровСтатей;
ПараметрыРасчета.ТребоватьУказанияКурсовДляКаждогоПериода = ТребоватьУказанияКурсовДляКаждогоПериода;
ПараметрыРасчета.АдресТаблицыКурсов = АдресТаблицыКурсов;
ПараметрыРасчета.ПараметрыВыводаВидаБюджета = ПараметрыВыводаВидаБюджета;
ПараметрыРасчета.Вставить("ПараметрыОтчета", БюджетнаяОтчетностьКлиентСервер.ПараметрыПериода(Объект));
ПараметрыРасчета.Вставить("ПараметрыВыводаВидаБюджета", ПараметрыВыводаВидаБюджета);
ПараметрыРасчета.Вставить("АдресДанныхЯчеек", АдресДанныхЯчеек);
ПараметрыРасчета.Вставить("АдресХранилища", АдресХранилища);
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
Если ЕдиничноеЗначение Тогда
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
ОбластьЗначения = Бюджет.Область(Строка, Колонка);
Если ОбластьЗначения.СодержитЗначение Тогда
ОбластьЗначения.Значение = Значение;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьЗначения.Расшифровка, АдресДанныхРасшифровки);
РезультатОтражения = БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, ОбластьЗначения.Значение);
ПараметрыРасчета.Вставить("ИмяОбласти", ОбластьЗначения.Имя);
ПараметрыРасчета.Вставить("РезультатОтражения", РезультатОтражения);
ПараметрыРасчета.Вставить("Расшифровка", Расшифровка);
Если АвтоматическоеОбновлениеБюджета Тогда
БюджетПриИзмененииСерверАвтоПересчет(ПараметрыРасчета);
Иначе
СтруктураРезультат = БюджетПриИзмененииСервер(ПараметрыРасчета);
Если СтруктураРезультат <> Неопределено Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, СтруктураРезультат);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
ЛевыйУгол = АктивнаяОбласть.Лево;
ВерхнийУгол = АктивнаяОбласть.Верх;
Для Строка = 0 По Значение.ВГраница() Цикл
Для Колонка = 0 По Значение[0].ВГраница() Цикл
ОбластьЗначения = Бюджет.Область(ВерхнийУгол + Строка, ЛевыйУгол + Колонка);
Если ОбластьЗначения.СодержитЗначение Тогда
ОбластьЗначения.Значение = Значение[Строка][Колонка];
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьЗначения.Расшифровка, АдресДанныхРасшифровки);
РезультатОтражения = БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, ОбластьЗначения.Значение);
ПараметрыРасчета.Вставить("ИмяОбласти", ОбластьЗначения.Имя);
ПараметрыРасчета.Вставить("РезультатОтражения", РезультатОтражения);
ПараметрыРасчета.Вставить("Расшифровка", Расшифровка);
Если АвтоматическоеОбновлениеБюджета Тогда
БюджетПриИзмененииСерверАвтоПересчет(ПараметрыРасчета);
Иначе
СтруктураРезультат = БюджетПриИзмененииСервер(ПараметрыРасчета);
Если СтруктураРезультат <> Неопределено Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, СтруктураРезультат);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат Истина;
КонецФункции
&НаСервере
Процедура КопироватьЯчейкиНаСервере()
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
МассивСтрок = Новый Массив;
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
МассивКолонок = Новый Массив;
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
ОбластьЗначения = Бюджет.Область(Строка, Колонка);
Значение = Неопределено;
Если ОбластьЗначения.СодержитЗначение Тогда
Значение = ОбластьЗначения.Значение;
Иначе
Если Не ПустаяСтрока(ОбластьЗначения.Текст) Тогда
Попытка
Значение = Число(ОбластьЗначения.Текст);
Исключение
Значение = Неопределено;
КонецПопытки;
КонецЕсли;
КонецЕсли;
МассивКолонок.Добавить(Значение);
КонецЦикла;
МассивСтрок.Добавить(МассивКолонок);
КонецЦикла;
ОбщегоНазначения.СкопироватьВБуферОбмена(МассивСтрок, "ЯчейкиБюджета");
КонецПроцедуры
&НаСервере
Процедура ОчиститьЯчейкиНаСервере()
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
ОбластьЗначения = Бюджет.Область(Строка, Колонка);
Если ОбластьЗначения.СодержитЗначение Тогда
ОбластьЗначения.Значение = Неопределено;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьЗначения.Расшифровка, АдресДанныхРасшифровки);
РезультатОтражения = ОтразитьИзменениеЯчейки(Расшифровка, ОбластьЗначения.Значение);
ПараметрыОтчета = БюджетнаяОтчетностьКлиентСервер.ПараметрыПериода(Объект);
ИзмененияЭкземпляраБюджета = БюджетнаяОтчетностьВыводСервер.РассчитатьСвязанныеСтатьиБюджетов(
ПараметрыВыводаВидаБюджета,
АдресДанныхЯчеек,
ПараметрыОтчета,
ОбластьЗначения.Имя,
РезультатОтражения);
ЗагрузитьРезультатРасчетаИзменений(, ИзмененияЭкземпляраБюджета);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ОтразитьИзмененияБюджета();
КонецПроцедуры
&НаСервере
Процедура УстановитьГраницуФактаСервер()
Справочники.ВидыБюджетов.НастроитьГруппуЭлементовПериода(Объект.ВидБюджета, Элементы, Объект.ГраницаФактДанных);
СброситьКэшПараметров();
КонецПроцедуры
&НаСервере
Процедура ПересчитатьНаСервере()
СтрокиОснования = Неопределено;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
Если ПараметрыРедактирования = Неопределено Тогда
Возврат;
КонецЕсли;
СтрокиОснования = ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования;
Если Не АвтоматическоеОбновлениеБюджета Тогда
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек");
КонецЕсли;
КонецЕсли;
ПараметрыОтчета = ПодготовитьПараметрыОтчета();
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
Если ДанныеЯчеек <> Неопределено Тогда
ИзмененияЭкземпляраБюджета = БюджетнаяОтчетностьВыводСервер.РассчитатьСвязанныеСтатьиБюджетов(
ПараметрыВыводаВидаБюджета,
ДанныеЯчеек,
ПараметрыОтчета,
Неопределено,
Неопределено,
Истина);
ЗагрузитьРезультатРасчетаИзменений(, ИзмененияЭкземпляраБюджета);
ПараметрыОтчета = ПодготовитьПараметрыОтчета();
КонецЕсли;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица Тогда
ОтразитьИзмененияБюджета("Пересчет", СтрокиОснования);
Иначе
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", СтрокиОснования);
ЗагрузитьДанныеСписка(ПараметрыРедактирования.КолонкиПоИзмерениям,
ПараметрыРедактирования.ФиксированныеЗначения,
ПараметрыРедактирования.СтруктураАналогРасшифровки,
Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("Вставить");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность",
Не ОбщегоНазначения.ПустойБуферОбмена("ЯчейкиБюджета"));
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандБуфераОбменаНаКлиенте()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("Копировать");
МассивЭлементов.Добавить("Вставить");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность", Истина);
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииДействияСервер(ЗаполнитьБюджет = Истина)
Если Объект.Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета Тогда
ЗаполнитьТаблицуКорректировкиПоСтатьямБюджетов();
РассчитатьИтоговыеСуммыКорректировки(ЭтотОбъект);
УстановитьВидимостьКолонокПоКорректировкам(ЭтотОбъект);
Иначе
КорректировкиПоСтатьямБюджетов.Очистить();
КонецЕсли;
ПриИзмененииСпособаРедактированияБюджета(ЗаполнитьБюджет);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеСуммыКорректировки(Форма)
Форма.ИтогоСуммаУвеличения = Форма.КорректировкиПоСтатьямБюджетов.Итог("СуммаУвеличение");
Форма.ИтогоСуммаУменьшения = Форма.КорректировкиПоСтатьямБюджетов.Итог("СуммаУменьшение");
Форма.ИтогоСуммаКорректировки = Форма.ИтогоСуммаУвеличения - Форма.ИтогоСуммаУменьшения;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьКолонокПоКорректировкам(Форма)
УчитыватьПоВалюте = Форма.КорректировкиПоСтатьямБюджетов.НайтиСтроки(Новый Структура("УчитыватьПоВалюте",
Истина)).Количество() > 0;
УчитыватьПоКоличеству = Форма.КорректировкиПоСтатьямБюджетов.НайтиСтроки(Новый Структура("УчитыватьПоКоличеству",
Истина)).Количество() > 0;
Форма.Элементы.КорректировкиПоСтатьямБюджетовВалюта.Видимость = УчитыватьПоВалюте;
Форма.Элементы.КорректировкиПоСтатьямБюджетовСуммаВВалюте.Видимость = УчитыватьПоВалюте;
Форма.Элементы.КорректировкиПоСтатьямБюджетовКоличество.Видимость = УчитыватьПоКоличеству;
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
ИспользуетсяКоличествоАналитик = Ложь;
Для Счетчик = 0 По МаксимальноеКоличествоАналитик-1 Цикл
КоличествоАналитик = МаксимальноеКоличествоАналитик - Счетчик;
Если Не ИспользуетсяКоличествоАналитик Тогда
ИспользуетсяКоличествоАналитик = Форма.КорректировкиПоСтатьямБюджетов.НайтиСтроки(
Новый Структура("КоличествоАналитик", КоличествоАналитик)).Количество() > 0;
КонецЕсли;
Форма.Элементы["КорректировкиПоСтатьямБюджетовАналитика"
+ КоличествоАналитик].Видимость = ИспользуетсяКоличествоАналитик;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыВыбораСтатьиБюджетаДляКорректировкиОборотов()
МассивСтатей = ОбщегоНазначенияУТКлиентСервер.ПреобразоватьСоответствиеИлиСтруктуруВМассив(КэшПараметровСтатей);
МассивПараметровВыбора = Новый Массив;
МассивПараметровВыбора.Добавить(Новый ПараметрВыбора("Отбор.Ссылка", Новый ФиксированныйМассив(МассивСтатей)));
Элементы.КорректировкиПоСтатьямБюджетовСтатьяБюджетов.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметровВыбора);
ТипыСтатейИПоказателей = Новый Массив;
Для Каждого ЭлементМассива Из МассивСтатей Цикл
Если ТипыСтатейИПоказателей.Найти(ТипЗнч(ЭлементМассива)) = Неопределено Тогда
ТипыСтатейИПоказателей.Добавить(ТипЗнч(ЭлементМассива));
КонецЕсли;
КонецЦикла;
Элементы.КорректировкиПоСтатьямБюджетовСтатьяБюджетов.ОграничениеТипа = Новый ОписаниеТипов(ТипыСтатейИПоказателей);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблицуКорректировкиПоСтатьямБюджетов()
СтруктураПоиска = Новый Структура;
Для Каждого СтрокаОбороты Из Объект.ОборотыПоСтатьямБюджетов Цикл
СтруктураПоиска.Вставить("ИдентификаторСтроки", СтрокаОбороты.ИдентификаторСтроки);
СтрокаАналитика = Объект.АналитикаСтатейБюджетов.НайтиСтроки(СтруктураПоиска);
Если СтрокаАналитика.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = КорректировкиПоСтатьямБюджетов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаОбороты);
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаАналитика[0]);
Если СтрокаОбороты.Сумма < 0 Тогда
НоваяСтрока.СуммаУменьшение = -СтрокаОбороты.Сумма;
НоваяСтрока.СуммаВВалютеУменьшение = -СтрокаОбороты.СуммаВВалюте;
НоваяСтрока.КоличествоУменьшение = -СтрокаОбороты.Количество;
Иначе
НоваяСтрока.СуммаУвеличение = СтрокаОбороты.Сумма;
НоваяСтрока.СуммаВВалютеУвеличение = СтрокаОбороты.СуммаВВалюте;
НоваяСтрока.КоличествоУвеличение = СтрокаОбороты.Количество;
КонецЕсли;
Если Не ЗначениеЗаполнено(НоваяСтрока.СтатьяБюджетов) Тогда
Продолжить;
КонецЕсли;
РеквизитыСтатьи = КэшПараметровСтатей.Получить(НоваяСтрока.СтатьяБюджетов);
ЗаполнитьЗначенияСвойств(НоваяСтрока, РеквизитыСтатьи);
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
КоличествоАналитик = 0;
Для Счетчик = 1 По МаксимальноеКоличествоАналитик Цикл
Если ЗначениеЗаполнено(НоваяСтрока["ВидАналитики"+Счетчик]) Тогда
НоваяСтрока["ПредставлениеПрочейАналитики"
+ Счетчик] = БюджетнаяОтчетностьКлиентСервер.ПредставлениеПрочейАналитикиБюджетирования(
РеквизитыСтатьи["ВидАналитики" + Счетчик], "Прочие");
КоличествоАналитик = Счетчик;
Иначе
НоваяСтрока["ПредставлениеПрочейАналитики"+Счетчик] = "";
КонецЕсли;
КонецЦикла;
НоваяСтрока.КоличествоАналитик = КоличествоАналитик;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаписатьТаблицуКорректировкиПоСтатьямБюджетов(ДокументОбъект)
ДокументОбъект.ОборотыПоСтатьямБюджетов.Очистить();
ДокументОбъект.АналитикаСтатейБюджетов.Очистить();
ТаблицаКорректировкиПоСтатьямБюджетов = КорректировкиПоСтатьямБюджетов.Выгрузить();
ОбъектИПараметрыРасчета = Новый Структура("Объект, ВалютаСценария", ДокументОбъект, ВалютаСценария);
ДанныеПоиска = Новый Структура("СтатьяБюджетов, Валюта");
НомерПоПорядку = 1;
Для Каждого СтрокаТаблицы Из ТаблицаКорректировкиПоСтатьямБюджетов Цикл
Для Счетчик = 1 По СтрокаТаблицы.КоличествоАналитик Цикл
Если Не ЗначениеЗаполнено(СтрокаТаблицы["Аналитика"+Счетчик]) Тогда
СтрокаТаблицы["Аналитика"+Счетчик] = БюджетированиеКлиентСервер.ПустоеЗначениеАналитики();
КонецЕсли;
ДанныеПоиска.Вставить("Аналитика"+Счетчик);
КонецЦикла;
Если Не ЗначениеЗаполнено(СтрокаТаблицы.Валюта) Тогда
СтрокаТаблицы.Валюта = ВалютаСценария;
СтрокаТаблицы.СуммаВВалютеУвеличение = СтрокаТаблицы.СуммаУвеличение;
СтрокаТаблицы.СуммаВВалютеУменьшение = СтрокаТаблицы.СуммаУменьшение;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ДанныеПоиска, СтрокаТаблицы);
ИдентификаторСтроки = БюджетнаяОтчетностьКлиентСервер.ИдентификаторАналитикиСтатейБюджетов(
ОбъектИПараметрыРасчета, ДанныеПоиска);
СтрокаОбороты = ДокументОбъект.ОборотыПоСтатьямБюджетов.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаОбороты, СтрокаТаблицы);
СтрокаОбороты.ИдентификаторСтроки = ИдентификаторСтроки;
Если ЗначениеЗаполнено(СтрокаТаблицы.СуммаУвеличение) Тогда
СтрокаОбороты.Сумма = СтрокаТаблицы.СуммаУвеличение;
Иначе
СтрокаОбороты.Сумма = -СтрокаТаблицы.СуммаУменьшение;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаТаблицы.СуммаВВалютеУвеличение) Тогда
СтрокаОбороты.СуммаВВалюте = СтрокаТаблицы.СуммаВВалютеУвеличение;
Иначе
СтрокаОбороты.СуммаВВалюте = -СтрокаТаблицы.СуммаВВалютеУменьшение;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаТаблицы.КоличествоУвеличение) Тогда
СтрокаОбороты.Количество = СтрокаТаблицы.КоличествоУвеличение;
Иначе
СтрокаОбороты.Количество = -СтрокаТаблицы.КоличествоУменьшение;
КонецЕсли;
СтрокаОбороты.НомерПоПорядку = НомерПоПорядку;
НомерПоПорядку = НомерПоПорядку + 1;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПересчитатьСуммыПоСтрокеПоКурсамСценария(ТекущаяСтрока)
СтрокаКорректировки = КорректировкиПоСтатьямБюджетов.НайтиПоИдентификатору(ТекущаяСтрока);
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
СтрокаКорректировки.СуммаУвеличение = БюджетнаяОтчетностьВызовСервера.ПересчитатьПоТаблицеКурсов(
ОбъектИПараметрыРасчета, СтрокаКорректировки.СуммаВВалютеУвеличение, СтрокаКорректировки.ПериодПланирования,
СтрокаКорректировки.Валюта, ВалютаСценария);
СтрокаКорректировки.СуммаУменьшение = БюджетнаяОтчетностьВызовСервера.ПересчитатьПоТаблицеКурсов(
ОбъектИПараметрыРасчета, СтрокаКорректировки.СуммаВВалютеУменьшение, СтрокаКорректировки.ПериодПланирования,
СтрокаКорректировки.Валюта, ВалютаСценария);
КонецПроцедуры
&НаСервере
Процедура ПересчитатьСуммыВВалютеПоСтрокеПоКурсамСценария(ТекущаяСтрока)
СтрокаКорректировки = КорректировкиПоСтатьямБюджетов.НайтиПоИдентификатору(ТекущаяСтрока);
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
СтрокаКорректировки.СуммаВВалютеУвеличение = БюджетнаяОтчетностьВызовСервера.ПересчитатьПоТаблицеКурсов(
ОбъектИПараметрыРасчета, СтрокаКорректировки.СуммаВВалютеУвеличение, СтрокаКорректировки.ПериодПланирования,
ВалютаСценария, СтрокаКорректировки.Валюта);
СтрокаКорректировки.СуммаВВалютеУменьшение = БюджетнаяОтчетностьВызовСервера.ПересчитатьПоТаблицеКурсов(
ОбъектИПараметрыРасчета, СтрокаКорректировки.СуммаВВалютеУменьшение, СтрокаКорректировки.ПериодПланирования,
ВалютаСценария, СтрокаКорректировки.Валюта);
КонецПроцедуры
#КонецОбласти
#Область ВыгрузкаВЭксель
&НаСервере
Функция МожноВыгрузитьТекущуюТаблицу(ВерхТекущейОбласти, ИДТаблицы, КолонкиПоИзмерениям)
ТекущаяСтрока = Неопределено;
ИДГруппировки = Неопределено;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица Тогда
Расшифровка = Бюджет.Область(ВерхТекущейОбласти, 1).Расшифровка;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Расшифровка, АдресДанныхРасшифровки);
Если ТипЗнч(Расшифровка) = Тип("Структура")
И Расшифровка.Свойство("ИДГруппировки", ИДГруппировки) Тогда
ТекущаяСтрока = ФинансоваяОтчетностьСервер.ПодчиненныйЭлемент(ДеревоЭлементовБюджета,
"ИДГруппировки", ИДГруппировки);
Иначе
СтрокиДерева = ДеревоЭлементовБюджета.ПолучитьЭлементы();
Если Не СтрокиДерева.Количество() Тогда
Возврат Ложь;
КонецЕсли;
ТекущаяСтрока = СтрокиДерева[0];
КонецЕсли;
ИначеЕсли Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
ИндексТекущаяСтрока = Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока;
Если ИндексТекущаяСтрока = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ТекущаяСтрока = ДеревоЭлементовБюджета.НайтиПоИдентификатору(ИндексТекущаяСтрока);
КонецЕсли;
Если ТекущаяСтрока = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Пока ТекущаяСтрока.ПолучитьРодителя() <> Неопределено Цикл
ТекущаяСтрока = ТекущаяСтрока.ПолучитьРодителя();
КонецЦикла;
ПараметрыЭкземпляраБюджета = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
СписокПараметров = ПараметрыЭкземпляраБюджета.СтруктураОписанияСпискаВвода;
КолонкиПоИзмерениям = Неопределено;
Если Не Документы.ЭкземплярБюджета.СоставКолонокКорневогоЭлемента(ТекущаяСтрока, СписокПараметров, КолонкиПоИзмерениям) Тогда
Возврат Ложь;
КонецЕсли;
ИДТаблицы = ТекущаяСтрока.ИДТаблицы;
Возврат Истина;
КонецФункции
&НаСервере
Функция СоздатьПрисоединенныйФайлXLS97(ИДТаблицы, КолонкиПоИзмерениям)
ГлубинаДерева = Неопределено;
СхемаКомпоновкиДанных = Документы.ЭкземплярБюджета.ПолучитьСКДПечатиДокументаБезГруппировок(ИДТаблицы, КолонкиПоИзмерениям,
ГлубинаДерева, ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета));
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПараметрыЯчеек = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).СтруктураОписанияОтчета.ПараметрыЯчеек;
ВнешниеДанные = Новый Структура("ДанныеЯчеек, ПараметрыЯчеек", ПолучитьИзВременногоХранилища(АдресДанныхЯчеек), ПараметрыЯчеек);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(
МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), УникальныйИдентификатор);
ПредставлениеТекущейДатыДляИмениФайла = Формат(ТекущаяДатаСеанса(),
СтрШаблон(НСтр("ru = 'ДФ=''%1 %2'''"), "dd.MM.yyyy", "ЧЧ.мм.сс"));
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Бюджет от %1'"),
ПредставлениеТекущейДатыДляИмениФайла);
ВыполнитьЗаменуЗапрещенныхСимволов(ИмяФайла);
ПараметрыФайла = Новый Структура();
ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
ПараметрыФайла.Вставить("ВладелецФайлов", Объект.Ссылка);
ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяФайла);
ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено);
Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
УдалитьФайлы(ИмяВременногоФайла);
Возврат Файл;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ВыполнитьЗаменуЗапрещенныхСимволов(ИмяФайла)
ЗапрещенныеСимволы = Новый Массив;
ЗапрещенныеСимволы.Добавить("/");
ЗапрещенныеСимволы.Добавить("\");
ЗапрещенныеСимволы.Добавить("[");
ЗапрещенныеСимволы.Добавить("]");
ЗапрещенныеСимволы.Добавить(":");
ЗапрещенныеСимволы.Добавить(";");
ЗапрещенныеСимволы.Добавить("|");
ЗапрещенныеСимволы.Добавить("=");
ЗапрещенныеСимволы.Добавить("?");
ЗапрещенныеСимволы.Добавить("*");
ЗапрещенныеСимволы.Добавить("<");
ЗапрещенныеСимволы.Добавить(">");
Для каждого ЗапрещенныйСимвол Из ЗапрещенныеСимволы Цикл
ИмяФайла = СтрЗаменить(ИмяФайла, ЗапрещенныйСимвол, "_");
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьВExcelРасширениеПодключено(Результат, ДополнительныеПараметры) Экспорт
Файл = СоздатьПрисоединенныйФайлXLS97(ДополнительныеПараметры.ИДТаблицы, ДополнительныеПараметры.КолонкиПоИзмерениям);
РаботаСФайламиКлиент.ОткрытьФормуФайла(Файл);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузкаИзЭксель
&НаСервереБезКонтекста
Функция ПолучитьДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор)
Возврат РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор, Истина);
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ПрисоединенныйФайл)
ИДТаблицы = Неопределено;
КолонкиПоИзмерениям = Неопределено;
Если Не МожноВыгрузитьТекущуюТаблицу(Бюджет.ТекущаяОбласть.Верх, ИДТаблицы, КолонкиПоИзмерениям) Тогда
ТекстПредупреждения = НСтр("ru = 'Невозможно загрузить в текущую таблицу, т.к. ее структура не однородна!'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат Ложь;
КонецЕсли;
Состояние(НСтр("ru = 'Выполняется чтение данных их файла. Пожалуйста подождите...'") , , , БиблиотекаКартинок.Информация32);
ДанныеФайла = ПолучитьДанныеФайла(ПрисоединенныйФайл, УникальныйИдентификатор);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИДТаблицы", ИДТаблицы);
ДополнительныеПараметры.Вставить("КолонкиПоИзмерениям", КолонкиПоИзмерениям);
ДополнительныеПараметры.Вставить("РасширениеФайла", ДанныеФайла.Расширение);
Если Не ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда
Оповещение = Новый ОписаниеОповещения(
"ЗагрузитьИзExcelНаКлиентеПродолжение",
ЭтотОбъект,
ДополнительныеПараметры);
РаботаСФайламиКлиент.ПолучитьПрисоединенныйФайл(
Оповещение,
ПрисоединенныйФайл,
УникальныйИдентификатор,
Новый Структура("ДанныеФайла, ДляРедактирования", ДанныеФайла, Ложь));
Иначе
РабочийКаталогПользователя = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя();
ИмяВременногоФайла = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла;
ЗагрузитьИзExcelНаКлиентеПродолжение(
Новый Структура("ОписаниеОшибки, ПолноеИмяФайла", "", ИмяВременногоФайла),
ДополнительныеПараметры);
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ЗагрузитьИзExcelНаКлиентеПродолжение(Результат, ДополнительныеПараметры) Экспорт
Если НЕ ПустаяСтрока(Результат.ОписаниеОшибки) Тогда
ВызватьИсключение Результат.ОписаниеОшибки;
КонецЕсли;
ИДТаблицы = ДополнительныеПараметры.ИДТаблицы;
КолонкиПоИзмерениям = ДополнительныеПараметры.КолонкиПоИзмерениям;
ПараметрыФормы = Новый Структура();
ДвоичныеДанные = Новый ДвоичныеДанные(Результат.ПолноеИмяФайла);
АдресВХ = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
РасширениеФайла = ДополнительныеПараметры.РасширениеФайла;
Если НЕ ЗначениеЗаполнено(РасширениеФайла) Тогда
НомерСимвола = СтрНайти(Результат.ПолноеИмяФайла, ".", НаправлениеПоиска.СКонца);
Если НомерСимвола > 0 Тогда
РасширениеФайла = Сред(Результат.ПолноеИмяФайла, НомерСимвола+1);
КонецЕсли;
КонецЕсли;
ПараметрыФормы.Вставить("АдресФайлаДанных", АдресВХ);
ПараметрыФормы.Вставить("РасширениеФайла", РасширениеФайла);
ПараметрыФормы.Вставить("ИДТаблицы", ИДТаблицы);
ПараметрыФормы.Вставить("КолонкиПоИзмерениям", КолонкиПоИзмерениям);
ПараметрыФормы.Вставить("ПараметрыВыводаВидаБюджета", ПараметрыВыводаВидаБюджета);
ПараметрыФормы.Вставить("АдресРезультата", ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор));
ПараметрыФормы.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ОткрытьФорму("Документ.ЭкземплярБюджета.Форма.ФормаСопоставленияЗагружаемыхДанныхИзExcel", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьБюджетНаСервере(АдресВоВременномХранилище)
Результат = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
НайденнаяСтрока = ФинансоваяОтчетностьСервер.ПодчиненныйЭлемент(ДеревоЭлементовБюджета, "ИДТаблицы", Результат.ИДТаблицы);
Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор();
УстановитьПараметрыСпискаВводаНаСервере();
ПредыдущееАвтоматическоеОбновление = АвтоматическоеОбновлениеБюджета;
АвтоматическоеОбновлениеБюджета = Ложь;
Пока СписокРедактированияБюджета.Количество() Цикл
УдалитьСвязанныеСтрокиБюджетаНаСервере(СписокРедактированияБюджета[0].ПолучитьИдентификатор(),,Ложь);
СписокРедактированияБюджета.Удалить(0);
КонецЦикла;
МаксимальныйНомерПоПорядку = 0;
Для Каждого СтрокаОборотов Из Объект.ОборотыПоСтатьямБюджетов Цикл
МаксимальныйНомерПоПорядку = Макс(СтрокаОборотов.НомерПоПорядку, МаксимальныйНомерПоПорядку);
КонецЦикла;
ЕстьИзмененияВСвязанныхЯчейках = Ложь;
Для Каждого СтрокаРезультат Из Результат.СписокРедактированияБюджета Цикл
НоваяСтрока = СписокРедактированияБюджета.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультат);
ОтразитьИзмененияВДанных(НоваяСтрока.ПолучитьИдентификатор(),,
ЕстьИзмененияВСвязанныхЯчейках,
МаксимальныйНомерПоПорядку);
КонецЦикла;
ЗапуститьОтражениеИзмененияБюджета(ЕстьИзмененияВСвязанныхЯчейках);
АвтоматическоеОбновлениеБюджета = ПредыдущееАвтоматическоеОбновление;
НайденнаяСтрока = ФинансоваяОтчетностьСервер.ПодчиненныйЭлемент(ДеревоЭлементовБюджета, "ИДТаблицы", Результат.ИДТаблицы);
Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор();
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
УстановитьДоступностьЭлементовПоСтатусуСервер(Истина);
КонецПроцедуры
&НаКлиенте
Процедура АвтоматическийПересчет(Команда)
АвтоматическоеОбновлениеБюджета = Не АвтоматическоеОбновлениеБюджета;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы,
"АвтоматическийПересчет",
"Пометка",
АвтоматическоеОбновлениеБюджета);
ПродолжительностьПоследнегоРасчета = 0;
Если АвтоматическоеОбновлениеБюджета Тогда
ОбновитьБюджет();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьЭлементовПоСтатусуСервер(ПроверятьИзменениеСпособаРедактирования=Ложь)
ДоступностьЭлементов =
Не ИспользоватьУтверждениеБюджетов
Или (Объект.Статус <> Перечисления.СтатусыПланов.Утвержден);
Элементы.МодельБюджетирования.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.ВидБюджета.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.Сценарий.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.НачалоПериода.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.КонецПериода.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.ВыбратьПериод.Доступность = ДоступностьЭлементов;
Элементы.Организация.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.Подразделение.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.Действие.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.Бюджет.ТолькоПросмотр = Ложь;
Элементы.Бюджет.Редактирование = ДоступностьЭлементов;
Элементы.Ответственный.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.СписокРедактированияБюджета.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.ДеревоЭлементовБюджета.ТолькоПросмотр = Не ДоступностьЭлементов;
Элементы.РедактироватьСписком.Доступность = ДоступностьЭлементов;
Элементы.ЗаполнитьПоДаннымБюджетирования.Доступность = ДоступностьЭлементов;
Элементы.ЗагрузитьИзExcel.Доступность = ДоступностьЭлементов;
Элементы.Вставить.Доступность = ДоступностьЭлементов;
Элементы.СкопироватьПоПериодам.Доступность = ДоступностьЭлементов;
Элементы.ДобавитьСтроку.Доступность = ДоступностьЭлементов;
Элементы.УдалитьСтроку.Доступность = ДоступностьЭлементов;
Элементы.Пересчитать.Доступность = ДоступностьЭлементов;
Элементы.АвтоматическийПересчет.Доступность = ДоступностьЭлементов;
Элементы.ОбновитьБюджет.Доступность = ДоступностьЭлементов;
Элементы.Бюджет.КонтекстноеМеню.Доступность = ДоступностьЭлементов;
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для Сч = 1 По МаксимальноеКоличествоАналитик Цикл
Элемент = Элементы.Найти("ШапкаАналитика" + Сч);
Если Элемент = Неопределено Тогда
Продолжить;
КонецЕсли;
Элементы["ШапкаАналитика" + Сч].ТолькоПросмотр = Не ДоступностьЭлементов;
КонецЦикла;
Если ПроверятьИзменениеСпособаРедактирования И Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список И
Не ДоступностьЭлементов Тогда
ПриИзмененииСпособаРедактированияБюджета();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьЭлементовПослеПроверкиЗаполнения()
МожноОбновитьБюджет = МожноОбновитьБюджет(Ложь);
Элементы.ГруппаКоманднаяПанельБюджет.Доступность = МожноОбновитьБюджет;
Элементы.Бюджет.КонтекстноеМеню.Доступность = МожноОбновитьБюджет;
КонецПроцедуры
&НаСервере
Процедура ПроверитьЗаполнитьТаблицуКурсов(Отказ, ТекстСообщения)
Если ЗначениеЗаполнено(АдресТаблицыКурсов) Тогда
Возврат;
КонецЕсли;
СтруктураПараметров = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Если СтруктураПараметров = Неопределено Тогда
Возврат;
КонецЕсли;
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ТаблицаКурсов = БюджетнаяОтчетностьВызовСервера.ТаблицаКурсов(ОбъектИПараметрыРасчета, СтруктураПараметров, Неопределено, Отказ, ТекстСообщения);
Если Не Отказ = Истина Тогда
АдресТаблицыКурсов = ПоместитьВоВременноеХранилище(ТаблицаКурсов, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция УстановитьПараметрыСценария()
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Валюта, ТребоватьУказанияКурсовДляКаждогоПериода");
ВалютаСценария = ЗначенияРеквизитов.Валюта;
ТребоватьУказанияКурсовДляКаждогоПериода = ЗначенияРеквизитов.ТребоватьУказанияКурсовДляКаждогоПериода;
Возврат ЗначенияРеквизитов;
КонецФункции
&НаКлиенте
Процедура СценарийОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Сообщение = Неопределено;
Если ВыбранноеЗначение = ПредопределенноеЗначение("Справочник.Сценарии.ФактическиеДанные") Тогда
Сообщение = НСтр("ru = 'Сценарий ""Фактические данные"" не предназначен для ввода данных'");
ИначеЕсли ВыбранноеЗначение = ПредопределенноеЗначение("Справочник.Сценарии.ИсполнениеБюджета") Тогда
Сообщение = НСтр("ru = 'Сценарий ""Исполнение бюджета"" не предназначен для ввода данных'");
КонецЕсли;
Если Сообщение <> Неопределено Тогда
ПоказатьПредупреждение(,Сообщение);
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcelРасширениеПодключено(Результат, ДополнительныеПараметры) Экспорт
РаботаСФайламиКлиент.ОткрытьФормуВыбораФайлов(Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры
#КонецОбласти
#Область ВыводИОтображениеТабличногоБюджета
&НаКлиенте
Процедура ПроверитьВыполнениеЗаданияОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ЗагрузитьПодготовленныеДанные();
Бюджет.ФиксацияСверху = ФиксацияСверху;
Бюджет.ФиксацияСлева = ФиксацияСлева;
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЭлементовБюджета", 1, Истина);
КонецЕсли;
Элементы.ФормаПровестиИЗакрыть.Доступность = Истина;
Элементы.ФормаЗаписать.Доступность = Истина;
Элементы.ФормаПровести.Доступность = Истина;
Исключение
ИдентификаторЗадания = Неопределено;
ОтображениеСостояния = Элементы.Бюджет.ОтображениеСостояния;
Если Не ОтображениеСостояния.Видимость Тогда
ОтображениеСостояния.Видимость = Истина;
ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
ОтображениеСостояния.Картинка = Новый Картинка;
ОтображениеСостояния.Текст = НСтр("ru = 'Ошибка формирования бюджета'");
КонецЕсли;
Элементы.ФормаПровестиИЗакрыть.Доступность = Истина;
Элементы.ФормаЗаписать.Доступность = Истина;
Элементы.ФормаПровести.Доступность = Истина;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОтменитьВыполненниеЗадания(Знач ИдентификаторЗадания)
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьПроверкуРасчетаИзменений()
Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПроверитьРасчетИзмененийОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(
ФоновоеЗаданиеПодготовкаБюджета, ОповещениеОЗавершении, ПараметрыОжидания);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьРасчетИзмененийОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
ЗапуститьЗаданиеПовторно = Ложь;
Если ЕстьИзмененияКОтражению Тогда
ЗапуститьЗаданиеПовторно = Истина;
КонецЕсли;
ЗагрузитьРезультатРасчетаИзменений();
Если ЗапуститьЗаданиеПовторно Тогда
ВремяПоследнегоРасчета = ТекущаяДата();
УстановитьНадписьОбновленияИтогов(Истина);
ОтразитьИзмененияБюджета();
ЗапуститьПроверкуРасчетаИзменений();
Иначе
УстановитьНадписьОбновленияИтогов();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьНадписьОбновленияИтогов(СтартПроцесса = Ложь)
Если Не АвтоматическоеОбновлениеБюджета Тогда
Элементы.НадписьСтатусРасчета.Видимость = Ложь;
Возврат;
КонецЕсли;
Если СтартПроцесса Тогда
ВремяНачалаРасчета = ТекущаяДата();
Иначе
ВремяПоследнегоРасчета = ТекущаяДата();
ПродолжительностьПоследнегоРасчета = ВремяПоследнегоРасчета - ВремяНачалаРасчета;
КонецЕсли;
Если ПродолжительностьПоследнегоРасчета > 5 Тогда
ТекстНадписи = НСтр("ru = 'Расчет занимает %1 сек.: рекомендуется отключить автообновление итогов'");
ТекстНадписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстНадписи, ПродолжительностьПоследнегоРасчета);
КонецЕсли;
Если ПродолжительностьПоследнегоРасчета > 5 Тогда
Если СтартПроцесса Тогда
Элементы.ДекорацияВыполняетсяОтключитьАвтоРасчет.Заголовок = ТекстНадписи;
Элементы.НадписьСтатусРасчета.ТекущаяСтраница = Элементы.ВыполняетсяРасчетСОшибками;
Иначе
Элементы.ДекорацияРекомендуетсяОтключитьАвтоРасчет.Заголовок = ТекстНадписи;
Элементы.НадписьСтатусРасчета.ТекущаяСтраница = Элементы.РекомендуетсяОтключитьАвтоРасчет;
КонецЕсли;
КонецЕсли;
Элементы.НадписьСтатусРасчета.Видимость = ПродолжительностьПоследнегоРасчета > 5;
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьПроверкуВыполненияОтчета()
Если Не ФайловаяИБ Тогда
Если Элементы.ПанельБюджет.ТекущаяСтраница <> Элементы.Список Тогда
Элементы.ФормаПровестиИЗакрыть.Доступность = Ложь;
Элементы.ФормаЗаписать.Доступность = Ложь;
Элементы.ФормаПровести.Доступность = Ложь;
КонецЕсли;
Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПроверитьВыполнениеЗаданияОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(
ФоновоеЗаданиеПодготовкаБюджета, ОповещениеОЗавершении, ПараметрыОжидания);
КонецЕсли;
Иначе
Бюджет.ФиксацияСверху = ФиксацияСверху;
Бюджет.ФиксацияСлева = ФиксацияСлева;
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЭлементовБюджета", 1, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьПодготовленныеДанные(Знач РезультатВыполнения = Неопределено)
ТекущаяСтрока = Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока;
ИндексСтроки = Неопределено;
Если ТекущаяСтрока <> Неопределено Тогда
ТекущиеДанные = ДеревоЭлементовБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
Если ТекущиеДанные <> Неопределено Тогда
ИндексСтроки = ОбластьБюджетаПоСтроке(Бюджет, АдресДанныхРасшифровки, ТекущиеДанные.ИДГруппировки);
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения = Неопределено Тогда
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресХранилища);
КонецЕсли;
Бюджет = РезультатВыполнения.Результат;
Элементы.Бюджет.ТолькоПросмотр = Ложь;
Элементы.Бюджет.Редактирование = Истина;
ФиксацияСлева = Бюджет.ФиксацияСлева;
ФиксацияСверху = Бюджет.ФиксацияСверху;
ВосстановитьРазмерыЯчеек();
ПоместитьВоВременноеХранилище(РезультатВыполнения.ПараметрыВыводаВидаБюджета, ПараметрыВыводаВидаБюджета);
ПоместитьВоВременноеХранилище(РезультатВыполнения.ДанныеЯчеек, АдресДанныхЯчеек);
ДанныеРасшифровки = РезультатВыполнения.ДанныеРасшифровки;
ПоместитьВоВременноеХранилище(ДанныеРасшифровки, АдресДанныхРасшифровки);
Если РезультатВыполнения.Свойство("КолонкиТаблиц") Тогда
ПараметрыВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Если НЕ ПараметрыВывода.Свойство("КолонкиТаблиц") Тогда
ПараметрыВывода.Вставить("КолонкиТаблиц", РезультатВыполнения.КолонкиТаблиц);
ПоместитьВоВременноеХранилище(ПараметрыВывода, ПараметрыВыводаВидаБюджета);
КонецЕсли;
КонецЕсли;
ЗначениеВРеквизитФормы(РезультатВыполнения.ДеревоСтрокСпискаРедактирования, "ДеревоЭлементовБюджета");
ПодчиненныеЭлементыДерева = ДеревоЭлементовБюджета.ПолучитьЭлементы();
Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока = ПодчиненныеЭлементыДерева[0].ПолучитьИдентификатор();
Если ИндексСтроки <> Неопределено Тогда
ИДГруппировки = Неопределено;
Расшифровка = ДанныеРасшифровки[Бюджет.Область(ИндексСтроки, 1).Расшифровка];
Если Расшифровка <> Неопределено Тогда
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Расшифровка, АдресДанныхРасшифровки);
Если ТипЗнч(Расшифровка) = Тип("Структура")
И Расшифровка.Свойство("ИДГруппировки", ИДГруппировки) Тогда
НайденнаяСтрока = ФинансоваяОтчетностьСервер.ПодчиненныйЭлемент(ДеревоЭлементовБюджета,
"ИДГруппировки", ИДГруппировки);
Если НайденнаяСтрока <> Неопределено Тогда
Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения.Свойство("СтрокаСортировкиДанныхЯчеек") Тогда
СтрокаСортировкиДанныхЯчеек = РезультатВыполнения.СтрокаСортировкиДанныхЯчеек;
КонецЕсли;
Элементы.ДеревоЭлементовБюджета.Обновить();
ЭлементыУсловногоОформления = УсловноеОформление.Элементы;
УсловноеОформлениеКУдалению = Новый Массив;
Для Каждого ЭлементУО Из ЭлементыУсловногоОформления Цикл
Если СтрНайти(ЭлементУО.Представление, "ДобавленноеУОДереваЭлементов_") Тогда
УсловноеОформлениеКУдалению.Добавить(ЭлементУО);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементУО Из УсловноеОформлениеКУдалению Цикл
УсловноеОформление.Элементы.Удалить(ЭлементУО);
КонецЦикла;
Для Каждого КлючиСтилей Из РезультатВыполнения.СтильУровней Цикл
Стили = КлючиСтилей.Значение;
Для Каждого КлючИЗначение Из Стили Цикл
Элемент = ЭлементыУсловногоОформления.Добавить();
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоЭлементовБюджета.Уровень");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = КлючИЗначение.Ключ;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоЭлементовБюджета.ИДТаблицы");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = КлючиСтилей.Ключ;
Значение = КлючИЗначение.Значение;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", Значение.ЦветФона);
ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДеревоЭлементовБюджетаПредставление");
Элемент.Использование = Истина;
Элемент.Представление = "ДобавленноеУОДереваЭлементов_" + КлючИЗначение.Ключ;
КонецЦикла;
КонецЦикла;
ИдентификаторЗадания = Неопределено;
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Бюджет, "НеИспользовать");
УдалитьИзВременногоХранилища(АдресХранилища);
УстановитьДоступностьЭлементовПоСтатусуСервер();
Если РезультатВыполнения.Свойство("УчитыватьДополнительныйОтборПоИерархии")
И РезультатВыполнения.УчитыватьДополнительныйОтборПоИерархии Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
БюджетированиеСервер.ПроверитьИсправитьТЧЭкземпляраБюджета(Объект, ОбъектИПараметрыРасчета, Бюджет, ДанныеРасшифровки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьРезультатРасчетаИзменений(Знач Режим = "", РезультатВыполнения = Неопределено)
ВыполняетсяЗаданиеРасчетаИзменений = Ложь;
Если РезультатВыполнения = Неопределено Тогда
Возврат;
КонецЕсли;
ПоместитьВоВременноеХранилище(РезультатВыполнения.ПараметрыВыводаВидаБюджета, ПараметрыВыводаВидаБюджета);
ПоместитьВоВременноеХранилище(РезультатВыполнения.ДанныеЯчеек, АдресДанныхЯчеек);
ИдентификаторЗадания = Неопределено;
ЕстьИзмененияКОтражению = Ложь;
ОбновитьДанныеЯчеек = Режим = "ОбновитьДанныеЯчеек";
Если Не ОбновитьДанныеЯчеек Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, РезультатВыполнения.Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПараметрыОткрытияОтчетаРасшифровки()
Попытка
Расшифровка = Элементы.Бюджет.ТекущаяОбласть.Расшифровка;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Расшифровка, АдресДанныхРасшифровки);
Исключение
Возврат Неопределено;
КонецПопытки;
Если ТипЗнч(Расшифровка) <> Тип("Структура") Тогда
Возврат Неопределено;
КонецЕсли;
ПараметрыОтчета = ПодготовитьПараметрыОтчета();
Возврат БюджетнаяОтчетностьВызовСервера.ПараметрыОткрытияОтчетаРасшифровки(ПараметрыОтчета, Расшифровка, АдресДанныхЯчеек);
КонецФункции
&НаКлиенте
Процедура ПослеСохраненияДокументаПередРасшифровкой(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
Если Модифицированность ИЛИ Объект.Ссылка.Пустая() Тогда
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
КонецЕсли;
ПараметрыОткрытия = ПараметрыОткрытияОтчетаРасшифровки();
Если ПараметрыОткрытия <> Неопределено Тогда
БюджетнаяОтчетностьКлиент.ОткрытьФормуОтчета(ПараметрыОткрытия, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ВыводОтображениеИРедактированиеСпискаБюджета
&НаСервере
Процедура ДополнитьРасшифровкуПоПараметрамСтатьи(Расшифровка)
Значение = Неопределено;
ОбъектВалютногоУчета = Неопределено;
ЗначенияАналитик = Новый Соответствие;
СтруктураКолонокТаблицыДанных = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).СтруктураКолонокТаблицыДанных;
ВидыАналитик = СтруктураКолонокТаблицыДанных.ВидыАналитик;
Для Каждого ВидАналитики Из ВидыАналитик Цикл
КлючАналитики = ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(ВидАналитики);
Если Расшифровка.Свойство(КлючАналитики, Значение) Тогда
ЗначенияАналитик.Вставить(ВидАналитики, Значение);
КонецЕсли;
КонецЦикла;
Расшифровка.Вставить("ЗначенияАналитик", ЗначенияАналитик);
Если Не Расшифровка.Свойство("Валюта") Тогда
Если Расшифровка.Свойство("СтатьяБюджетов") Тогда
ЗначениеПараметровСтатей = КэшПараметровСтатей[Расшифровка.СтатьяБюджетов];
Если ЗначениеПараметровСтатей.ВалютаОпределяетсяАналитикой Тогда
Если Расшифровка.Свойство(ЗначениеПараметровСтатей.ИмяАналитикиВалюта, ОбъектВалютногоУчета) Тогда
Если ЗначениеЗаполнено(ОбъектВалютногоУчета) Тогда
ВалютаЯчейки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектВалютногоУчета, ЗначениеПараметровСтатей.ПутьКАналитикеВалюта);
Расшифровка.Вставить("Валюта", ВалютаЯчейки);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция РасшифровкаОтчетаПоСтроке(РасшифровкаКолонки, ТекущаяСтрока, Измерения)
Расшифровка = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(РасшифровкаКолонки);
Для Каждого Измерение Из Измерения Цикл
Если Не ЗначениеЗаполнено(ТекущаяСтрока[Измерение]) Тогда
ТекущаяСтрока[Измерение] = Неопределено;
КонецЕсли;
Расшифровка.Вставить(Измерение, ТекущаяСтрока[Измерение]);
КонецЦикла;
ДополнитьРасшифровкуПоПараметрамСтатьи(Расшифровка);
Возврат Расшифровка;
КонецФункции
&НаСервере
Процедура ЗагрузитьДанныеСписка(КолонкиПоИзмерениям, ФиксированныеЗначения, СтруктураАналогРасшифровки, ТолькоОбновить = Ложь)
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
ПараметрыЭкземпляраБюджета = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
ИндексыТаблицыДанныхЯчеек = ПараметрыЭкземпляраБюджета.ИндексыТаблицыДанныхЯчеек;
ПараметрыЯчеек = ПараметрыЭкземпляраБюджета.СтруктураОписанияОтчета.ПараметрыЯчеек;
Если Не ТолькоОбновить Тогда
СписокРедактированияБюджета.Очистить();
ТаблицаОбработки = СписокРедактированияБюджета.Выгрузить(Новый Массив).СкопироватьКолонки();
ТаблицаОбработки.Колонки.Добавить("МинимумНомерПоПорядку");
КонецЕсли;
Для Каждого Строка Из КолонкиПоИзмерениям.СтрокиОснования Цикл
СтруктураПоиска = Новый Структура("ОсновнойЭлемент, Строка", Истина, Строка);
Для Каждого КлючИЗначение Из ФиксированныеЗначения Цикл
СтруктураПоиска.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
СтрокиДанныхЯчеек = ДанныеЯчеек.Скопировать(СтруктураПоиска);
СтрокиДанныхЯчеек.Сортировать("МинимумНомерПоПорядку");
СтрокаСвертки = СтрСоединить(КолонкиПоИзмерениям.Измерения, ",");
СтрокиДанных = СтрокиДанныхЯчеек.Скопировать();
Если ПустаяСтрока(СтрокаСвертки) Тогда
СтрокиДанных = Новый Массив;
СтрокиДанных.Добавить(Новый Структура);
Иначе
СтрокиДанных.Свернуть(СтрокаСвертки);
КонецЕсли;
Для Каждого СтрокаДанных Из СтрокиДанных Цикл
СтруктураСумм = Новый Структура;
СтруктураПримечаний = Новый Структура;
ЕстьЗначимыеКолонки = Ложь;
Для Каждого Расшифровка Из СтруктураАналогРасшифровки Цикл
ТекстИндекса = "ОсновнойЭлемент,Строка";
СтруктураПоиска = Новый Структура("ОсновнойЭлемент, Строка", Истина, Строка);
Для Каждого Измерение Из КолонкиПоИзмерениям.Измерения Цикл
КолонкаИзмерения = КолонкиПоИзмерениям.НастройкиКолонок[Измерение];
Тип = КолонкаИзмерения.ТипЗначения;
Значение = БюджетированиеКлиентСервер.ПриведенноеЗначениеАналитики(СтрокаДанных[Измерение], Тип);
СтруктураПоиска.Вставить(Измерение, Значение);
ТекстИндекса = ТекстИндекса + "," + Измерение;
КонецЦикла;
ИмяПоказателя = "Сумма";
Для Каждого КлючИЗначение Из Расшифровка.Значение Цикл
Если КлючИЗначение.Ключ = "Расчетная" Тогда
Продолжить;
КонецЕсли;
Если КлючИЗначение.Ключ = "ИмяПоказателя" Тогда
ИмяПоказателя = КлючИЗначение.Значение;
Продолжить;
КонецЕсли;
СтруктураПоиска.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
ТекстИндекса = ТекстИндекса + "," + КлючИЗначение.Ключ;
КонецЦикла;
Если ИндексыТаблицыДанныхЯчеек[ТекстИндекса] = Неопределено Тогда
ДанныеЯчеек.Индексы.Добавить(ТекстИндекса);
ИндексыТаблицыДанныхЯчеек.Вставить(ТекстИндекса, Истина);
КонецЕсли;
НайденныеСтроки = ДанныеЯчеек.НайтиСтроки(СтруктураПоиска);
Значение = 0; Примечание = "";
Если НайденныеСтроки.Количество() > 1 Тогда
ТекстОшибки = НСтр("ru = 'Ошибка в структуре вида бюджета'");
ВызватьИсключение ТекстОшибки;
ИначеЕсли НайденныеСтроки.Количество() = 1 Тогда
СтрокаДанныхЯчеек = НайденныеСтроки[0];
Если ИмяПоказателя = "Сумма" И ЗначениеЗаполнено(СтрокаДанныхЯчеек.Валюта) Тогда
ИмяПоказателя = "СуммаВал";
КонецЕсли;
СтрокаПараметров = ПараметрыЯчеек.Найти(СтрокаДанныхЯчеек.ИндексСтроки, "ИндексСтроки");
Если СтрокаДанныхЯчеек.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.НефинансовыйПоказатель Тогда
Значение = СтрокаДанныхЯчеек.Значение;
ИначеЕсли СтрокаДанныхЯчеек.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.РедактируемоеЗначение Тогда
Значение = СтрокаДанныхЯчеек.Значение;
ИначеЕсли СтрокаПараметров.СложнаяТаблица Тогда
Значение = Неопределено;
Если СтрокаПараметров.ФлагСумма Тогда
Значение = СтрокаДанныхЯчеек[ИмяПоказателя];
ИначеЕсли СтрокаПараметров.ФлагКоличество Тогда
Значение = СтрокаДанныхЯчеек.Количество;
КонецЕсли;
Если Не ЗначениеЗаполнено(Значение) Тогда
Значение = 0;
КонецЕсли;
Иначе
Значение = ?(СтрокаДанныхЯчеек[ИмяПоказателя]=Неопределено,0,СтрокаДанныхЯчеек[ИмяПоказателя]);
КонецЕсли;
Примечание = СтрокаДанныхЯчеек.Примечание;
КонецЕсли;
Если ЗначениеЗаполнено(Значение) ИЛИ ТолькоОбновить Тогда
Если Не Расшифровка.Значение.Свойство("Расчетная") Тогда
ЕстьЗначимыеКолонки = Истина;
КонецЕсли;
СтруктураСумм.Вставить(Расшифровка.Ключ, Значение);
КонецЕсли;
Если ЗначениеЗаполнено(Примечание) Тогда
СтруктураПримечаний.Вставить(Расшифровка.Ключ + "Примечание", Примечание);
СтруктураПримечаний.Вставить(Расшифровка.Ключ + "КартинкаПримечание", БиблиотекаКартинок.Комментарий);
КонецЕсли;
КонецЦикла;
Если ТолькоОбновить ИЛИ ЕстьЗначимыеКолонки ИЛИ СтруктураПримечаний.Количество() Тогда
МассивИзмерений = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСвертки);
СтруктураПоискаВСписке = Новый Структура();
СтруктураПоискаВДанных = Новый Структура();
Для Каждого Измерение Из МассивИзмерений Цикл
Значение = СтрокаДанных[Измерение];
СтруктураПоискаВДанных.Вставить(Измерение, Значение);
Тип = КолонкиПоИзмерениям.НастройкиКолонок[Измерение].ТипЗначения;
Значение = БюджетированиеКлиентСервер.ПриведенноеЗначениеАналитики(Значение, Тип);
СтруктураПоискаВСписке.Вставить(Измерение, Значение);
КонецЦикла;
Если ТолькоОбновить Тогда
НайденныеСтроки = СписокРедактированияБюджета.НайтиСтроки(СтруктураПоискаВСписке);
Если НайденныеСтроки.Количество() Тогда
НоваяСтрока = НайденныеСтроки[0];
Иначе
Продолжить;
КонецЕсли;
Иначе
НоваяСтрока = ТаблицаОбработки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
СтруктураПоискаВДанных.Вставить("ВидЭлемента", Перечисления.ВидыЭлементовФинансовогоОтчета.СтатьяБюджетов);
СтрокиДляПоискаНомераПоПорядку = СтрокиДанныхЯчеек.НайтиСтроки(СтруктураПоискаВДанных);
Для Каждого СтрокаНомера Из СтрокиДляПоискаНомераПоПорядку Цикл
Если СтрокаНомера.МинимумНомерПоПорядку <> Null Тогда
НоваяСтрока.МинимумНомерПоПорядку = СтрокаНомера.МинимумНомерПоПорядку;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураСумм);
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураПримечаний);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Не ТолькоОбновить Тогда
ТаблицаОбработки.Сортировать("МинимумНомерПоПорядку");
СписокРедактированияБюджета.Загрузить(ТаблицаОбработки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыСпискаВводаНаСервере(УправлятьВидимостьюДереваЭлементов = Истина)
ПредыдущаяСтрокаДереваЭлементов = Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока;
ТекстСообщения = НСтр("ru = 'Редактирование для текущей строки не предусмотрено. Выберите другую строку бюджета'");
Отказ = Ложь;
ПроверитьЗаполнитьТаблицуКурсов(Отказ, ТекстСообщения);
Если Не МожноОбновитьБюджет() Тогда
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Элементы.ПримечаниеКТекущейСтроке.Заголовок = ТекстСообщения;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.ИнформацияОСтроке;
Возврат;
КонецЕсли;
ПараметрыЭкземпляраБюджета = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
СписокПараметров = ПараметрыЭкземпляраБюджета.СтруктураОписанияСпискаВвода;
КолонкиТаблиц = ПараметрыЭкземпляраБюджета.КолонкиТаблиц;
ИндексТекущаяСтрока = Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока;
Если ИндексТекущаяСтрока = Неопределено Тогда
Элементы.ПримечаниеКТекущейСтроке.Заголовок = ТекстСообщения;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.ИнформацияОСтроке;
Возврат;
КонецЕсли;
ТекущаяСтрока = ДеревоЭлементовБюджета.НайтиПоИдентификатору(ИндексТекущаяСтрока);
Если ТекущаяСтрока.ПолучитьРодителя() = Неопределено Тогда
КолонкиПоИзмерениям = Неопределено;
Если Не Документы.ЭкземплярБюджета.СоставКолонокКорневогоЭлемента(ТекущаяСтрока, СписокПараметров, КолонкиПоИзмерениям) Тогда
Элементы.ПримечаниеКТекущейСтроке.Заголовок = ТекстСообщения;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.ИнформацияОСтроке;
Если УправлятьВидимостьюДереваЭлементов Тогда
Элементы.ПоказатьСкрытьДеревоБюджета.Пометка = Истина;
Элементы.ДеревоЭлементовБюджета.Видимость = Элементы.ПоказатьСкрытьДеревоБюджета.Пометка;
КонецЕсли;
Возврат;
Иначе
Если УправлятьВидимостьюДереваЭлементов Тогда
Элементы.ПоказатьСкрытьДеревоБюджета.Пометка = Ложь;
Элементы.ДеревоЭлементовБюджета.Видимость = Элементы.ПоказатьСкрытьДеревоБюджета.Пометка;
КонецЕсли;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.СписокРедактирования;
КонецЕсли;
Иначе
КолонкиПоИзмерениям = СписокПараметров[ТекущаяСтрока.Строка];
КонецЕсли;
Если КолонкиПоИзмерениям = Неопределено Тогда
Элементы.ПримечаниеКТекущейСтроке.Заголовок = ТекстСообщения;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.ИнформацияОСтроке;
Возврат;
КонецЕсли;
Элементы.ГруппаСписокРедактированияБюджета.ТекущаяСтраница = Элементы.СписокРедактирования;
ОписаниеСтроки = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
ФиксированныеЗначения = Новый Структура;
СтрокаРасчета = ТекущаяСтрока;
Пока СтрокаРасчета <> Неопределено Цикл
Если ЗначениеЗаполнено(СтрокаРасчета.ИмяИзмерения) Тогда
Если КолонкиПоИзмерениям.НастройкиКолонок.Свойство(СтрокаРасчета.ИмяИзмерения) Тогда
Значение = Неопределено;
Если Не СтрокаРасчета.ЭтоАналитикаПрочее Тогда
Значение = СтрокаРасчета.ФиксированноеЗначение;
КонецЕсли;
Тип = КолонкиПоИзмерениям.НастройкиКолонок[СтрокаРасчета.ИмяИзмерения].ТипЗначения;
Значение = БюджетированиеКлиентСервер.ПриведенноеЗначениеАналитики(Значение, Тип);
ФиксированныеЗначения.Вставить(СтрокаРасчета.ИмяИзмерения, Значение);
КонецЕсли;
КонецЕсли;
Если СтрокаРасчета.ЭтоОбъединеннаяАналитика И ЗначениеЗаполнено(ТекущаяСтрока.Расшифровка) Тогда
ИсключаяАналитики = Новый Соответствие();
Если СтрокаРасчета.ПолучитьЭлементы().Количество() > 0 Тогда
ПодчиненнаяСтрока = СтрокаРасчета.ПолучитьЭлементы()[0];
Если ЗначениеЗаполнено(ПодчиненнаяСтрока.Расшифровка) Тогда
ПодчиненныеАналитики = ДанныеРасшифровки[ПодчиненнаяСтрока.Расшифровка].ЗначенияАналитик;
Для Каждого КлючЗначение Из ПодчиненныеАналитики Цикл
ИсключаяАналитики.Вставить(КлючЗначение.Ключ, Истина);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ЗначенияАналитик = ДанныеРасшифровки[ТекущаяСтрока.Расшифровка].ЗначенияАналитик;
Для Каждого КлючЗначение Из ЗначенияАналитик Цикл
Если ИсключаяАналитики.Получить(КлючЗначение.Ключ) = Неопределено И КолонкиПоИзмерениям.НастройкиКолонок.Свойство(КлючЗначение.Ключ) Тогда
ФиксированныеЗначения.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
СтрокаРасчета = СтрокаРасчета.ПолучитьРодителя();
КонецЦикла;
ДобавляемыеЭлементы = Новый Массив;
ДобавляемыеКолонки = Новый Массив;
Документы.ЭкземплярБюджета.РассчитатьЭлементыСпискаБюджетаКДобавлению(
ДобавляемыеЭлементы, ДобавляемыеКолонки, КолонкиПоИзмерениям, ФиксированныеЗначения);
Если ИзмеренияРедактированияСовпадают(ОписаниеСтроки, КолонкиПоИзмерениям, ТекущаяСтрока.ИДТаблицы) Тогда
СтруктураАналогРасшифровки = ОписаниеСтроки.СтруктураАналогРасшифровки;
Для Каждого Колонка Из ДобавляемыеКолонки Цикл
Документы.ЭкземплярБюджета.УстановитьДоступностьСписокВыбораКолонки(Элементы[Колонка.Имя], Колонка, ФиксированныеЗначения);
КонецЦикла;
Иначе
СтруктураКолонок = КолонкиТаблиц[ТекущаяСтрока.ИДТаблицы];
СтруктураАналогРасшифровки = Новый Структура;
ПараметрыДобавленияКолонок = Документы.ЭкземплярБюджета.ШаблонПараметровДобавленияКолонокСпискаБюджетов();
ПараметрыДобавленияКолонок.ДобавляемыеЭлементы = ДобавляемыеЭлементы;
ПараметрыДобавленияКолонок.ДобавляемыеКолонки = ДобавляемыеКолонки;
ПараметрыДобавленияКолонок.КолонкиПоИзмерениям = КолонкиПоИзмерениям;
ПараметрыДобавленияКолонок.СтруктураКолонок = СтруктураКолонок;
ПараметрыДобавленияКолонок.СтруктураАналогРасшифровки = СтруктураАналогРасшифровки;
Документы.ЭкземплярБюджета.ДобавитьКолонкиСпискаБюджетаПоТаблице(ПараметрыДобавленияКолонок);
Документы.ЭкземплярБюджета.ОтразитьИзмененияКолонокСпискаБюджетаНаФорме(ЭтотОбъект, ДобавляемыеЭлементы, ДобавляемыеКолонки, ФиксированныеЗначения);
ФиксироватьКолонокСлева = КолонкиПоИзмерениям.Измерения.Количество();
Если ФиксироватьКолонокСлева <= 3 Тогда
Элементы.СписокРедактированияБюджета.ФиксацияСлева = ФиксироватьКолонокСлева;
КонецЕсли;
КонецЕсли;
ЗагрузитьДанныеСписка(КолонкиПоИзмерениям, ФиксированныеЗначения, СтруктураАналогРасшифровки);
ОписаниеСтроки = Новый Структура();
ОписаниеСтроки.Вставить("ФиксированныеЗначения", ФиксированныеЗначения);
ОписаниеСтроки.Вставить("СтруктураАналогРасшифровки", СтруктураАналогРасшифровки);
ОписаниеСтроки.Вставить("ИзменяемыеИзмерения", КолонкиПоИзмерениям.Измерения);
ОписаниеСтроки.Вставить("КолонкиПоИзмерениям", КолонкиПоИзмерениям);
ОписаниеСтроки.Вставить("ИДТаблицы", ТекущаяСтрока.ИДТаблицы);
ПоместитьВоВременноеХранилище(ОписаниеСтроки, АдресПараметровРедактированияСтроки);
РедактируемыеКолонкиСписка = СтрСоединить(КолонкиПоИзмерениям.Измерения, ",");
КонецПроцедуры
&НаСервере
Процедура ОтразитьИзмененияВДанных(ИндексСтроки, ИмяКолонки = "", ЕстьИзмененияВСвязанныхЯчейках = Ложь, МаксимальныйНомерПоПорядку = Неопределено)
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ИндексСтроки);
Если ИмяКолонки = "" Тогда
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
ИмяКолонки = КлючИЗначение.Ключ;
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, РедактируемаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
Если Расшифровка.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
ОтразитьИзменениеЯчейки(Расшифровка,
РедактируемаяСтрока[ИмяКолонки],
РедактируемаяСтрока[ИмяКолонки + "Примечание"],
МаксимальныйНомерПоПорядку);
КонецЦикла;
Иначе
Если Не ПараметрыРедактирования.СтруктураАналогРасшифровки.Свойство(ИмяКолонки) Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(РедактируемаяСтрока[ИмяКолонки + "Примечание"]) Тогда
РедактируемаяСтрока[ИмяКолонки + "КартинкаПримечание"] = БиблиотекаКартинок.Комментарий;
Иначе
РедактируемаяСтрока[ИмяКолонки + "КартинкаПримечание"] = Неопределено;
КонецЕсли;
ЗначенияКолонок = ПараметрыРедактирования.СтруктураАналогРасшифровки[ИмяКолонки];
Расшифровка = РасшифровкаОтчетаПоСтроке(ЗначенияКолонок, РедактируемаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
РезультатОтражения = ОтразитьИзменениеЯчейки(Расшифровка,
РедактируемаяСтрока[ИмяКолонки],
РедактируемаяСтрока[ИмяКолонки + "Примечание"],
МаксимальныйНомерПоПорядку);
Если АвтоматическоеОбновлениеБюджета Тогда
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
КонецЕсли;
Расшифровка.Удалить("ЗначенияАналитик");
Расшифровка.Вставить("СтрокиОснования", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
ПараметрыОтчета = БюджетнаяОтчетностьКлиентСервер.ПараметрыПериода(Объект);
ИзмененияЭкземпляраБюджета = БюджетнаяОтчетностьВыводСервер.РассчитатьСвязанныеСтатьиБюджетов(
ПараметрыВыводаВидаБюджета,
АдресДанныхЯчеек,
ПараметрыОтчета,
Расшифровка,
РезультатОтражения,,
ЕстьИзмененияВСвязанныхЯчейках);
ЗагрузитьРезультатРасчетаИзменений(, ИзмененияЭкземпляраБюджета);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗапуститьОтражениеИзмененияБюджета(ЕстьИзмененияВСвязанныхЯчейках)
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
Если АвтоматическоеОбновлениеБюджета ИЛИ ЕстьИзмененияВСвязанныхЯчейках Тогда
ЗагрузитьДанныеСписка(ПараметрыРедактирования.КолонкиПоИзмерениям,
ПараметрыРедактирования.ФиксированныеЗначения,
ПараметрыРедактирования.СтруктураАналогРасшифровки,
Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОчиститьДанныеИзменыемыхКолонок(ТекущаяСтрока)
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
ТребуетсяОчисткаЗначений = Ложь;
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
РасшифровкаПриНачалеРедактирования = ПолучитьИзВременногоХранилища(АдресРедактируемыхЗначенийСтрокиСписка);
Для Каждого Измерение Из ПараметрыРедактирования.ИзменяемыеИзмерения Цикл
Если РедактируемаяСтрока[Измерение] <> РасшифровкаПриНачалеРедактирования[Измерение] Тогда
ТребуетсяОчисткаЗначений = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ТребуетсяОчисткаЗначений Тогда
РасшифровкаПриНачалеРедактирования.Вставить("Валюта", Неопределено);
УдалитьСвязанныеСтрокиБюджетаНаСервере(ТекущаяСтрока, РасшифровкаПриНачалеРедактирования);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ИзмеренияРедактированияСовпадают(ОписаниеСтроки, КолонкиПоИзмерениям, ИДТаблицы)
Если ОписаниеСтроки = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Измерения = КолонкиПоИзмерениям.Измерения;
СписокИзмеренийСтарый = СтрСоединить(ОписаниеСтроки.ИзменяемыеИзмерения, ",");
СписокИзмеренийНовый = СтрСоединить(Измерения, ",");
Если СписокИзмеренийСтарый <> СписокИзмеренийНовый Тогда
Возврат Ложь;
КонецЕсли;
Если ОписаниеСтроки.ИДТаблицы <> ИДТаблицы Тогда
Возврат Ложь;
КонецЕсли;
Если ОписаниеСтроки.КолонкиПоИзмерениям.Свойство("СтатьиБюджетов") Тогда
Для Каждого ОписаниеКолонки Из ОписаниеСтроки.СтруктураАналогРасшифровки Цикл
Колонка = ОписаниеКолонки.Значение.Колонка;
СравниваемыеЗначенияСтарые = ОписаниеСтроки.КолонкиПоИзмерениям.СтатьиБюджетов[Колонка];
СравниваемыеЗначенияНовые = КолонкиПоИзмерениям.СтатьиБюджетов[Колонка];
Если СравниваемыеЗначенияСтарые = Неопределено
И СравниваемыеЗначенияНовые = Неопределено Тогда
Продолжить;
КонецЕсли;
Если СравниваемыеЗначенияСтарые = Неопределено
И СравниваемыеЗначенияНовые <> Неопределено
ИЛИ
СравниваемыеЗначенияСтарые <> Неопределено
И СравниваемыеЗначенияНовые = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если СравниваемыеЗначенияСтарые.СтатьяБюджетов <> СравниваемыеЗначенияНовые.СтатьяБюджетов
ИЛИ СравниваемыеЗначенияСтарые.РедактируемоеЗначение <> СравниваемыеЗначенияНовые.РедактируемоеЗначение
ИЛИ СравниваемыеЗначенияСтарые.ИмяПоказателя <> СравниваемыеЗначенияНовые.ИмяПоказателя Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ВыборУвеличенияСтроки(Результат, ДополнительныеПараметры) Экспорт
ОткрытДиалогВопросаДубли = Ложь;
Если Результат = КодВозвратаДиалога.Да Тогда
ПринудительноеЗавершение = Истина;
ИзмененияВСпискеОтраженыВДокументе = Истина;
Элементы.СписокРедактированияБюджета.ЗакончитьРедактированиеСтроки(Ложь);
УвеличитьЗначениеСтрокиНаСервере(ДополнительныеПараметры.Идентификатор);
СтрокаТаблицы = СписокРедактированияБюджета.НайтиПоИдентификатору(ДополнительныеПараметры.Идентификатор);
Если СтрокаТаблицы <> Неопределено Тогда
СписокРедактированияБюджета.Удалить(СписокРедактированияБюджета.Индекс(СтрокаТаблицы));
КонецЕсли;
Элементы.СписокРедактированияБюджета.Обновить();
ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда
ПринудительноеЗавершение = Истина;
Элементы.СписокРедактированияБюджета.ЗакончитьРедактированиеСтроки(Истина);
СтрокаТаблицы = СписокРедактированияБюджета.НайтиПоИдентификатору(ДополнительныеПараметры.Идентификатор);
Если СтрокаТаблицы <> Неопределено Тогда
СписокРедактированияБюджета.Удалить(СписокРедактированияБюджета.Индекс(СтрокаТаблицы));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОтразитьИзменениеЯчейки(Расшифровка, ТекстЗначения, Примечание = Неопределено, МаксимальныйНомерПоПорядку = Неопределено)
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
Если ТипЗнч(МаксимальныйНомерПоПорядку) = Тип("Число") Тогда
ОбъектИПараметрыРасчета.Вставить("МаксимальныйНомерПоПорядку", МаксимальныйНомерПоПорядку);
КонецЕсли;
Результат = БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, ТекстЗначения, Примечание);
Возврат Результат;
КонецФункции
&НаСервере
Процедура УвеличитьЗначениеСтрокиНаСервере(ИндексСтроки)
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ИндексСтроки);
СтруктураПоиска = Новый Структура(РедактируемыеКолонкиСписка);
ЗаполнитьЗначенияСвойств(СтруктураПоиска, РедактируемаяСтрока);
НайденныеСтроки = СписокРедактированияБюджета.НайтиСтроки(СтруктураПоиска);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если НайденнаяСтрока = РедактируемаяСтрока Тогда
Продолжить;
КонецЕсли;
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если КлючИЗначение.Значение.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
НайденнаяСтрока[КлючИЗначение.Ключ] = НайденнаяСтрока[КлючИЗначение.Ключ] + РедактируемаяСтрока[КлючИЗначение.Ключ];
Расшифровка = РасшифровкаОтчетаПоСтроке(КлючИЗначение.Значение, НайденнаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
ОтразитьИзменениеЯчейки(Расшифровка, НайденнаяСтрока[КлючИЗначение.Ключ]);
КонецЦикла;
КонецЦикла;
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
КонецПроцедуры
&НаСервере
Процедура УдалитьСвязанныеСтрокиБюджетаНаСервере(ИндексСтроки, Знач РасшифровкаСтроки = Неопределено, ВыполнятьОбновлениеДанныхЯчеек = Истина)
Значение = Неопределено;
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ИндексСтроки);
Если РасшифровкаСтроки <> Неопределено Тогда
ЗначенияАналитик = Новый Соответствие;
ВидыАналитик = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).СтруктураКолонокТаблицыДанных.ВидыАналитик;
Для Каждого ВидАналитики Из ВидыАналитик Цикл
КлючАналитики = ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(ВидАналитики);
Если РасшифровкаСтроки.Свойство(КлючАналитики, Значение) Тогда
ЗначенияАналитик.Вставить(ВидАналитики, Значение);
КонецЕсли;
КонецЦикла;
РасшифровкаСтроки.Вставить("ЗначенияАналитик", ЗначенияАналитик);
КонецЕсли;
Для Каждого КолонкаСтруктуры Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если КолонкаСтруктуры.Значение.Свойство("Расчетная") Тогда
Продолжить;
КонецЕсли;
Если РасшифровкаСтроки <> Неопределено Тогда
Расшифровка = РасшифровкаОтчетаПоСтроке(КолонкаСтруктуры.Значение,
РасшифровкаСтроки, ПараметрыРедактирования.ИзменяемыеИзмерения);
Иначе
Расшифровка = РасшифровкаОтчетаПоСтроке(КолонкаСтруктуры.Значение,
РедактируемаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
КонецЕсли;
ОбрабатыватьКолонку = Расшифровка.Свойство("СтатьяБюджетов") И ЗначениеЗаполнено(Расшифровка.СтатьяБюджетов);
ОбрабатыватьКолонку = ОбрабатыватьКолонку ИЛИ Расшифровка.Свойство("РедактируемоеЗначение");
Если ОбрабатыватьКолонку Тогда
ОтразитьИзменениеЯчейки(Расшифровка, 0, "");
КонецЕсли;
КонецЦикла;
Если ВыполнятьОбновлениеДанныхЯчеек Тогда
ОтразитьИзмененияБюджета("ОбновитьДанныеЯчеек", ПараметрыРедактирования.КолонкиПоИзмерениям.СтрокиОснования);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПослеВводаЗначенияБудетДубль(ТекущаяСтрока)
Если РедактируемыеКолонкиСписка = ""
И СписокРедактированияБюджета.Количество() > 1 Тогда
Возврат Истина;
КонецЕсли;
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
Если РедактируемаяСтрока = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
СтруктураПоиска = Новый Структура(РедактируемыеКолонкиСписка);
ЗаполнитьЗначенияСвойств(СтруктураПоиска, РедактируемаяСтрока);
СтрокиПроверки = СписокРедактированияБюджета.НайтиСтроки(СтруктураПоиска);
Если СтрокиПроверки.Количество() > 1 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ЕстьНедоступныеЗначенияВЯчейках(ТекущаяСтрока, ИменаКолонокВидовАналитик)
СтруктураЯчеек = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).СтруктураОписанияОтчета.СтруктураЯчеек;
ТекущиеДанные = СписокРедактированияБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
Измерения = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(РедактируемыеКолонкиСписка);
ТаблицаПоиска = СтруктураЯчеек;
Для Каждого Измерение Из Измерения Цикл
Если БюджетнаяОтчетностьКлиентСервер.ЭтоПолеПериода(Измерение) Тогда
Продолжить;
КонецЕсли;
Значение = ТекущиеДанные[Измерение];
Если Не ЗначениеЗаполнено(Значение) Тогда
ТекущиеДанные[Измерение] = Неопределено;
Значение = ТекущиеДанные[Измерение];
ЭтоКолонкаАналитики = ИменаКолонокВидовАналитик.Найти(Измерение) <> Неопределено;
Если ЭтоКолонкаАналитики Тогда
Значение = БюджетированиеКлиентСервер.ПустоеЗначениеАналитики();
КонецЕсли;
КонецЕсли;
СтруктураПоиска = Новый Структура(Измерение, Значение);
ВременнаяТаблицаПоиска = ТаблицаПоиска.Скопировать(СтруктураПоиска);
Если Не ВременнаяТаблицаПоиска.Количество() Тогда
СтруктураПоиска = Новый Структура("Флаг" + Измерение, "документ");
ВременнаяТаблицаПоиска = ТаблицаПоиска.Скопировать(СтруктураПоиска);
Если Не ВременнаяТаблицаПоиска.Количество() Тогда
Возврат Измерение;
КонецЕсли;
КонецЕсли;
ТаблицаПоиска = ВременнаяТаблицаПоиска;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаСервере
Функция ЕстьНедоступныеДляВводаЭлемента(ТекущаяСтрока, КолонкаСОшибкой = Неопределено)
МассивКолонок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(РедактируемыеКолонкиСписка);
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
ПараметрыВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
ВидыАналитик = ПараметрыВывода.СтруктураКолонокТаблицыДанных.ВидыАналитик;
ИменаКолонокВидовАналитик = Новый Массив;
Для каждого ВидАналитики Из ВидыАналитик Цикл
ИменаКолонокВидовАналитик.Добавить(ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(ВидАналитики));
КонецЦикла;
Для Каждого Колонка Из МассивКолонок Цикл
Если Элементы[Колонка].СписокВыбора.Количество() Тогда
ЗначениеПоиска = РедактируемаяСтрока[Колонка];
Если Не ЗначениеЗаполнено(ЗначениеПоиска) Тогда
РедактируемаяСтрока[Колонка] = Неопределено;
ЗначениеПоиска = РедактируемаяСтрока[Колонка];
Если ИменаКолонокВидовАналитик.Найти(Колонка) <> Неопределено Тогда
ЗначениеПоиска = БюджетированиеКлиентСервер.ПустоеЗначениеАналитики();
КонецЕсли;
КонецЕсли;
Если Элементы[Колонка].СписокВыбора.НайтиПоЗначению(ЗначениеПоиска) = Неопределено Тогда
КолонкаСОшибкой = Колонка;
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
РезультатПроверки = ЕстьНедоступныеЗначенияВЯчейках(ТекущаяСтрока, ИменаКолонокВидовАналитик);
Если РезультатПроверки <> Неопределено Тогда
КолонкаСОшибкой = РезультатПроверки;
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ЕстьОшибкиВСтрокеРедактированияБюджета(ТекущаяСтрока, РезультатПроверки)
КолонкаСОшибкой = Неопределено;
ДопустимаяВалюта = Неопределено;
Если ОтличаетсяВалютаАналитики(ТекущаяСтрока, ДопустимаяВалюта) Тогда
РезультатПроверки = Новый Структура("Результат, ДопустимаяВалюта", "ОтличаетсяВалютаАналитики", ДопустимаяВалюта);
Возврат Истина;
ИначеЕсли ПослеВводаЗначенияБудетДубль(ТекущаяСтрока) Тогда
РезультатПроверки = Новый Структура("Результат", "ПослеВводаЗначенияБудетДубль");
Возврат Истина;
ИначеЕсли ЕстьНедоступныеДляВводаЭлемента(ТекущаяСтрока, КолонкаСОшибкой) Тогда
РезультатПроверки = Новый Структура("Результат, КолонкаСОшибкой", "ЕстьНедоступныеДляВводаЭлемента", КолонкаСОшибкой);
Возврат Истина;
Иначе
РезультатПроверки = Новый Структура("Результат", "ОК");
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ОтличаетсяВалютаАналитики(ТекущаяСтрока, ДопустимаяВалюта)
РедактируемаяСтрока = СписокРедактированияБюджета.НайтиПоИдентификатору(ТекущаяСтрока);
ПараметрыРедактирования = ПолучитьИзВременногоХранилища(АдресПараметровРедактированияСтроки);
КэшРеквизитовСтатей = Новый Соответствие;
Для Каждого КлючИЗначение Из ПараметрыРедактирования.СтруктураАналогРасшифровки Цикл
Если ЗначениеЗаполнено(РедактируемаяСтрока[КлючИЗначение.Ключ]) Тогда
РасшифровкаКолонки = КлючИЗначение.Значение;
Расшифровка = РасшифровкаОтчетаПоСтроке(РасшифровкаКолонки,
РедактируемаяСтрока, ПараметрыРедактирования.ИзменяемыеИзмерения);
Валюта = Неопределено;
Если Расшифровка.Свойство("Валюта", Валюта) Тогда
ВалютаАналитики = Документы.ЭкземплярБюджета.ВалютаВводаАналитики(Расшифровка, КэшРеквизитовСтатей);
Если ВалютаАналитики <> Неопределено Тогда
Если ВалютаАналитики <> Валюта Тогда
ДопустимаяВалюта = ВалютаАналитики;
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
#КонецОбласти
#Область ПереключениеРежимаТаблицаСписок
&НаКлиентеНаСервереБезКонтекста
Функция ОбластьБюджетаПоСтроке(Бюджет, АдресДанныхРасшифровки, ИскомаяСтрока)
ИДГруппировки = Неопределено;
СоответствиеРасшифровок = Новый Массив;
Для Сч = 1 По Бюджет.ВысотаСтраницы Цикл
ОбластьБюджета = Бюджет.Область(Сч, 1);
Расшифровка = ОбластьБюджета.Расшифровка;
СоответствиеРасшифровок.Добавить(Расшифровка);
КонецЦикла;
СоответствиеРасшифровок = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(СоответствиеРасшифровок, АдресДанныхРасшифровки);
Для Сч = 1 По Бюджет.ВысотаСтраницы Цикл
ОбластьБюджета = Бюджет.Область(Сч, 1);
Расшифровка = СоответствиеРасшифровок[ОбластьБюджета.Расшифровка];
Если ТипЗнч(Расшифровка) = Тип("Структура")
И Расшифровка.Свойство("ИДГруппировки", ИДГруппировки)
И ИДГруппировки = ИскомаяСтрока Тогда
Возврат ОбластьБюджета.Верх;
КонецЕсли;
КонецЦикла;
Возврат Неопределено
КонецФункции
&НаСервере
Процедура УстановитьСтраницу()
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица;
СформироватьОтчетСервер(Истина);
Иначе
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список;
КонецЕсли;
УстановитьДоступностьКнопокПриСменеСтраницы();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПараметрыСпискаВвода(УправлятьВидимостьюДереваЭлементов = Истина)
Если Элементы.ПанельБюджет.ТекущаяСтраница <> Элементы.Список Тогда
Возврат;
КонецЕсли;
Если Элементы.ДеревоЭлементовБюджета.ТекущаяСтрока <> ПредыдущаяСтрокаДереваЭлементов Тогда
УстановитьПараметрыСпискаВводаНаСервере(Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаАктивацииСтрокиДереваЭлементов()
УстановитьПараметрыСпискаВвода(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьПримечание(Команда)
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
Примечание = Неопределено;
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Если Примечание = Неопределено Тогда
Примечание = Бюджет.Область(Строка, Колонка).Примечание.Текст;
Иначе
НовоеПримечание = Бюджет.Область(Строка, Колонка).Примечание.Текст;
Если НовоеПримечание <> Примечание Тогда
Примечание = "";
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Оповещение = Новый ОписаниеОповещения("ПримечаниеЗавершениеВвода", ЭтотОбъект);
ТекстПодсказки = НСтр("ru = 'Примечание'");
ПоказатьВводСтроки(Оповещение, Примечание, ТекстПодсказки, 500, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПримечание(Команда)
УдалитьПримечаниеНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ПримечаниеЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ПримечаниеЗавершениеВводаНаСервере(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПримечаниеЗавершениеВводаНаСервере(ВведенныйТекст)
АктивнаяОбласть = Элементы.Бюджет.ТекущаяОбласть;
Для Колонка = АктивнаяОбласть.Лево По АктивнаяОбласть.Право Цикл
Для Строка = АктивнаяОбласть.Верх По АктивнаяОбласть.Низ Цикл
Область = Бюджет.Область(Строка, Колонка);
Если Область.СодержитЗначение Тогда
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Область.Расшифровка, АдресДанныхРасшифровки);
РезультатОтражения = ОтразитьИзменениеЯчейки(Расшифровка, Область.Текст, ВведенныйТекст);
Область.Примечание.Текст = ВведенныйТекст;
ИмяОбласти = Область.Имя;
Если ТипЗнч(АдресДанныхЯчеек) = Тип("Строка") Тогда
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
Иначе
ДанныеЯчеек = АдресДанныхЯчеек;
КонецЕсли;
Если ТипЗнч(ИмяОбласти) = Тип("Строка") Тогда
СтрокаРасчета = ДанныеЯчеек.Найти(ИмяОбласти, "ИмяОбластиСумма");
Если СтрокаРасчета = Неопределено Тогда
СтрокаРасчета = ДанныеЯчеек.Найти(ИмяОбласти, "ИмяОбластиКоличество");
КонецЕсли;
Если СтрокаРасчета = Неопределено Тогда
СтрокаРасчета = ДанныеЯчеек.Найти(ИмяОбласти, "ИмяОбластиЗначение");
КонецЕсли;
Если НЕ СтрокаРасчета = Неопределено Тогда
Если РезультатОтражения.Свойство("Примечание") Тогда
СтрокаРасчета.Примечание = РезультатОтражения.Примечание;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПоместитьВоВременноеХранилище(ДанныеЯчеек, АдресДанныхЯчеек);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УдалитьПримечаниеНаСервере()
ПримечаниеЗавершениеВводаНаСервере("");
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура Пересчитать(Команда)
ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЭкземплярБюджета.ФормаДокумента.Команда.Пересчитать",,
Истина);
ПересчитатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ОчиститьСообщения();
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
Если Объект.Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета Тогда
ПроверяемыеРеквизиты.Добавить("КорректировкиПоСтатьямБюджетов");
ПроверяемыеРеквизиты.Добавить("КорректировкиПоСтатьямБюджетов.СтатьяБюджетов");
ПроверяемыеРеквизиты.Добавить("КорректировкиПоСтатьямБюджетов.ПериодПланирования");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если Не ЗавершениеРаботы = Истина Тогда
ПриЗакрытииНаСервере(ИдентификаторЗадания,Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БюджетВыбор(Элемент, Область, СтандартнаяОбработка)
Если Область.СодержитЗначение Тогда
Если НЕ Элементы.Бюджет.Редактирование Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
Возврат;
КонецЕсли;
Расшифровка = Область.Расшифровка;
Если Расшифровка = Неопределено Тогда
Возврат;
КонецЕсли;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Область.Расшифровка, АдресДанныхРасшифровки);
Если ТипЗнч(Расшифровка) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если Расшифровка.Свойство("ИндексСтрокиДанных") Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
Если Расшифровка.Свойство("Значение") И ЗначениеЗаполнено(Расшифровка.Значение) Тогда
ПоказатьЗначение(,Расшифровка.Значение);
Возврат;
КонецЕсли;
ЯчейкиОбласти = ЯчейкиОбластиДляРедактирования(Область);
МассивСтрок = ЯчейкиОбласти.МассивСтрок;
Если Не МассивСтрок.Количество() Тогда
Возврат;
КонецЕсли;
ПараметрыРедактирования = ПараметрыРедактированияСтроки(МассивСтрок, ПараметрыВыводаВидаБюджета, Истина);
ПараметрыРедактирования = ПреобразоватьПараметрыРедактированияВСтруктуру(ПараметрыРедактирования, МассивСтрок, Область.Верх);
Если ПараметрыРедактирования <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
Если НЕ Элементы.Бюджет.Редактирование Тогда
Возврат;
КонецЕсли;
ДобавитьСтрокуВРежимеТаблицы(ПараметрыРедактирования);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСкрытьДеревоБюджета(Команда)
Элементы.ПоказатьСкрытьДеревоБюджета.Пометка = НЕ Элементы.ПоказатьСкрытьДеревоБюджета.Пометка;
Элементы.ДеревоЭлементовБюджета.Видимость = Элементы.ПоказатьСкрытьДеревоБюджета.Пометка;
Если Элементы.ДеревоЭлементовБюджета.Видимость Тогда
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЭлементовБюджета", 1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_РазвернутьДеревоЭлементовБюджета()
ЭлементыДерева = ДеревоЭлементовБюджета.ПолучитьЭлементы();
Для Каждого СтрокаДерева Из ЭлементыДерева Цикл
Элементы.ДеревоЭлементовБюджета.Развернуть(СтрокаДерева.ПолучитьИдентификатор(), Истина);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьСтроку(Команда)
ЯчейкиОбласти = ЯчейкиОбластиДляРедактирования(Бюджет.ТекущаяОбласть);
МассивСтрок = ЯчейкиОбласти.МассивСтрок;
Если Не МассивСтрок.Количество() Тогда
Возврат;
КонецЕсли;
ПараметрыРедактирования = ДобавитьСтрокуНаСервере(МассивСтрок, ПараметрыВыводаВидаБюджета);
ПараметрыРедактирования = ПреобразоватьПараметрыРедактированияВСтруктуру(ПараметрыРедактирования,
МассивСтрок,
Бюджет.ТекущаяОбласть.Верх);
Если ПараметрыРедактирования <> Неопределено Тогда
ДобавитьСтрокуВРежимеТаблицы(ПараметрыРедактирования);
Иначе
ТекстПредупреждения = НСтр("ru = 'Операция не доступна, аналитика не динамическая.'");
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьСтроку(Команда)
ЯчейкиОбласти = ЯчейкиОбластиДляРедактирования(Бюджет.ТекущаяОбласть);
МассивСтрок = ЯчейкиОбласти.МассивСтрок;
МассивОбластей = ЯчейкиОбласти.МассивОбластей;
Если Не МассивСтрок.Количество() Тогда
Возврат;
КонецЕсли;
УстановитьНадписьОбновленияИтогов(Истина);
ВыводитьИерархиюЭлементов = Ложь;
ПодчиненныеСтроки = ПолучитьПодчиненныеСтроки(МассивСтрок, , ВыводитьИерархиюЭлементов);
Если ПодчиненныеСтроки.Количество() > 0 Тогда
Область = Бюджет.ТекущаяОбласть;
Для Строка = Область.Низ + 1 По Бюджет.ВысотаТаблицы Цикл
Колонка = Область.Право;
ОбластьБюджета = Бюджет.Область(Строка, Колонка);
ЯчейкиПодчиненнойОбласти = ЯчейкиОбластиДляРедактирования(ОбластьБюджета);
МассивПодчиненныхСтрок = ЯчейкиПодчиненнойОбласти.МассивСтрок;
МассивПодчиненныхОбластей = ЯчейкиПодчиненнойОбласти.МассивОбластей;
ПрерватьПоиск = Ложь;
Для Каждого Стр Из МассивПодчиненныхСтрок Цикл
Если ПодчиненныеСтроки.Найти(Стр) = Неопределено Тогда
ПрерватьПоиск = Истина;
КонецЕсли;
КонецЦикла;
Если Не ПрерватьПоиск Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивСтрок, МассивПодчиненныхСтрок);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивОбластей, МассивПодчиненныхОбластей);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
СоответствиеРасшифровок = Новый Массив;
ИменаОбластей = Новый Массив;
Для Каждого ОбластьБюджета Из МассивОбластей Цикл
Для Сч = 2 По Бюджет.ШиринаТаблицы Цикл
ОбластьЗначения = Бюджет.Область(ОбластьБюджета.Низ, Сч);
СоответствиеРасшифровок.Добавить(ОбластьЗначения.Расшифровка);
ИменаОбластей.Добавить(ОбластьЗначения.Имя);
КонецЦикла;
КонецЦикла;
КоличествоПодчиненныхПоИерархииСтрок = 0;
Если ВыводитьИерархиюЭлементов Тогда
ПодчиненныеОбластиБюджета = Новый Соответствие;
ДополнитьПодчиненнымиОбластямиПоИерархии(ИменаОбластей, ПодчиненныеОбластиБюджета);
Для Каждого ПодчиненнаяОбласть Из ПодчиненныеОбластиБюджета Цикл
Область = Бюджет.Область("R" + ПодчиненнаяОбласть.Ключ + "C1:R" + ПодчиненнаяОбласть.Ключ + "C" + ПодчиненнаяОбласть.Значение);
ЯчейкиПодчиненнойОбласти = ЯчейкиОбластиДляРедактирования(Область);
МассивПодчиненныхСтрокБюджета = ЯчейкиПодчиненнойОбласти.МассивСтрок;
МассивПодчиненныхОбластейБюджета = ЯчейкиПодчиненнойОбласти.МассивОбластей;
Если Не МассивПодчиненныхСтрокБюджета.Количество() Тогда
Продолжить;
КонецЕсли;
ПодчиненныеСтроки = ПолучитьПодчиненныеСтроки(МассивПодчиненныхСтрокБюджета);
Если ПодчиненныеСтроки.Количество() > 0 Тогда
Для Строка = Область.Низ + 1 По Бюджет.ВысотаТаблицы Цикл
Колонка = Область.Право;
ОбластьБюджета = Бюджет.Область(Строка, Колонка);
ЯчейкиПодчиненнойОбласти = ЯчейкиОбластиДляРедактирования(ОбластьБюджета);
МассивПодчиненныхСтрок = ЯчейкиПодчиненнойОбласти.МассивСтрок;
МассивПодчиненныхОбластей = ЯчейкиПодчиненнойОбласти.МассивОбластей;
ПрерватьПоиск = Ложь;
Для Каждого Стр Из МассивПодчиненныхСтрок Цикл
Если ПодчиненныеСтроки.Найти(Стр) = Неопределено Тогда
ПрерватьПоиск = Истина;
КонецЕсли;
КонецЦикла;
Если Не ПрерватьПоиск Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПодчиненныхСтрокБюджета, МассивПодчиненныхСтрок);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПодчиненныхОбластейБюджета, МассивПодчиненныхОбластей);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Каждого ОбластьБюджета Из МассивПодчиненныхОбластейБюджета Цикл
Для Сч = 2 По Бюджет.ШиринаТаблицы Цикл
ОбластьЗначения = Бюджет.Область(ОбластьБюджета.Низ, Сч);
СоответствиеРасшифровок.Добавить(ОбластьЗначения.Расшифровка);
КонецЦикла;
КонецЦикла;
КоличествоПодчиненныхПоИерархииСтрок = КоличествоПодчиненныхПоИерархииСтрок + МассивПодчиненныхСтрокБюджета.Количество();
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивСтрок, МассивПодчиненныхСтрокБюджета);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивОбластей, МассивПодчиненныхОбластейБюджета);
КонецЦикла;
КонецЕсли;
СоответствиеРасшифровок = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(СоответствиеРасшифровок, АдресДанныхРасшифровки);
МассивРасшифровокПоСтрокам = Новый Массив;
Для Каждого ОбластьБюджета Из МассивОбластей Цикл
МассивРасшифровок = Новый Массив;
Для Сч = 2 По Бюджет.ШиринаТаблицы Цикл
ОбластьЗначения = Бюджет.Область(ОбластьБюджета.Низ, Сч);
Расшифровка = СоответствиеРасшифровок[ОбластьЗначения.Расшифровка];
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
Если Расшифровка.Свойство("СтатьяБюджетов")
ИЛИ Расшифровка.Свойство("ПоказательБюджетов")
ИЛИ Расшифровка.Свойство("РедактируемоеЗначение") Тогда
МассивРасшифровок.Добавить(Расшифровка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
МассивРасшифровокПоСтрокам.Добавить(Новый Структура("НомерСтроки, МассивРасшифровок", ОбластьБюджета.Низ, МассивРасшифровок));
КонецЦикла;
НужноПродолжатьСортировку = Истина;
Пока НужноПродолжатьСортировку Цикл
НужноПродолжатьСортировку = Ложь;
Для Сч = 0 По МассивРасшифровокПоСтрокам.ВГраница() - 1 Цикл
Если МассивРасшифровокПоСтрокам[Сч].НомерСтроки < МассивРасшифровокПоСтрокам[Сч + 1].НомерСтроки Тогда
НужноПродолжатьСортировку = Истина;
ЗначениеТекущее = МассивСтрок[Сч];
МассивСтрок[Сч] = МассивСтрок[Сч + 1];
МассивСтрок[Сч + 1] = ЗначениеТекущее;
ЗначениеТекущее = МассивРасшифровокПоСтрокам[Сч];
МассивРасшифровокПоСтрокам[Сч] = МассивРасшифровокПоСтрокам[Сч + 1];
МассивРасшифровокПоСтрокам[Сч + 1] = ЗначениеТекущее;
КонецЕсли;
КонецЦикла;
КонецЦикла;
УдаленоСтрок = 0;
УдалитьСтрокуНаСервере(МассивСтрок, МассивРасшифровокПоСтрокам, ПараметрыВыводаВидаБюджета, УдаленоСтрок, КоличествоПодчиненныхПоИерархииСтрок);
Если УдаленоСтрок = 0 Тогда
ТекстПредупреждения = НСтр("ru = 'Нельзя удалить выбранные строки.'");
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
ЗапуститьПроверкуРасчетаИзменений();
КонецПроцедуры
&НаСервере
Функция ПолучитьПодчиненныеСтроки(МассивСтрок, Знач ДеревоЭлементов=Неопределено, ВыводитьИерархиюЭлементов = Ложь)
ПерваяИтерация = Ложь;
Если ДеревоЭлементов = Неопределено Тогда
ДеревоЭлементов = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).ДеревоВывода;
ПерваяИтерация = Истина;
КонецЕсли;
МассивПодчиненныхСтрок = Новый Массив();
Для Сч = 0 По МассивСтрок.ВГраница() Цикл
ЭлементМассива = МассивСтрок[Сч];
Если ТипЗнч(ЭлементМассива) = Тип("СтрокаДереваЗначений") Тогда
ЭлементДерева = ЭлементМассива;
Иначе
ЭлементДерева = Неопределено;
НайденныеСтроки = ДеревоЭлементов.Строки.НайтиСтроки(Новый Структура("ЭлементОтчета", ЭлементМассива), Истина);
Если НайденныеСтроки.Количество() Тогда
ЭлементДерева = НайденныеСтроки[0];
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
Если ПерваяИтерация И Не ВыводитьИерархиюЭлементов Тогда
ВыводитьИерархиюЭлементов = ЭлементДерева.ВыводитьИерархиюЭлементов;
КонецЕсли;
Для Каждого Стр Из ЭлементДерева.Строки Цикл
Если ЗначениеЗаполнено(Стр.ЭлементОтчета) Тогда
МассивПодчиненныхСтрок.Добавить(Стр.ЭлементОтчета);
КонецЕсли;
МассивДобавляемыхСтрок = Новый Массив;
МассивДобавляемыхСтрок.Добавить(Стр);
ПорцияПодчиненныхСтрок = ПолучитьПодчиненныеСтроки(МассивДобавляемыхСтрок, ДеревоЭлементов);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПодчиненныхСтрок, ПорцияПодчиненныхСтрок);
КонецЦикла;
КонецЦикла;
Возврат МассивПодчиненныхСтрок;
КонецФункции
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция ПодготовитьПараметрыВыводаВидаБюджета()
СтруктураПараметров = БюджетнаяОтчетностьРасчетКэшаСервер.ПолучитьПараметрыВыводаВидаБюджета(
Объект.ВидБюджета, Перечисления.РежимыФормированияБюджетныхОтчетов.Документ);
ПараметрыВыводаВидаБюджета = ПоместитьВоВременноеХранилище(СтруктураПараметров, УникальныйИдентификатор);
АдресДанныхЯчеек = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
АдресПараметровРедактированияСтроки = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
АдресРедактируемыхЗначенийСтрокиСписка = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
ЕстьПериодичность = Ложь;
Если СтруктураПараметров <> Неопределено Тогда
ЕстьПериодичность = СтруктураПараметров.СтруктураКолонокТаблицыДанных.Периодичности.Количество();
КонецЕсли;
Элементы.СкопироватьПоПериодам.Видимость = ЕстьПериодичность;
Элементы.БюджетКонтекстноеМенюСкопироватьПоПериодам.Видимость = ЕстьПериодичность;
Элементы.СписокРедактированияБюджетаКонтекстноеМенюСкопироватьПоПериодам.Видимость = ЕстьПериодичность;
Возврат СтруктураПараметров;
КонецФункции
&НаКлиенте
Функция ПараметрыНеконтекстногоВызова(РезультатОтражения, Расшифровка, ИмяОбласти)
ПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураОбъектаДляРасчетаЯчейки();
ПараметрыРасчета.ВалютаСценария = ВалютаСценария;
ПараметрыРасчета.КэшПараметровСтатей = КэшПараметровСтатей;
ПараметрыРасчета.ТребоватьУказанияКурсовДляКаждогоПериода = ТребоватьУказанияКурсовДляКаждогоПериода;
ПараметрыРасчета.АдресТаблицыКурсов = АдресТаблицыКурсов;
ПараметрыРасчета.ПараметрыВыводаВидаБюджета = ПараметрыВыводаВидаБюджета;
ПараметрыРасчета.Вставить("ПараметрыОтчета", БюджетнаяОтчетностьКлиентСервер.ПараметрыПериода(Объект));
ПараметрыРасчета.Вставить("АдресДанныхЯчеек", АдресДанныхЯчеек);
ПараметрыРасчета.Вставить("ИмяОбласти", ИмяОбласти);
ПараметрыРасчета.Вставить("РезультатОтражения", РезультатОтражения);
ПараметрыРасчета.Вставить("АдресХранилища", АдресХранилища);
ПараметрыРасчета.Вставить("Расшифровка", Расшифровка);
Возврат ПараметрыРасчета;
КонецФункции
&НаСервереБезКонтекста
Функция БюджетПриИзмененииСервер(ПараметрыНеконтекстногоВызова)
РезультатВыполнения = БюджетнаяОтчетностьВыводСервер.РассчитатьСвязанныеСтатьиБюджетов(
ПараметрыНеконтекстногоВызова.ПараметрыВыводаВидаБюджета,
ПараметрыНеконтекстногоВызова.АдресДанныхЯчеек,
ПараметрыНеконтекстногоВызова.ПараметрыОтчета,
ПараметрыНеконтекстногоВызова.ИмяОбласти,
ПараметрыНеконтекстногоВызова.РезультатОтражения);
Если РезультатВыполнения = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
РезультатДляОтраженияНаКлиенте = Новый Массив;
Для Каждого СтрокаРезультата Из РезультатВыполнения.Результат Цикл
РезультатДляОтраженияНаКлиенте.Добавить(ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаРезультата));
КонецЦикла;
ПоместитьВоВременноеХранилище(РезультатВыполнения.ПараметрыВыводаВидаБюджета, ПараметрыНеконтекстногоВызова.ПараметрыВыводаВидаБюджета);
ПоместитьВоВременноеХранилище(РезультатВыполнения.ДанныеЯчеек, ПараметрыНеконтекстногоВызова.АдресДанныхЯчеек);
Возврат РезультатДляОтраженияНаКлиенте;
КонецФункции
&НаСервере
Процедура БюджетПриИзмененииСерверАвтоПересчет(ПараметрыНеконтекстногоВызова)
РезультатРасчета = БюджетПриИзмененииСервер(ПараметрыНеконтекстногоВызова);
Если РезультатРасчета <> Неопределено Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, РезультатРасчета);
КонецЕсли;
ОтразитьИзмененияБюджета( , ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПараметрыНеконтекстногоВызова.Расшифровка.Строка),
ПараметрыНеконтекстногоВызова.Расшифровка);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ЗагрузитьРезультатРасчетаИзмененийНаКлиенте(ОбъектИПараметрыРасчета, Бюджет, РезультатРасчета)
ЭлементСтруктура = Истина;
Если ТипЗнч(РезультатРасчета) <> Тип("Массив") Тогда
ЭлементСтруктура = Ложь;
ЕстьРасшифровка = РезультатРасчета.Колонки.Найти("Расшифровка") <> Неопределено;
КонецЕсли;
Для Каждого Изменение Из РезультатРасчета Цикл
Значение = ?(ЗначениеЗаполнено(Изменение.Значение), Изменение.Значение, Неопределено);
Если ЭлементСтруктура Тогда
ЕстьРасшифровка = Изменение.Свойство("Расшифровка");
КонецЕсли;
Если ЕстьРасшифровка Тогда
БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Изменение.Расшифровка, Значение);
Если ЗначениеЗаполнено(Изменение.ИмяОбласти) Тогда
Область = Бюджет.Область(Изменение.ИмяОбласти);
Если Область.СодержитЗначение Тогда
Область.Значение = Значение;
Иначе
Область.Текст = Значение;
КонецЕсли;
КонецЕсли;
Иначе
Область = Бюджет.Область(Изменение.ИмяОбласти);
Если Область.СодержитЗначение Тогда
Область.Значение = Значение;
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(Область.Расшифровка,
ОбъектИПараметрыРасчета.АдресДанныхРасшифровки);
БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, Значение);
Иначе
Область.Текст = Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ВосстановитьРазмерыЯчеек()
ШиринаКолонок = ХранилищеНастроекДанныхФорм.Загрузить(ИмяФормы, "ШиринаКолонок_" + Объект.Ссылка.УникальныйИдентификатор());
Если ШиринаКолонок <> Неопределено Тогда
Для НомерКолонки = 1 По ШиринаКолонок.Количество() Цикл
ШиринаКолонки = ШиринаКолонок.Получить(НомерКолонки - 1).Значение;
Бюджет.Область(, НомерКолонки, , НомерКолонки).ШиринаКолонки = ШиринаКолонки;
КонецЦикла;
КонецЕсли;
ВысотаСтрок = ХранилищеНастроекДанныхФорм.Загрузить(ИмяФормы, "ВысотаСтрок_" + Объект.Ссылка.УникальныйИдентификатор());
Если ВысотаСтрок <> Неопределено Тогда
Для НомерСтроки = 1 По ВысотаСтрок.Количество() Цикл
ВысотаСтроки = ВысотаСтрок.Получить(НомерСтроки - 1).Значение;
Если ВысотаСтроки <> 0 Тогда
ИзменяемаяСтрока = Бюджет.Область(НомерСтроки, , НомерСтроки, );
ИзменяемаяСтрока.АвтоВысотаСтроки = Ложь;
ИзменяемаяСтрока.ВысотаСтроки = ВысотаСтроки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПараметрыРедактированияСтроки(МассивСтрок, АдресПараметровВидаБюджета, Добавление)
ДеревоЭлементов = ПолучитьИзВременногоХранилища(АдресПараметровВидаБюджета).ДеревоВывода;
Результат = Новый Соответствие;
Для Каждого ТекущаяСтрока Из МассивСтрок Цикл
ПараметрыРедактируемойСтроки = ДеревоЭлементов.Строки.Найти(ТекущаяСтрока, "ЭлементОтчета", Истина);
ПерваяСтрока = ПараметрыРедактируемойСтроки;
Пока ПерваяСтрока.ВыводитьВместеСРодительским Цикл
ПерваяСтрока = ПерваяСтрока.Родитель;
КонецЦикла;
МассивВидовАналитик = Новый Массив;
Пока Истина Цикл
Если ПерваяСтрока.РедактируемыеЗначения Тогда
МассивВидовАналитик.Добавить(ПерваяСтрока.ВидАналитики);
КонецЕсли;
Если Не ПерваяСтрока.ВыводитьВместеСПодчиненным Тогда
Прервать;
КонецЕсли;
ПерваяСтрока = ПерваяСтрока.Строки[0];
КонецЦикла;
Если МассивВидовАналитик.Количество() Тогда
Результат.Вставить(ПерваяСтрока.ЭлементОтчета, МассивВидовАналитик);
Если Добавление Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ЯчейкиОбластиДляРедактирования(Область)
СоответствиеРасшифровок = Новый Массив;
Для Строка = Область.Верх По Область.Низ Цикл
Для Колонка = 1 По Область.Право Цикл
ОбластьБюджета = Бюджет.Область(Строка, Колонка);
Расшифровка = ОбластьБюджета.Расшифровка;
СоответствиеРасшифровок.Добавить(Расшифровка);
КонецЦикла;
КонецЦикла;
СоответствиеРасшифровок = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(СоответствиеРасшифровок, АдресДанныхРасшифровки);
МассивСтрок = Новый Массив;
МассивОбластей = Новый Массив;
Для Строка = Область.Верх По Область.Низ Цикл
Для Колонка = 1 По Область.Право Цикл
ОбластьБюджета = Бюджет.Область(Строка, Колонка);
Расшифровка = СоответствиеРасшифровок[ОбластьБюджета.Расшифровка];
Если ТипЗнч(Расшифровка) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Если Расшифровка.Свойство("Колонка") Тогда
Прервать;
КонецЕсли;
Если Расшифровка.Свойство("Строка") Тогда
МассивСтрок.Добавить(Расшифровка["Строка"]);
МассивОбластей.Добавить(ОбластьБюджета);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Новый Структура("МассивСтрок, МассивОбластей", МассивСтрок, МассивОбластей);
КонецФункции
&НаСервере
Процедура ДополнитьПодчиненнымиОбластямиПоИерархии(ИменаОбластей, ПодчиненныеОбластиБюджета, ДанныеЯчеек = Неопределено)
ПерваяИтерация = Ложь;
Если ДанныеЯчеек = Неопределено Тогда
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
ПерваяИтерация = Истина;
КонецЕсли;
ИменаПодчиненныхЯчеек = Новый Массив;
ВидыОбластейРесурсов = Новый Массив;
ВидыОбластейРесурсов.Добавить("ИмяОбластиСумма");
ВидыОбластейРесурсов.Добавить("ИмяОбластиКоличество");
ВидыОбластейРесурсов.Добавить("ИмяОбластиЗначение");
СтруктураПоиска = Новый Структура;
Для Каждого ИмяОбласти Из ИменаОбластей Цикл
Если СтрНайти(ИмяОбласти, ":") > 0 Тогда
Продолжить;
КонецЕсли;
Для Каждого ВидОбластиРесурса Из ВидыОбластейРесурсов Цикл
СтруктураПоиска.Очистить();
СтруктураПоиска.Вставить(ВидОбластиРесурса + "Иерархия", ИмяОбласти);
СтрокиДанныхЯчеек = ДанныеЯчеек.НайтиСтроки(СтруктураПоиска);
Для Каждого СтрокаДанныхЯчеек Из СтрокиДанныхЯчеек Цикл
ИмяПодчиненнойЯчейки = СтрокаДанныхЯчеек[ВидОбластиРесурса];
ИменаПодчиненныхЯчеек.Добавить(ИмяПодчиненнойЯчейки);
МассивАдреса = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(ИмяПодчиненнойЯчейки, "R", ""), "C");
НомерКолонки = СтрЗаменить(МассивАдреса[1], "C", "");
ПраваяГраницаОбласти = ПодчиненныеОбластиБюджета.Получить(МассивАдреса[0]);
Если ПраваяГраницаОбласти = Неопределено
Или Число(ПраваяГраницаОбласти) < Число(НомерКолонки) Тогда
ПодчиненныеОбластиБюджета.Вставить(МассивАдреса[0], НомерКолонки);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ДополнитьПодчиненнымиОбластямиПоИерархии(ИменаПодчиненныхЯчеек, ПодчиненныеОбластиБюджета, ДанныеЯчеек);
КонецЦикла;
Если ПерваяИтерация Тогда
ДанныеЯчеек = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьПодчиненныеЭлементыРекурсивно(СтрокаОтчета, МассивПодчиненныхЭлементов, НачальныйИндекс = Неопределено)
Для Каждого СтрокаДерева Из СтрокаОтчета.Строки Цикл
Если НачальныйИндекс <> Неопределено Тогда
Если СтрокаОтчета.Строки.Индекс(СтрокаОтчета) <= НачальныйИндекс Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
МассивПодчиненныхЭлементов.Добавить(СтрокаДерева.ЭлементОтчета);
ЗаполнитьПодчиненныеЭлементыРекурсивно(СтрокаДерева, МассивПодчиненныхЭлементов)
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДобавитьСтрокуНаСервере(МассивСтрок, АдресПараметровВидаБюджета)
ДеревоЭлементов =
ПолучитьИзВременногоХранилища(АдресПараметровВидаБюджета).ДеревоВывода;
ПараметрыРедактирования = ПараметрыРедактированияСтроки(МассивСтрок, АдресПараметровВидаБюджета, Истина);
Если Не ПараметрыРедактирования.Количество() Тогда
Для Каждого ТекущаяСтрока Из МассивСтрок Цикл
СтрокаОтчета = ДеревоЭлементов.Строки.Найти(ТекущаяСтрока, "ЭлементОтчета", Истина);
МассивПодчиненныхЭлементов = Новый Массив;
ЗаполнитьПодчиненныеЭлементыРекурсивно(СтрокаОтчета, МассивПодчиненныхЭлементов);
ПараметрыРедактирования = ПараметрыРедактированияСтроки(МассивПодчиненныхЭлементов, АдресПараметровВидаБюджета, Истина);
Если ПараметрыРедактирования.Количество() Тогда
Прервать;
КонецЕсли;
РодительСтроки = СтрокаОтчета.Родитель;
ЗаполнитьПодчиненныеЭлементыРекурсивно(РодительСтроки, МассивПодчиненныхЭлементов, РодительСтроки.Строки.Индекс(СтрокаОтчета));
ПараметрыРедактирования = ПараметрыРедактированияСтроки(МассивПодчиненныхЭлементов, АдресПараметровВидаБюджета, Истина);
Если ПараметрыРедактирования.Количество() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ПараметрыРедактирования;
КонецФункции
&НаСервере
Процедура УдалитьСтрокуНаСервере(МассивСтрок, МассивРасшифровокПоСтрокам, АдресПараметровВидаБюджета, УдаленоСтрок, КоличествоПодчиненныхПоИерархииСтрок)
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
ДеревоЭлементов = ПолучитьИзВременногоХранилища(АдресПараметровВидаБюджета).ДеревоВывода;
МинимальнаяУдаляемаяСтрока = Неопределено;
ВидыОбластейРесурсов = Новый Массив;
ВидыОбластейРесурсов.Добавить("ИмяОбластиСумма");
ВидыОбластейРесурсов.Добавить("ИмяОбластиКоличество");
ВидыОбластейРесурсов.Добавить("ИмяОбластиЗначение");
ВыводитьИерархиюЭлементов = Ложь;
Для Сч = 0 По МассивСтрок.ВГраница() Цикл
ЭлементМассива = МассивСтрок[Сч];
НайденныеСтроки = ДеревоЭлементов.Строки.НайтиСтроки(Новый Структура("ЭлементОтчета", ЭлементМассива), Истина);
Если НайденныеСтроки.Количество() > 0 И Не ВыводитьИерархиюЭлементов Тогда
ВыводитьИерархиюЭлементов = НайденныеСтроки[0].ВыводитьИерархиюЭлементов;
КонецЕсли;
МожноУдалитьСтроку = Не (НайденныеСтроки.Количество() > 0 И НайденныеСтроки[0].Строки.Количество() > 0)
И МассивСтрок.Количество() - КоличествоПодчиненныхПоИерархииСтрок = 1;
Если МожноУдалитьСтроку Тогда
МожноУдалитьСтроку = Не ЗначениеЗаполнено(ЭлементМассива.ЗначениеАналитики);
КонецЕсли;
ОписаниеСтроки = МассивРасшифровокПоСтрокам[Сч];
МассивРасшифровок = ОписаниеСтроки.МассивРасшифровок;
ПараметрыРедактирования = ПараметрыРедактированияСтроки(
ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭлементМассива),
АдресПараметровВидаБюджета,
Ложь);
ЗначенияАналитик = Неопределено;
Для Каждого КлючИЗначение Из ПараметрыРедактирования Цикл
ЗначенияАналитик = КлючИЗначение.Значение;
Прервать;
КонецЦикла;
Если ЗначенияАналитик = Неопределено И МассивРасшифровок.Количество() > 0 И НайденныеСтроки.Количество() > 0 Тогда
Если МассивРасшифровок[0].Свойство("ЗначенияАналитик") И МассивРасшифровок[0].ЗначенияАналитик.Количество()
> 0 Тогда
ЗначенияАналитик = Новый Массив();
Для Каждого КлючЗначение Из МассивРасшифровок[0].ЗначенияАналитик Цикл
ЗначенияАналитик.Добавить(КлючЗначение.Ключ);
КонецЦикла;
КонецЕсли;
Если НайденныеСтроки[0].ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.Измерение
И СтрНайти(НайденныеСтроки[0].ИмяИзмерения, "Период") Тогда
МожноУдалитьСтроку = Ложь;
КонецЕсли;
КонецЕсли;
Если ЗначенияАналитик = Неопределено Тогда
Продолжить;
КонецЕсли;
ЭтоПустаяСтрока = Ложь;
Для Каждого Расшифровка Из МассивРасшифровок Цикл
Если Не ЭтоПустаяСтрока Тогда
ЕстьЗаполненныеАналитики = Ложь;
Для Каждого ВидРедактируемойАналитики Из ЗначенияАналитик Цикл
Если ЗначениеЗаполнено(Расшифровка.ЗначенияАналитик[ВидРедактируемойАналитики]) Тогда
ЕстьЗаполненныеАналитики = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЕстьЗаполненныеАналитики Тогда
ЭтоПустаяСтрока = Истина;
КонецЕсли;
КонецЕсли;
БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, 0, "");
СтруктураПоиска = Новый Структура("Строка, Колонка");
Если Расшифровка.Свойство("СтатьяБюджетов") Тогда
СтруктураПоиска.Вставить("СтатьяБюджетов");
КонецЕсли;
Для Каждого ЗначениеПериодичности Из Перечисления.Периодичность Цикл
ПериодСтрокой = ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(ЗначениеПериодичности).Период;
Если Расшифровка.Свойство(ПериодСтрокой) Тогда
СтруктураПоиска.Вставить(ПериодСтрокой);
КонецЕсли;
КонецЦикла;
ЗаполнитьЗначенияСвойств(СтруктураПоиска, Расшифровка);
Для Каждого ЗначениеАналитики Из Расшифровка.ЗначенияАналитик Цикл
СтруктураПоиска.Вставить(
ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(ЗначениеАналитики.Ключ), ЗначениеАналитики.Значение);
КонецЦикла;
НайденныеСтроки = ДанныеЯчеек.НайтиСтроки(СтруктураПоиска);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если ЭтоПустаяСтрока ИЛИ НЕ МожноУдалитьСтроку Тогда
Для каждого ВидОбластиРесурса Из ВидыОбластейРесурсов Цикл
ИмяОбласти = "";
Если ЗначениеЗаполнено(НайденнаяСтрока[ВидОбластиРесурса]) Тогда
ИмяОбласти = НайденнаяСтрока[ВидОбластиРесурса];
КонецЕсли;
Если ЗначениеЗаполнено(ИмяОбласти) Тогда
Если Бюджет.Область(ИмяОбласти).Защита Тогда
Бюджет.Область(ИмяОбласти).Текст = "";
Иначе
Бюджет.Область(ИмяОбласти).Значение = Неопределено;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НайденнаяСтрока.Сумма = Неопределено;
НайденнаяСтрока.СуммаВал = Неопределено;
НайденнаяСтрока.Количество = Неопределено;
НайденнаяСтрока.Значение = Неопределено;
Иначе
ДанныеЯчеек.Удалить(НайденнаяСтрока);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Не ЭтоПустаяСтрока И МожноУдалитьСтроку Тогда
Если МинимальнаяУдаляемаяСтрока = Неопределено Тогда
МинимальнаяУдаляемаяСтрока = ОписаниеСтроки.НомерСтроки;
Иначе
МинимальнаяУдаляемаяСтрока = Мин(МинимальнаяУдаляемаяСтрока, ОписаниеСтроки.НомерСтроки);
КонецЕсли;
УдаленоСтрок = УдаленоСтрок + 1;
УдаляемаяОбласть = Бюджет.Область(ОписаниеСтроки.НомерСтроки, , ОписаниеСтроки.НомерСтроки);
Бюджет.УдалитьОбласть(УдаляемаяОбласть, ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
Если Не ЭтоПустаяСтрока И МожноУдалитьСтроку Тогда
СтруктураПараметровВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
СтруктураОписанияОтчета = СтруктураПараметровВывода.СтруктураОписанияОтчета;
КонечнаяСтрока = КонечнаяСтрокаДереваВывода(ЭлементМассива, СтруктураОписанияОтчета.ТаблицаПодчиненностиЭлементов);
Если Не ЗначениеЗаполнено(КонечнаяСтрока) Тогда
ТекстОшибки = НСтр("ru = 'Ошибка в структуре вида бюджета'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
СтруктураЯчеек = СтруктураОписанияОтчета.СтруктураЯчеек;
НайденныеСтроки = СтруктураЯчеек.НайтиСтроки(Новый Структура("ОсновнойЭлемент, Строка", Истина, КонечнаяСтрока));
СтруктураИзмерений = Новый Структура;
Для Каждого Расшифровка Из МассивРасшифровок Цикл
ЗаполненыАналитики = Ложь;
Для Каждого КлючИЗначение Из Расшифровка.ЗначенияАналитик Цикл
СтруктураИзмерений.Вставить(ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(
КлючИЗначение.Ключ), КлючИЗначение.Значение);
ЗаполненыАналитики = Истина;
КонецЦикла;
Если ЗаполненыАналитики Тогда
Прервать;
КонецЕсли;
КонецЦикла;
СтруктураПоиска = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(СтруктураИзмерений);
СтруктураПоиска.Вставить("ОсновнойЭлемент", Истина);
Для Каждого СтрокаСтруктурыЯчеек Из НайденныеСтроки Цикл
СтруктураПоиска.Вставить("Строка", СтрокаСтруктурыЯчеек.Строка);
СтруктураПоиска.Вставить("Колонка", СтрокаСтруктурыЯчеек.Колонка);
СтрокиПроверки = ДанныеЯчеек.НайтиСтроки(СтруктураПоиска);
Для Каждого СтрокаНаУдаление Из СтрокиПроверки Цикл
ДанныеЯчеек.Удалить(СтрокаНаУдаление);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если УдаленоСтрок Тогда
Если ВыводитьИерархиюЭлементов Тогда
СформироватьОтчетСервер();
Возврат;
КонецЕсли;
СместитьЯчейкиДанныхЯчеек(ДанныеЯчеек, МинимальнаяУдаляемаяСтрока, -УдаленоСтрок);
КонецЕсли;
ОбновленыДанныеЯчеек = Ложь;
ОтразитьИзмененияБюджета(, , , ОбновленыДанныеЯчеек);
Если Не ОбновленыДанныеЯчеек Тогда
ПоместитьВоВременноеХранилище(ДанныеЯчеек, АдресДанныхЯчеек);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СместитьЯчейкиДанныхЯчеек(ДанныеЯчеек, НомерВерхнейСтроки, КоличествоСтрок)
ВидыОбластейРесурсов = Новый Массив;
ВидыОбластейРесурсов.Добавить("ИмяОбластиСумма");
ВидыОбластейРесурсов.Добавить("ИмяОбластиКоличество");
ВидыОбластейРесурсов.Добавить("ИмяОбластиЗначение");
Для Каждого СтрокаДанныхЯчеек Из ДанныеЯчеек Цикл
Для каждого ВидОбластиРесурсов Из ВидыОбластейРесурсов Цикл
ИмяОбласти = Неопределено;
Если ЗначениеЗаполнено(СтрокаДанныхЯчеек[ВидОбластиРесурсов]) Тогда
ИмяОбласти = СтрокаДанныхЯчеек[ВидОбластиРесурсов];
КонецЕсли;
Если Не ЗначениеЗаполнено(ИмяОбласти) Тогда
Продолжить;
КонецЕсли;
ИмяОбласти = СтрЗаменить(ИмяОбласти, "R", "");
МассивАдреса = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяОбласти, "C");
НомерСтроки = Число(МассивАдреса[0]);
Если НомерСтроки >= НомерВерхнейСтроки Тогда
НомерСтроки = НомерСтроки + КоличествоСтрок;
ИмяОбласти = "R" + НомерСтроки + "C" + МассивАдреса[1];
Если ЗначениеЗаполнено(СтрокаДанныхЯчеек.ИмяОбластиСумма)
И ВидОбластиРесурсов = "ИмяОбластиСумма" Тогда
СтрокаДанныхЯчеек.ИмяОбластиСумма = ИмяОбласти;
ИначеЕсли ЗначениеЗаполнено(СтрокаДанныхЯчеек.ИмяОбластиКоличество)
И ВидОбластиРесурсов = "ИмяОбластиКоличество" Тогда
СтрокаДанныхЯчеек.ИмяОбластиКоличество = ИмяОбласти;
ИначеЕсли ЗначениеЗаполнено(СтрокаДанныхЯчеек.ИмяОбластиЗначение)
И ВидОбластиРесурсов = "ИмяОбластиЗначение" Тогда
СтрокаДанныхЯчеек.ИмяОбластиЗначение = ИмяОбласти;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьСтрокуВРежимеТаблицы(ПараметрыРедактированияОбласти)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("МассивВидовАналитик", ПараметрыРедактированияОбласти.РедактируемыеАналитики);
ПараметрыФормы.Вставить("ЗначенияАналитик", ПараметрыРедактированияОбласти.Расшифровка.ЗначенияАналитик);
НайденнаяСтрока = ФинансоваяОтчетностьКлиент.ПодчиненныйЭлементЭлементаФормы(ДеревоЭлементовБюджета,
"ИДГруппировки", ПараметрыРедактированияОбласти.Расшифровка.ИДГруппировки);
ПодчиненнаяРасшифровка = ПолучитьПодчиненнуюРасшифровкуСтрокиДереваЭлементовБюджета(НайденнаяСтрока);
ПараметрыФормы.Вставить("ПодчиненнаяРасшифровка", ПодчиненнаяРасшифровка);
ПараметрыФормы.Вставить("АдресДанныхРасшифровки", АдресДанныхРасшифровки);
ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьСтрокуВБюджетЗавершение", ЭтотОбъект, ПараметрыРедактированияОбласти);
ОткрытьФорму("Документ.ЭкземплярБюджета.Форма.ВводСтрокиСАналитикой", ПараметрыФормы,,,,,
ОписаниеОповещения,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Функция ПолучитьПодчиненнуюРасшифровкуСтрокиДереваЭлементовБюджета(ДеревоЭлементов)
МассивРасшифровок = Новый Массив();
Для Каждого СтрокаДерева Из ДеревоЭлементов.ПолучитьЭлементы() Цикл
Если ЗначениеЗаполнено(СтрокаДерева.Расшифровка) И ТипЗнч(СтрокаДерева.Расшифровка) = Тип("Число") Тогда
МассивРасшифровок.Добавить(СтрокаДерева.Расшифровка);
КонецЕсли;
ПодчиненнаяРасшифровка = ПолучитьПодчиненнуюРасшифровкуСтрокиДереваЭлементовБюджета(СтрокаДерева);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивРасшифровок,ПодчиненнаяРасшифровка);
КонецЦикла;
Возврат МассивРасшифровок;
КонецФункции
&НаКлиенте
Функция ЗначениеРасшифровкиИзСоответствияРасшифровок(СоответствиеРасшифровок, ИдентификаторРасшифровки)
Возврат СоответствиеРасшифровок[ИдентификаторРасшифровки];
КонецФункции
&НаКлиенте
Функция ПреобразоватьПараметрыРедактированияВСтруктуру(ПараметрыРедактирования, МассивСтрок, НачалоОбластиПросмотра)
ВозвращаемоеЗначение = Неопределено;
Для Каждого КлючИЗначение Из ПараметрыРедактирования Цикл
Шаг = 5;
ТекущееНачало = НачалоОбластиПросмотра;
НайденнаяРасшифровка = Неопределено;
Пока ТекущееНачало <= Бюджет.ВысотаТаблицы Цикл
Окончание = Мин(ТекущееНачало + Шаг, Бюджет.ВысотаТаблицы);
СоответствиеРасшифровок = Новый Массив;
Для Сч = ТекущееНачало По Окончание Цикл
Для Колонка = 1 По Бюджет.ШиринаТаблицы Цикл
ОбластьБюджета = Бюджет.Область(Сч, Колонка);
СоответствиеРасшифровок.Добавить(ОбластьБюджета.Расшифровка);
КонецЦикла;
КонецЦикла;
СоответствиеРасшифровок = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(СоответствиеРасшифровок, АдресДанныхРасшифровки);
Для Сч = ТекущееНачало По Окончание Цикл
ИДГруппировки = Неопределено;
Для Колонка = 1 По Бюджет.ШиринаТаблицы Цикл
ОбластьБюджета = Бюджет.Область(Сч, Колонка);
Расшифровка = ЗначениеРасшифровкиИзСоответствияРасшифровок(СоответствиеРасшифровок,
ОбластьБюджета.Расшифровка);
Если ТипЗнч(Расшифровка) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Если Расшифровка.Свойство("ИДГруппировки")
И ИДГруппировки = Неопределено Тогда
ИДГруппировки = Расшифровка.ИДГруппировки;
КонецЕсли;
Если Расшифровка.Свойство("Строка") Тогда
Если Расшифровка["Строка"] <> КлючИЗначение.Ключ Тогда
Продолжить;
КонецЕсли;
НайденнаяРасшифровка = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Расшифровка);
НайденнаяРасшифровка.Вставить("ИДГруппировки", ИДГруппировки);
Прервать;
КонецЕсли;
КонецЦикла;
Если НайденнаяРасшифровка <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если НайденнаяРасшифровка <> Неопределено Тогда
Прервать;
КонецЕсли;
ТекущееНачало = ТекущееНачало + Шаг + 1;
КонецЦикла;
Если НайденнаяРасшифровка <> Неопределено Тогда
ВозвращаемоеЗначение = Новый Структура();
ВозвращаемоеЗначение.Вставить("РедактируемыеАналитики", КлючИЗначение.Значение);
ВозвращаемоеЗначение.Вставить("Расшифровка", НайденнаяРасшифровка);
ВозвращаемоеЗначение.Вставить("ОбластьБюджета", ОбластьБюджета.Низ);
ВозвращаемоеЗначение.Вставить("Строка", КлючИЗначение.Ключ);
КонецЕсли;
КонецЦикла;
Возврат ВозвращаемоеЗначение;
КонецФункции
&НаКлиенте
Процедура ДобавитьСтрокуВБюджетЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
РезультатВставки = ВставитьОбластьНаСервере(Результат, ДополнительныеПараметры);
Если РезультатВставки = "ДублиСтрок" Тогда
ТекстПредупреждения = НСтр("ru = 'Строка с такими значениями уже есть в бюджете'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Иначе
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция КонечнаяСтрокаДереваВывода(Строка, ТаблицаПодчиненности)
НайденныеСтроки = ТаблицаПодчиненности.НайтиСтроки(Новый Структура("Родитель", Строка));
Если НайденныеСтроки.Количество() = 1 Тогда
СтрокаИерархии = НайденныеСтроки[0];
Если Не ЗначениеЗаполнено(СтрокаИерархии.Ссылка) Тогда
Возврат Строка;
Иначе
Результат = КонечнаяСтрокаДереваВывода(СтрокаИерархии.Ссылка, ТаблицаПодчиненности);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Иначе
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Результат = КонечнаяСтрокаДереваВывода(НайденнаяСтрока.Ссылка, ТаблицаПодчиненности);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецФункции
&НаСервере
Функция ВставитьОбластьНаСервере(СоответствиеИзмерений, ДополнительныеПараметры)
СтатусВставки = "";
СтрокаЯчейки = ДополнительныеПараметры.Строка;
Расшифровка = ДополнительныеПараметры.Расшифровка;
СтруктураПараметровВывода = ПолучитьИзВременногоХранилища(
ПараметрыВыводаВидаБюджета);
СтруктураОписанияОтчета = СтруктураПараметровВывода.СтруктураОписанияОтчета;
СтруктураКолонокТаблицыДанных = СтруктураПараметровВывода.СтруктураКолонокТаблицыДанных;
КонечнаяСтрока = КонечнаяСтрокаДереваВывода(СтрокаЯчейки, СтруктураОписанияОтчета.ТаблицаПодчиненностиЭлементов);
Если Не ЗначениеЗаполнено(КонечнаяСтрока) Тогда
ТекстПредупреждения = НСтр("ru = 'Ошибка в структуре вида бюджета'");
ВызватьИсключение ТекстПредупреждения;
КонецЕсли;
НайденныеСтроки = СтруктураОписанияОтчета.СтруктураЯчеек.НайтиСтроки(Новый Структура("ОсновнойЭлемент, Строка", Истина, КонечнаяСтрока));
ДанныеЯчеек = ПолучитьИзВременногоХранилища(АдресДанныхЯчеек);
СтруктураИзмерений = Новый Структура;
Для Каждого КлючИЗначение Из Расшифровка.ЗначенияАналитик Цикл
СтруктураИзмерений.Вставить(ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(КлючИЗначение.Ключ), КлючИЗначение.Значение);
КонецЦикла;
Для Каждого КлючИЗначение Из СоответствиеИзмерений Цикл
СтруктураИзмерений.Вставить(ФинансоваяОтчетностьПовтИсп.ИмяПоляБюджетногоОтчета(КлючИЗначение.Ключ), КлючИЗначение.Значение);
КонецЦикла;
СтруктураПоиска = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураИзмерений);
СтруктураПоиска.Вставить("ОсновнойЭлемент", Истина);
Для Каждого СтрокаСтруктурыЯчеек Из НайденныеСтроки Цикл
СтруктураПоиска.Вставить("Строка", СтрокаСтруктурыЯчеек.Строка);
СтруктураПоиска.Вставить("Колонка", СтрокаСтруктурыЯчеек.Колонка);
Для Каждого Измерение Из СтруктураИзмерений Цикл
Если Не ЗначениеЗаполнено(СтруктураПоиска[Измерение.Ключ])
И ЗначениеЗаполнено(СтрокаСтруктурыЯчеек[Измерение.Ключ]) Тогда
СтруктураПоиска.Вставить(Измерение.Ключ, СтрокаСтруктурыЯчеек[Измерение.Ключ]);
КонецЕсли;
КонецЦикла;
СтрокиПроверки = ДанныеЯчеек.НайтиСтроки(СтруктураПоиска);
Если СтрокиПроверки.Количество() Тогда
СтрокаПараметровЯчеек = СтруктураОписанияОтчета.ПараметрыЯчеек.Найти(СтрокаСтруктурыЯчеек.ИндексСтроки, "ИндексСтроки");
Если СтрокаПараметровЯчеек.ФлагКоличество Тогда
ЕстьДублиСтрок = Ложь;
Для Каждого СтрокаПроверки Из СтрокиПроверки Цикл
Если Не ПустаяСтрока(СтрокаПроверки.ИмяОбластиКоличество) Тогда
ЕстьДублиСтрок = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьДублиСтрок Тогда
СтатусВставки = "ДублиСтрок";
Возврат СтатусВставки;
КонецЕсли;
КонецЕсли;
Если СтрокаПараметровЯчеек.ФлагСумма Тогда
ЕстьДублиСтрок = Ложь;
Для Каждого СтрокаПроверки Из СтрокиПроверки Цикл
Если Не ПустаяСтрока(СтрокаПроверки.ИмяОбластиСумма) Тогда
ЕстьДублиСтрок = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьДублиСтрок Тогда
СтатусВставки = "ДублиСтрок";
Возврат СтатусВставки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Периодичности = СтруктураКолонокТаблицыДанных.Периодичности;
ТаблицаПериодов = БюджетнаяОтчетностьВыводСервер.ТаблицаПериодов(Периодичности, Объект.НачалоПериода, Объект.ОкончаниеПериода);
Если Не Периодичности.Количество() Тогда
ТаблицаПериодов.Добавить();
КонецЕсли;
ПериодичностиСтрокой = Новый Массив;
Для Каждого Периодичность Из Периодичности Цикл
ПериодичностиСтрокой.Добавить(ФинансоваяОтчетностьКлиентСервер.СтрокиПериода(Периодичность).Период);
КонецЦикла;
СтрокиДереваВывода = СтруктураПараметровВывода.ДеревоВывода.Строки.Найти("Строки", "ИмяИзмерения", Истина);
Если СтрокиДереваВывода <> Неопределено Тогда
Для Каждого ПериодичностьСтрокой Из ПериодичностиСтрокой Цикл
Если Расшифровка.Свойство(ПериодичностьСтрокой)
И ЗначениеЗаполнено(Расшифровка[ПериодичностьСтрокой])
И СтрокиДереваВывода.Строки.Найти(ПериодичностьСтрокой, "ИмяИзмерения", Истина) <> Неопределено Тогда
СтруктураИзмерений.Вставить(ПериодичностьСтрокой, Расшифровка[ПериодичностьСтрокой]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
СтруктураПоиска = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураИзмерений);
СтруктураПоиска.Вставить("ОсновнойЭлемент", Истина);
СтруктураПоискаПроверка = Новый Структура("ОсновнойЭлемент", Истина);
Для Каждого СтрокаСтруктурыЯчеек Из НайденныеСтроки Цикл
СтруктураПоиска.Вставить("Строка", СтрокаСтруктурыЯчеек.Строка);
СтруктураПоиска.Вставить("Колонка", СтрокаСтруктурыЯчеек.Колонка);
ДобавленныеПериоды = Новый Соответствие();
Для Каждого СтрокаПериодов Из ТаблицаПериодов Цикл
ПериодСтрокой = ";";
СтруктураПоискаПроверка.Вставить("Строка", СтрокаСтруктурыЯчеек.Строка);
СтруктураПоискаПроверка.Вставить("Колонка", СтрокаСтруктурыЯчеек.Колонка);
Для Каждого ПериодичностьСтрокой Из ПериодичностиСтрокой Цикл
Если СтруктураИзмерений.Свойство(ПериодичностьСтрокой)
И СтруктураИзмерений[ПериодичностьСтрокой] <> СтрокаПериодов[ПериодичностьСтрокой] Тогда
Продолжить;
КонецЕсли;
СтруктураПоискаПроверка.Вставить(ПериодичностьСтрокой, СтрокаПериодов[ПериодичностьСтрокой]);
Если ДанныеЯчеек.НайтиСтроки(СтруктураПоискаПроверка).Количество() > 0 Тогда
СтруктураПоиска.Вставить(ПериодичностьСтрокой, СтрокаПериодов[ПериодичностьСтрокой]);
ПериодСтрокой = ПериодСтрокой + ПериодичностьСтрокой
+"{" + Строка(СтрокаПериодов[ПериодичностьСтрокой]) + "};";
Иначе
Если СтруктураПоиска.Свойство(ПериодичностьСтрокой) Тогда
СтруктураПоиска.Удалить(ПериодичностьСтрокой);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ДобавленныеПериоды.Получить(ПериодСтрокой) = Неопределено Тогда
Если ПериодСтрокой = ";" Тогда
Для Каждого ПериодичностьСтрокой Из ПериодичностиСтрокой Цикл
СтруктураПоискаПроверка.Удалить(ПериодичностьСтрокой);
КонецЦикла;
СтрокиДанныеЯчеек = ДанныеЯчеек.НайтиСтроки(СтруктураПоискаПроверка);
Если СтрокиДанныеЯчеек.Количество() > 0 Тогда
Для Каждого ПериодичностьСтрокой Из ПериодичностиСтрокой Цикл
СтруктураПоиска.Вставить(ПериодичностьСтрокой, СтрокиДанныеЯчеек[0][ПериодичностьСтрокой]);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если ДанныеЯчеек.НайтиСтроки(СтруктураПоиска).Количество() = 0 Тогда
НоваяСтрока = БюджетнаяОтчетностьВыводСервер.ДобавитьСтрокуДанныхЯчеек(
ДанныеЯчеек,
СтрокаСтруктурыЯчеек,
СтруктураПоиска,
СтрокаСтруктурыЯчеек.Колонка);
Для Каждого ПериодичностьСтрокой Из ПериодичностиСтрокой Цикл
Если Не ЗначениеЗаполнено(НоваяСтрока[ПериодичностьСтрокой]) Тогда
НоваяСтрока[ПериодичностьСтрокой] = Неопределено;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ДобавленныеПериоды.Вставить(ПериодСтрокой,Истина);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПараметрыДанных = Документы.ЭкземплярБюджета.ПараметрыВыводаВидаБюджетаВТабличныйДокумент(
Объект,
СписокАналитикШапки,
ВалютаСценария,
СтруктураПараметровВывода,
Перечисления.РежимыФормированияБюджетныхОтчетов.Документ,
ДанныеЯчеек);
ДеревоВывода = СтруктураПараметровВывода.ДеревоВывода;
СтрокаДереваВывода = ДеревоВывода.Строки.Найти(СтрокаЯчейки, "ЭлементОтчета", Истина);
Таблица = СтрокаДереваВывода;
Пока Таблица.ИмяИзмерения <> "Таблица" Цикл
Таблица = Таблица.Родитель;
КонецЦикла;
СтрокиТаблиц = ДеревоВывода.Строки.НайтиСтроки(Новый Структура("ИмяИзмерения", "Таблица"));
НомерТаблицы = 1;
Для Каждого СтрокаТаблицы Из СтрокиТаблиц Цикл
Если СтрокаТаблицы = Таблица Тогда
Прервать;
КонецЕсли;
НомерТаблицы = НомерТаблицы + 1;
КонецЦикла;
ПараметрыВывода = Новый Структура();
ПараметрыВывода.Вставить("КэшЗначенийАналитик", Новый Соответствие);
ПараметрыВывода.Вставить("ПараметрыЯчеек", СтруктураОписанияОтчета.ПараметрыЯчеек);
ПараметрыВывода.Вставить("СтруктураЯчеек", СтруктураОписанияОтчета.СтруктураЯчеек);
ПараметрыВывода.Вставить("ПодчиненныеЭлементыВидаБюджета", СтруктураОписанияОтчета.ТаблицаПодчиненностиЭлементов);
ПараметрыВывода.Вставить("СтруктураКолонокТаблицыДанных", СтруктураПараметровВывода.СтруктураКолонокТаблицыДанных);
ПараметрыВывода.Вставить("ДанныеРасшифровки", ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки));
ПараметрыВывода.Вставить("ДокументРезультат", Новый ТабличныйДокумент);
ПараметрыВывода.Вставить("ДанныеЯчеек", ДанныеЯчеек);
ПараметрыВывода.Вставить("ИндексыПоискаИзмерений", Новый Соответствие);
ПараметрыВывода.Вставить("ДляРедактирования", Истина);
ПараметрыВывода.Вставить("ПараметрыЯчеек", СтруктураОписанияОтчета.ПараметрыЯчеек);
ПараметрыВывода.Вставить("СтруктураЯчеек", СтруктураОписанияОтчета.СтруктураЯчеек);
ПараметрыВывода.Вставить("СложнаяТаблица", Таблица.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.ТаблицаСложная);
ПараметрыВывода.Вставить("ПараметрыОтчетаДляОформления", Неопределено);
КэшРеквизитовЭлементовБюджета = Неопределено;
Если НЕ СтруктураПараметровВывода.КэшДанных.Свойство("КэшРеквизитовЭлементовБюджета", КэшРеквизитовЭлементовБюджета) Тогда
КэшРеквизитовЭлементовБюджета = БюджетнаяОтчетностьРасчетКэшаСервер.КэшРеквизитовЭлементовБюджета(Объект.ВидБюджета);
СтруктураПараметровВывода.КэшДанных.Вставить("КэшРеквизитовЭлементовБюджета", КэшРеквизитовЭлементовБюджета);
КонецЕсли;
ПараметрыВывода.Вставить("КэшПредставленийПустыхАналитик", Новый Соответствие);
ПараметрыВывода.Вставить("КэшРеквизитовЭлементовБюджета", КэшРеквизитовЭлементовБюджета);
КэшДопРеквизиты = КэшРеквизитовЭлементовБюджета.КэшДопРеквизитов;
ДанныеОтчетаДляОформления = БюджетнаяОтчетностьРасчетКэшаСервер.ДанныеОтчетаДляОформления(Таблица.ПараметрыТаблицы,
КэшДопРеквизиты);
ПараметрыВывода.Вставить("ДанныеОтчетаДляОформления", ДанныеОтчетаДляОформления);
ПараметрыПериодов = БюджетнаяОтчетностьВыводСервер.ПреобразоватьПараметрыДанныхВДанныеПериодов(
СтруктураПараметровВывода.СтруктураКолонокТаблицыДанных,
ПараметрыДанных);
ПараметрыВывода.Вставить("ПараметрыПериодов", ПараметрыПериодов);
ПараметрыВывода.Вставить("СчетчикСтрок", 0);
КэшПараметровВалют = БюджетнаяОтчетностьВыводСервер.ПолучитьКэшПараметровВалют(
ДанныеЯчеек,
СтруктураОписанияОтчета.ПараметрыЯчеек,
ПараметрыВывода.ПодчиненныеЭлементыВидаБюджета);
ПараметрыВывода.Вставить("КэшПараметровВалют", КэшПараметровВалют);
КэшПараметровЕдиницИзмерения = БюджетнаяОтчетностьВыводСервер.ПолучитьКэшПараметровЕдиницИзмерения(ДанныеЯчеек,
СтруктураОписанияОтчета.ПараметрыЯчеек);
ПараметрыВывода.Вставить("КэшПараметровЕдиницИзмерения", КэшПараметровЕдиницИзмерения);
ПараметрыВывода.Вставить("ВыводитьПримечания", Ложь);
ПараметрыВывода.Вставить("ВыводитьНомераТаблиц", Ложь);
ПараметрыВывода.Вставить("СтруктураОбластей", БюджетнаяОтчетностьВыводСервер.СтруктураОбластейМакета(ПараметрыВывода));
ПредставленияИзмерений = БюджетнаяОтчетностьВыводСервер.ПредставлениеИзмеренийОтчета(ДеревоВывода,
ДанныеЯчеек, СтруктураКолонокТаблицыДанных, КэшДопРеквизиты);
ПараметрыВывода.Вставить("ПредставленияИзмерений", ПредставленияИзмерений);
СтруктураКолонок = БюджетнаяОтчетностьВыводСервер.ПараметрыГруппировокКолонок(ПараметрыВывода,
ПараметрыВывода.ИндексыПоискаИзмерений,
Таблица.Строки.Найти("Колонки", "ИмяИзмерения"));
ПараметрыВывода.Вставить("СтруктураКолонок", СтруктураКолонок);
ПараметрыВывода.Вставить("ПараметрыТаблицы", Таблица.ПараметрыТаблицы);
ПараметрыВывода.Вставить("ПодчиненныеЭлементыВидаБюджета", СтруктураОписанияОтчета.ТаблицаПодчиненностиЭлементов);
КэшПараметровЕдиницИзмерения = БюджетнаяОтчетностьВыводСервер.ПолучитьКэшПараметровЕдиницИзмерения(ДанныеЯчеек,
СтруктураОписанияОтчета.ПараметрыЯчеек);
ПараметрыВывода.Вставить("КэшПараметровЕдиницИзмерения", КэшПараметровЕдиницИзмерения);
КэшПараметровВалют = БюджетнаяОтчетностьВыводСервер.ПолучитьКэшПараметровВалют(ДанныеЯчеек,
СтруктураОписанияОтчета.ПараметрыЯчеек,
ПараметрыВывода.ПодчиненныеЭлементыВидаБюджета);
ПараметрыВывода.Вставить("КэшПараметровВалют", КэшПараметровВалют);
ДеревоДляВыводаОтчета = РеквизитФормыВЗначение("ДеревоЭлементовБюджета");
ГруппировкаДерева = ФинансоваяОтчетностьСервер.ПодчиненныйЭлемент(ДеревоДляВыводаОтчета,
"ИДГруппировки", Расшифровка.ИДГруппировки);
АдресДобавленияСтрокСпискаРедактирования = ГруппировкаДерева.Родитель;
ПараметрыВывода.Вставить("АдресДобавленияСтрокСпискаРедактирования", АдресДобавленияСтрокСпискаРедактирования);
ПараметрыВывода.Вставить("СтильУровней", Новый Соответствие);
ПараметрыВывода.Вставить("НеНазначатьИменаОбластям", Истина);
Уровень = 0; СтрокаРасчетаУровня = СтрокаДереваВывода;
Пока СтрокаРасчетаУровня.ИмяИзмерения <> "Строки" Цикл
Если СтрокаРасчетаУровня.ВыводитьВместеСРодительским = Ложь Тогда
Уровень = Уровень + 1;
КонецЕсли;
СтрокаРасчетаУровня = СтрокаРасчетаУровня.Родитель;
КонецЦикла;
ПараметрыВывода.Вставить("НеВыводитьПустыеСтрокиАналитикиДоУровня", Уровень);
МассивСтрок = Новый Структура("Строки", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаДереваВывода));
Если СтрокаДереваВывода.ВыводитьИерархиюЭлементов Тогда
ПараметрыВывода.Вставить("ДобавленныеСтрокиРасшифровка", Новый Массив);
КонецЕсли;
СтруктураПоиска = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураИзмерений);
БюджетнаяОтчетностьВыводСервер.ВывестиТаблицуВОтчет(ПараметрыВывода, МассивСтрок, НомерТаблицы, СтруктураПоиска, Уровень);
БюджетнаяОтчетностьВыводСервер.ОформитьБюджет(ПараметрыВывода.ДокументРезультат, ПараметрыВывода, ДеревоВывода);
ЗначениеВРеквизитФормы(ДеревоДляВыводаОтчета, "ДеревоЭлементовБюджета");
Если СтрокаДереваВывода.ВыводитьИерархиюЭлементов Тогда
ОбъектИПараметрыРасчета = БюджетнаяОтчетностьКлиентСервер.СтруктураПоОбъектуЭкземпляраБюджета(ЭтотОбъект);
Для Каждого Расшифровка Из ПараметрыВывода.ДобавленныеСтрокиРасшифровка Цикл
БюджетнаяОтчетностьКлиентСервер.ОтразитьИзменениеЯчейки(ОбъектИПараметрыРасчета, Расшифровка, 0, , Истина);
КонецЦикла;
СформироватьОтчетСервер(Истина);
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
БюджетированиеСервер.ПроверитьИсправитьТЧЭкземпляраБюджета(Объект, ОбъектИПараметрыРасчета, Бюджет, ДанныеРасшифровки);
Возврат СтатусВставки;
КонецЕсли;
ВГраницаВставляемойОбласти = ПараметрыВывода.ДокументРезультат.ВысотаТаблицы - 1;
СместитьЯчейкиДанныхЯчеек(ДанныеЯчеек, ДополнительныеПараметры.ОбластьБюджета, 1 + ВГраницаВставляемойОбласти);
ОбластьПриемникДопВерх = ДополнительныеПараметры.ОбластьБюджета;
ОбластьПриемникДопНиз = ДополнительныеПараметры.ОбластьБюджета + ВГраницаВставляемойОбласти;
ОбластьПриемникДопЛево = 1;
ОбластьПриемникДопПраво = Бюджет.ШиринаТаблицы;
ОбластьПриемник = Бюджет.Область(ОбластьПриемникДопВерх, , ОбластьПриемникДопНиз);
НоваяОбласть = ПараметрыВывода.ДокументРезультат.Область(1, , 1 + ВГраницаВставляемойОбласти, );
Бюджет.ВставитьОбласть(НоваяОбласть, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоВертикали);
Для Строка = ОбластьПриемникДопВерх По ОбластьПриемникДопНиз Цикл
Для Колонка = ОбластьПриемникДопЛево По ОбластьПриемникДопПраво Цикл
ОбластьДокумента = Бюджет.Область(Строка, Колонка);
Расшифровка = БюджетнаяОтчетностьВызовСервера.ЗначениеРасшифровки(ОбластьДокумента.Расшифровка, АдресДанныхРасшифровки);
Если Расшифровка = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Расшифровка.Свойство("ИндексСтрокиДанных") Тогда
СтрокаДанных = ДанныеЯчеек[Расшифровка.ИндексСтрокиДанных];
Если Расшифровка.Свойство("ИмяПоказателя") Тогда
Если Расшифровка.ИмяПоказателя = "Сумма" Тогда
СтрокаДанных.ИмяОбластиСумма = ОбластьДокумента.Имя;
ИначеЕсли Расшифровка.ИмяПоказателя = "Количество" Тогда
СтрокаДанных.ИмяОбластиКоличество = ОбластьДокумента.Имя;
ИначеЕсли Расшифровка.ИмяПоказателя = "Значение" Тогда
СтрокаДанных.ИмяОбластиЗначение = ОбластьДокумента.Имя;
КонецЕсли;
Иначе
НоваяКолонкаОбласти = Сред(ОбластьДокумента.Имя, 3);
Если ЗначениеЗаполнено(СтрокаДанных.ИмяОбластиСумма)
И Сред(СтрокаДанных.ИмяОбластиСумма, 3) = НоваяКолонкаОбласти Тогда
СтрокаДанных.ИмяОбластиСумма = ОбластьДокумента.Имя;
ИначеЕсли ЗначениеЗаполнено(СтрокаДанных.ИмяОбластиКоличество)
И Сред(СтрокаДанных.ИмяОбластиКоличество, 3) = НоваяКолонкаОбласти Тогда
СтрокаДанных.ИмяОбластиКоличество = ОбластьДокумента.Имя;
ИначеЕсли ЗначениеЗаполнено(СтрокаДанных.ИмяОбластиЗначение)
И Сред(СтрокаДанных.ИмяОбластиЗначение, 3) = НоваяКолонкаОбласти Тогда
СтрокаДанных.ИмяОбластиЗначение = ОбластьДокумента.Имя;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоместитьВоВременноеХранилище(ДанныеЯчеек, АдресДанныхЯчеек);
ПоместитьВоВременноеХранилище(ПараметрыВывода.ДанныеРасшифровки, АдресДанныхРасшифровки);
Возврат СтатусВставки;
КонецФункции
&НаСервере
Процедура УстановитьДоступностьКнопокПриСменеСтраницы()
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица Тогда
Элементы.РедактироватьСписком.Картинка = БиблиотекаКартинок.Вперед;
Элементы.РедактироватьСписком.Заголовок = НСтр("ru = 'Редактировать в списке'");
Элементы.ДобавитьСтрокуСписка.Видимость = Ложь;
Элементы.СкопироватьСтрокуСписка.Видимость = Ложь;
Элементы.ИзменитьСтрокуСписка.Видимость = Ложь;
Элементы.УдалитьСтрокуСписка.Видимость = Ложь;
Элементы.Копировать.Видимость = Истина;
Элементы.Вставить.Видимость = Истина;
Элементы.ПоказатьСкрытьДеревоБюджета.Видимость = Ложь;
Элементы.ДобавитьСтроку.Видимость = Истина;
Элементы.УдалитьСтроку.Видимость = Истина;
Иначе
Элементы.РедактироватьСписком.Заголовок = НСтр("ru = 'Редактировать в таблице'");
Элементы.РедактироватьСписком.Картинка = БиблиотекаКартинок.Назад;
Элементы.ДобавитьСтрокуСписка.Видимость = Истина;
Элементы.СкопироватьСтрокуСписка.Видимость = Истина;
Элементы.ИзменитьСтрокуСписка.Видимость = Истина;
Элементы.УдалитьСтрокуСписка.Видимость = Истина;
Элементы.Копировать.Видимость = Ложь;
Элементы.Вставить.Видимость = Ложь;
Элементы.ПоказатьСкрытьДеревоБюджета.Видимость = Истина;
Элементы.ДобавитьСтроку.Видимость = Ложь;
Элементы.УдалитьСтроку.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииСпособаРедактированияБюджета(ЗаполнитьБюджет = Истина)
Если Объект.Действие = Перечисления.ТипыДействийЭкземпляровБюджетов.КорректировкаПоСтатьямБюджета Тогда
Элементы.СтраницаБюджет.Видимость = Ложь;
Элементы.СтраницаКорректировкиПоСтатьямБюджетов.Видимость = Истина;
Если Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаБюджет Тогда
Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаКорректировкиПоСтатьямБюджетов;
КонецЕсли;
Возврат;
Иначе
Элементы.СтраницаБюджет.Видимость = Истина;
Элементы.СтраницаКорректировкиПоСтатьямБюджетов.Видимость = Ложь;
Если Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаКорректировкиПоСтатьямБюджетов Тогда
Элементы.ОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаБюджет;
КонецЕсли;
КонецЕсли;
ДоступностьЭлементов =
Не ИспользоватьУтверждениеБюджетов
Или (Объект.Статус <> Перечисления.СтатусыПланов.Утвержден);
ОсновнойСпособВвода = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидБюджета, "ОсновнойСпособВвода");
Если ЗначениеЗаполнено(Объект.ВидБюджета)
И (ОсновнойСпособВвода = Перечисления.СпособыРедактированияБюджета.ВСписке
Или РежимРедактирования = "Список") И ДоступностьЭлементов Тогда
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список;
Иначе
Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Таблица;
КонецЕсли;
ПараметрыМакетаБюджета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.ВидБюджета,
"ВключитьЗащитуТабличногоДокумента, СохранятьБюджетВТабличнойФормеВЭкземпляреБюджета, ВерсияДанных");
ЗащитаВключена = ПараметрыМакетаБюджета.ВключитьЗащитуТабличногоДокумента = Истина;
ПроверятьСохраненныйМакет = ПараметрыМакетаБюджета.СохранятьБюджетВТабличнойФормеВЭкземпляреБюджета = Истина;
Элементы.Бюджет.Защита = ЗащитаВключена;
УстановитьДоступностьКнопокПриСменеСтраницы();
Если Не ЗаполнитьБюджет Тогда
Возврат;
КонецЕсли;
Если Элементы.ПанельБюджет.ТекущаяСтраница = Элементы.Список Тогда
СформироватьОтчетСервер(Истина);
Иначе
Если Не ПроверятьСохраненныйМакет Тогда
СформироватьОтчетСервер();
Иначе
Если Не ВосстановитьСохраненныйМакет(ПараметрыМакетаБюджета.ВерсияДанных) Тогда
СформироватьОтчетСервер();
Иначе
ПараметрыВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Если НЕ ПараметрыВывода.Свойство("КолонкиТаблиц") Тогда
СформироватьОтчетСервер();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВосстановитьСохраненныйМакет(ВерсияВидаБюджета)
РезультатВосстановления = БюджетированиеСервер.ВосстановитьХранимыйМакет(Объект.Ссылка, Объект.ВидБюджета, ВерсияВидаБюджета);
Если РезультатВосстановления = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ЗагрузитьПодготовленныеДанные(РезультатВосстановления);
Если РезультатВосстановления.ДанныеЯчеек <> Неопределено Тогда
ОтразитьИзмененияБюджета();
КонецЕсли;
Возврат Истина;
КонецФункции
&НаСервере
Функция ПодготовитьВспомогательныеДанныеБюджета()
Результат = Новый Структура;
Результат.Вставить("ДанныеЯчеек", ПолучитьИзВременногоХранилища(АдресДанныхЯчеек));
Результат.Вставить("ДанныеРасшифровки", ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки));
Результат.Вставить("ДеревоСтрокСпискаРедактирования", РеквизитФормыВЗначение("ДеревоЭлементовБюджета", Тип("ДеревоЗначений")));
Результат.Вставить("ВерсияВидаБюджета", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидБюджета, "ВерсияДанных"));
Результат.Вставить("ВидБюджета", Объект.ВидБюджета);
ПараметрыВывода = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета);
Если ПараметрыВывода.Свойство("КолонкиТаблиц") Тогда
Результат.Вставить("КолонкиТаблиц", ПараметрыВывода.КолонкиТаблиц);
КонецЕсли;
СтильУровней = Новый Соответствие;
Для Каждого ЭлементУО Из УсловноеОформление.Элементы Цикл
Если Не СтрНайти(ЭлементУО.Представление, "ДобавленноеУОДереваЭлементов_") Тогда
Продолжить;
КонецЕсли;
Для Каждого ЭлементОтбора Из ЭлементУО.Отбор.Элементы Цикл
Если Строка(ЭлементОтбора.ЛевоеЗначение) = "ДеревоЭлементовБюджета.ИДТаблицы" Тогда
КлючТаблицы = ЭлементОтбора.ПравоеЗначение;
ИначеЕсли Строка(ЭлементОтбора.ЛевоеЗначение) = "ДеревоЭлементовБюджета.Уровень" Тогда
КлючУровня = ЭлементОтбора.ПравоеЗначение;
КонецЕсли;
КонецЦикла;
ЦветФона = ЭлементУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"));
ПараметрыКэшаСтилей = Новый Структура;
ПараметрыКэшаСтилей.Вставить("СтильУровней", СтильУровней);
ПараметрыКэшаСтилей.Вставить("ЦветФона", ЦветФона);
ПараметрыКэшаСтилей.Вставить("ИДТаблицы", КлючТаблицы);
ПараметрыКэшаСтилей.Вставить("Уровень", КлючУровня);
СтилиСтрокДерева =
БюджетнаяОтчетностьВыводСервер.ПолучитьКэшСтилейСтрокСпискаРедактирования(ПараметрыКэшаСтилей);
СтильУровней.Вставить(КлючТаблицы, СтилиСтрокДерева);
КонецЦикла;
Результат.Вставить("СтильУровней", СтильУровней);
Возврат Результат;
КонецФункции
&НаСервере
Процедура СохранитьХранимыйМакет()
Сохранять = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидБюджета, "СохранятьБюджетВТабличнойФормеВЭкземпляреБюджета");
Если Не Сохранять = Истина Тогда
Возврат;
КонецЕсли;
БюджетированиеСервер.СохранитьХранимыйМакет(Бюджет, ПодготовитьВспомогательныеДанныеБюджета(), Объект.Ссылка);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПриЗакрытииНаСервере(ИдентификаторЗадания,Ссылка)
ОтменитьВыполненниеЗадания(ИдентификаторЗадания);
КонецПроцедуры
#КонецОбласти
#Область РасчетПоказателей
&НаКлиенте
Функция МенюВидовПоказателей(Родитель, Меню = Неопределено)
Если Меню = Неопределено Тогда
Меню = Новый СписокЗначений;
КонецЕсли;
ЭлементыМеню = Родитель.ПодчиненныеЭлементы;
Для Каждого Элемент Из ЭлементыМеню Цикл
Если ТипЗнч(Элемент) <> Тип("ГруппаФормы") Тогда
Меню.Добавить(Элемент.Имя, Элемент.Заголовок, ОсновнойПоказатель = Элемент.Имя);
Иначе
МенюВидовПоказателей(Элемент, Меню);
КонецЕсли;
КонецЦикла;
ЭлементМеню = Меню.НайтиПоЗначению(Элементы.РассчитатьВсеПоказатели.Имя);
Если ЭлементМеню <> Неопределено Тогда
ЭлементМеню.Пометка = РазвернутьОбластьПоказателей;
КонецЕсли;
Возврат Меню;
КонецФункции
&НаКлиенте
Процедура ПослеВыбораПоказателя(ВыбранныйПоказатель, ДополнительныеПараметры) Экспорт
Если ТипЗнч(ВыбранныйПоказатель) <> Тип("ЭлементСпискаЗначений") Тогда
Возврат;
КонецЕсли;
Если ВыбранныйПоказатель.Значение = Элементы.РассчитатьВсеПоказатели.Имя Тогда
РазвернутьОбластьПоказателей = Не Элементы.РассчитатьВсеПоказатели.Пометка;
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей);
Иначе
РассчитатьПоказатели(ВыбранныйПоказатель.Значение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьПоказателиДинамически()
РассчитатьПоказатели();
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьПоказатели(ТекущаяКоманда = "")
Показатель = "";
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "Бюджет", ТекущаяКоманда, 2);
КонецПроцедуры
#КонецОбласти
#КонецОбласти