Операции закрытия месяца / Регламентные операции по закрытию месяца / Модуль формы

файл
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ОбменДаннымиУТ.ВЭтомУзлеДоступноВыполнениеОперацийЗакрытияМесяца(Отказ) Тогда
		Возврат;
	КонецЕсли;
	
	КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
	
	ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Обработка.ОперацииЗакрытияМесяца.Команда.ОперацииЗакрытияМесяца");
	
	// Проверим окончание обновления ИБ.
	Обработки.ОперацииЗакрытияМесяца.ПроверитьБлокировкуВходящихДанныхПриОбновленииИБ();
	
	// Соберем системные настройки в структуру РежимРаботы.
	РежимРаботы = Новый Структура;

	РежимРаботы.Вставить("БазоваяВерсия", 				 ПолучитьФункциональнуюОпцию("БазоваяВерсия"));
	РежимРаботы.Вставить("УправлениеПредприятием",		 ПолучитьФункциональнуюОпцию("УправлениеПредприятием"));
	РежимРаботы.Вставить("КомплекснаяАвтоматизация",	 ПолучитьФункциональнуюОпцию("КомплекснаяАвтоматизация"));
	РежимРаботы.Вставить("УправлениеТорговлей",			 ПолучитьФункциональнуюОпцию("УправлениеТорговлей"));
	РежимРаботы.Вставить("КонтекстноеОткрытиеФормы",  	 ЗначениеЗаполнено(Параметры.ПериодРегистрации));
	
	РежимРаботы.Вставить("ИспользоватьНесколькоОрганизаций",
		ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций"));
	
	ЕстьПравоОтраженияДокументовВРеглУчете = ПолучитьФункциональнуюОпцию("УправлениеТорговлей");
	//++ НЕ УТ
	ЕстьПравоОтраженияДокументовВРеглУчете =
		ЕстьПравоОтраженияДокументовВРеглУчете ИЛИ РеглУчетСервер.ЕстьПравоОтраженияДокументовВРеглУчете();
	//-- НЕ УТ
	
	ЕстьПравоОтраженияДокументовВМеждународномУчете = Ложь;
	
	РежимРаботы.Вставить("ДоступностьВидовУчета", Новый Структура);
	РежимРаботы.ДоступностьВидовУчета.Вставить("ОперативныйУчет", Истина);
	РежимРаботы.ДоступностьВидовУчета.Вставить("РегламентированныйУчет", ЕстьПравоОтраженияДокументовВРеглУчете);
	РежимРаботы.ДоступностьВидовУчета.Вставить("МеждународныйУчет", ЕстьПравоОтраженияДокументовВМеждународномУчете);
	
	РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы);
	
	// Заполним параметры формы по умолчанию.
	Если РежимРаботы.КонтекстноеОткрытиеФормы Тогда
		Объект.ПериодРегистрации = Параметры.ПериодРегистрации;
		Объект.МассивОрганизаций = ОрганизациюВФиксированныйМассив(Параметры.Организация);
	Иначе
		Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
		Объект.МассивОрганизаций = ОрганизациюВФиксированныйМассив(ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию());
	КонецЕсли;
	
	Если НЕ РежимРаботы.ИспользоватьНесколькоОрганизаций Тогда
		Объект.МассивОрганизаций = Новый ФиксированныйМассив(Новый Массив);
	КонецЕсли;
	
	Объект.ВсеОрганизации = НЕ ЗначениеЗаполнено(Объект.МассивОрганизаций);
	
	ОписаниеОрганизаций = Обработки.ОперацииЗакрытияМесяца.ОписаниеОрганизацийДляРасчета(Объект.ПериодРегистрации, Истина);
	ОписаниеОрганизацийСформировано = Ложь;
	
	Объект.СкрыватьЭтапыСоСтатусомНеТребуется = Истина;
	Объект.СкрыватьЭтапыСоСтатусомВыполненоУспешно = Ложь;
	Объект.СкрыватьПоясненияКЭтапам = Ложь;
	Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм = Истина;
	Объект.РежимЗакрытияМесяца = Перечисления.РежимыЗакрытияМесяца.ОкончательноеЗакрытие;
	Объект.ДатаПредварительногоЗакрытияМесяца = КонецМесяца(Объект.ПериодРегистрации);
	
	ХранилищеДанных = Новый ХранилищеЗначения(Неопределено);
	СостояниеРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьСтруктуруСостоянияРасчетаЭтапов(Неопределено);
	
	// Выполним настройку свойств элементов формы.
	НастроитьЭлементыПриИнициализацииФормы();
	УстановитьВидимостьЭлементовФормы();
	УстановитьДоступностьРежимаЗакрытияМесяца();
	
	ЗакрытиеМесяцаЛокализация.ПриСозданииНаСервереФормаЗакрытиеМесяца(Отказ, СтандартнаяОбработка, ЭтотОбъект);
	
	Если НЕ РежимРаботы.ДоступностьВидовУчета.ОперативныйУчет
	 И НЕ РежимРаботы.ДоступностьВидовУчета.РегламентированныйУчет
	 И НЕ РежимРаботы.ДоступностьВидовУчета.МеждународныйУчет Тогда
		
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Недостаточно прав на выполнение операций закрытия месяца.'"));
		
		Отказ = Истина;
		
		Возврат;
		
	КонецЕсли;
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, 1);
	
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	Если РежимРаботы.КонтекстноеОткрытиеФормы Тогда
		Настройки.Вставить("Объект.ПериодРегистрации", Параметры.ПериодРегистрации);
		Настройки.Вставить("Объект.МассивОрганизаций", ОрганизациюВФиксированныйМассив(Параметры.Организация));
		Настройки.Вставить("Объект.ВсеОрганизации",    НЕ ЗначениеЗаполнено(Настройки.Получить("Объект.МассивОрганизаций")));
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	МассивОрганизаций = Настройки.Получить("Объект.МассивОрганизаций");
	
	Если НЕ РежимРаботы.ИспользоватьНесколькоОрганизаций
	 ИЛИ НЕ ЗначениеЗаполнено(МассивОрганизаций) Тогда
		Объект.МассивОрганизаций = Новый ФиксированныйМассив(Новый Массив);
	Иначе
		Объект.МассивОрганизаций = МассивОрганизаций;
	КонецЕсли;
	
	Объект.ВсеОрганизации = НЕ ЗначениеЗаполнено(Объект.МассивОрганизаций);

	Если НЕ РежимРаботы.КонтекстноеОткрытиеФормы Тогда
		
		ПервыйНезаблокированныйПериод = РегистрыСведений.НастройкаБлокировкиОтИзменений.ПервыйНезаблокированныйПериод(Объект.МассивОрганизаций);
		Объект.ПериодРегистрации = НачалоМесяца(Макс(Объект.ПериодРегистрации, ПервыйНезаблокированныйПериод));
		
	КонецЕсли;

	НастроитьЭлементыПриИнициализацииФормы(Истина);
	УстановитьВидимостьЭлементовФормы();
	УстановитьДоступностьРежимаЗакрытияМесяца();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ОбновитьДанныеФормыВФонеНаКлиенте(,Ложь);
	
	#Если ВебКлиент Тогда
		ШиринаКолонок = 4;
		ИнформацияОЗапускеРасчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Пользователь ""%1"" через веб-клиент'", КодОсновногоЯзыка),
			ИмяПользователя());
	#Иначе
		ШиринаКолонок = 4;
		ИнформацияОЗапускеРасчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Пользователь ""%1"" с компьютера ""%2""'", КодОсновногоЯзыка),
			ИмяПользователя(),
			ИмяКомпьютера());
	#КонецЕсли
	
	// Настроим ширину колонок гиперссылок.
	Элементы.ДеревоЭтаповГруппаВыполнить.Ширина 	 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповГруппаТекстВыполнить.Ширина 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповТекстВыполнить.Ширина 		 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповГруппаГиперссылкаВыполнить.Ширина 	= ШиринаКолонок;
	Элементы.ДеревоЭтаповГиперссылкаВыполнить.Ширина 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповГруппаПодробнее.Ширина 	 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповГруппаТекстПодробнее.Ширина 		= ШиринаКолонок;
	Элементы.ДеревоЭтаповТекстПодробнее.Ширина 				= ШиринаКолонок;
	Элементы.ДеревоЭтаповГруппаГиперссылкаПодробнее.Ширина 	= ШиринаКолонок;
	Элементы.ДеревоЭтаповГиперссылкаПодробнее.Ширина 		= ШиринаКолонок;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если НЕ ЗавершениеРаботы Тогда
		ОтключитьОбработчикОжидания("ПроверитьАктивностьФоновогоЗаданияОбновленияФормы");
		ОтключитьОбработчикОжидания("ПроверитьАктивностьФоновогоЗаданияРасчета");
		ЗавершениеЗаданийПриЗакрытииФормы();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура РежимЗакрытияМесяцаПриИзменении(Элемент)
	УстановитьВидимостьЭлементовФормы();
	ОбновитьДанныеФормыВФонеНаКлиенте(,Ложь);
КонецПроцедуры

&НаКлиенте
Процедура РежимЗакрытияМесяцаОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаОкончанияПриИзменении(Элемент)
	Объект.ПериодРегистрации = НачалоМесяца(Объект.ДатаПредварительногоЗакрытияМесяца);
	ПредставлениеПериодаРегистрации = ЗакрытиеМесяцаКлиентСервер.ПредставлениеПериодаМесяцГод(Объект.ПериодРегистрации);
	УстановитьДоступностьРежимаЗакрытияМесяца();
	Если Не ПартионныйУчетВерсии22 Тогда
		ПоказатьПредупреждение(Неопределено,
			НСтр("ru = 'Предварительное закрытие месяца поддерживается только при использовании партионного учета версии 2.2.'"));
		Объект.РежимЗакрытияМесяца = ПредопределенноеЗначение("Перечисление.РежимыЗакрытияМесяца.ОкончательноеЗакрытие");
		УстановитьВидимостьЭлементовФормы();
	КонецЕсли;
	ОбновитьДанныеФормыВФонеНаКлиенте(,Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеПериодаРегистрацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
		
	СтандартнаяОбработка = Ложь;
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ПредставлениеПериодаРегистрацииНачалоВыбораЗавершение", ЭтотОбъект);
	ПараметрыФормы 	   = Новый Структура("Значение, РежимВыбораПериода", Объект.ПериодРегистрации, "МЕСЯЦ");
	
	ОткрытьФорму("ОбщаяФорма.ВыборПериода",
		ПараметрыФормы, 
		ЭтотОбъект, 
		УникальныйИдентификатор,
		,
		, 
		ОбработчикЗакрытия,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеПериодаРегистрацииРегулирование(Элемент, Направление, СтандартнаяОбработка)
	
	ОбщегоНазначенияУТКлиент.РегулированиеПредставленияПериодаРегистрации(
		Направление,
		СтандартнаяОбработка,
		Объект.ПериодРегистрации,
		ПредставлениеПериодаРегистрации);
	
	ПредставлениеПериодаРегистрации = ЗакрытиеМесяцаКлиентСервер.ПредставлениеПериодаМесяцГод(Объект.ПериодРегистрации);
	Объект.ДатаПредварительногоЗакрытияМесяца = КонецМесяца(Объект.ПериодРегистрации);
	
	ОбновитьДанныеФормыВФонеНаКлиенте(,Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеПериодаРегистрацииОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеОрганизацийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ПредставлениеОрганизацийНачалоВыбораЗавершение", ЭтотОбъект);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПериодРегистрации", 	Объект.ПериодРегистрации);
	ПараметрыФормы.Вставить("МассивОрганизаций", 	Объект.МассивОрганизаций);
	ПараметрыФормы.Вставить("ВсеОрганизации", 		Объект.ВсеОрганизации);
	ПараметрыФормы.Вставить("ОписаниеОрганизаций", 	ОписаниеОрганизаций);
	
	ОткрытьФорму("Обработка.ОперацииЗакрытияМесяца.Форма.ВыборОрганизаций",
		ПараметрыФормы,
		ЭтотОбъект, 
		УникальныйИдентификатор,
		,
		,
		ОбработчикЗакрытия,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеОрганизацийНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.ВсеОрганизации = Результат.ВсеОрганизации
	 И ОбщегоНазначенияУТКлиентСервер.МассивыРавны(Объект.МассивОрганизаций, Результат.МассивОрганизаций) Тогда
		Возврат;
	КонецЕсли;
	
	Объект.ВсеОрганизации 	 = Результат.ВсеОрганизации;
	Объект.МассивОрганизаций = Новый ФиксированныйМассив(Результат.МассивОрганизаций);
	
	СформироватьПредставлениеОрганизаций();
	
	ОбновитьДанныеФормыВФонеНаКлиенте(НЕ ОписаниеОрганизацийСформировано, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеОрганизацийОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если Объект.ВсеОрганизации Тогда
		Возврат;
	КонецЕсли;
	
	Объект.ВсеОрганизации 	 = Истина;
	Объект.МассивОрганизаций = Новый ФиксированныйМассив(Новый Массив);
	
	СформироватьПредставлениеОрганизаций();
	
	ОбновитьДанныеФормыВФонеНаКлиенте(НЕ ОписаниеОрганизацийСформировано, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеОрганизацийОткрытие(Элемент, СтандартнаяОбработка)
	
	Если Объект.МассивОрганизаций.Количество() <> 1 Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	ПоказатьЗначение(, Объект.МассивОрганизаций[0]);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеСтатусаРасчетаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если НавигационнаяСсылкаФорматированнойСтроки <> "Подробнее" Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ДатаНачалаРасчета", 			ОбщаяДатаНачалаРасчета);
	ПараметрыФормы.Вставить("ПериодРегистрации", 			Объект.ПериодРегистрации);
	ПараметрыФормы.Вставить("ПериодЗаблокирован", 			ПериодЗаблокирован);
	ПараметрыФормы.Вставить("ПериодЗаблокированЧастично", 	ПериодЗаблокированЧастично);
	ПараметрыФормы.Вставить("РасшифровкаЗапретаИзменений", 	РасшифровкаЗапретаИзменений);
	ПараметрыФормы.Вставить("РасшифровкаБлокировки", 		РасшифровкаБлокировки);
	ПараметрыФормы.Вставить("РасшифровкаЗаданий", 			РасшифровкаЗаданий);
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект);
	
	ОткрытьФорму(
		"Обработка.ОперацииЗакрытияМесяца.Форма.ЗапретыИзменения",
		ПараметрыФормы,
		ЭтотОбъект,
		УникальныйИдентификатор,
		,
		,
		ОбработчикЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЭтаповВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтрокаДереваЭтапов = ДеревоЭтапов.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если СтрокаДереваЭтапов = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Элемент.ТекущийЭлемент = Элементы.ДеревоЭтаповГиперссылкаВыполнить И НЕ ИзмененияЗапрещены Тогда
		
		Если СтрокаДереваЭтапов.ВыполнениеНаСервере Тогда
		
			СтандартнаяОбработка = Ложь;
			ОповещениеОбОкончанииВыбора =
				Новый ОписаниеОповещения("ДеревоЭтаповВыборЗавершение", ЭтотОбъект);
			
			СписокТиповПредметов = Новый СписокЗначений;
			СписокТиповПредметов.Добавить("ЭтотИПредыдущие",
				НСтр("ru='Выполнить этот и все предыдущие этапы (рекомендуется)'"),,
				БиблиотекаКартинок.СтартБизнесПроцесса);
				
			СписокТиповПредметов.Добавить("ТолькоЭтот",
				НСтр("ru='Выполнить только этот этап'"),,БиблиотекаКартинок.ПерейтиВперед);
			
			ПоказатьВыборИзМеню(ОповещениеОбОкончанииВыбора, СписокТиповПредметов);
			
		Иначе
			ОбработатьНажатиеГиперссылки(СтрокаДереваЭтапов, Истина);
		КонецЕсли;
		
	ИначеЕсли Элемент.ТекущийЭлемент = Элементы.ДеревоЭтаповГиперссылкаПодробнее Тогда
		ОбработатьНажатиеГиперссылки(СтрокаДереваЭтапов, Ложь);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЭтаповВыборЗавершение(ВыбранныйСпособ, ДопПараметры) Экспорт
	
	Если ВыбранныйСпособ = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ВыбранныйСпособ.Значение = "ЭтотИПредыдущие" Тогда
		ОбработатьНажатиеГиперссылки(
			ДеревоЭтапов.НайтиПоИдентификатору(Элементы.ДеревоЭтапов.ТекущаяСтрока), Истина, Ложь);
	ИначеЕсли ВыбранныйСпособ.Значение = "ТолькоЭтот" Тогда
		ОбработатьНажатиеГиперссылки(
			ДеревоЭтапов.НайтиПоИдентификатору(Элементы.ДеревоЭтапов.ТекущаяСтрока), Истина, Истина);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НастройкиРегламентногоЗаданияНеоперативногоДопроведенияДокументовНажатие(Элемент)

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Действие", "Изменить");
	ПараметрыФормы.Вставить("Идентификатор",
		ПараметрыРегламентногоЗаданияНеоперативнойОчереди.ИдентификаторРегламентногоЗадания);

	ИмяФормыРегламентногоЗадания = "Обработка.РегламентныеИФоновыеЗадания.Форма.РегламентноеЗадание";
	ОткрытьФорму(ИмяФормыРегламентногоЗадания, ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

#Область УниверсальныеОбработчикиКомандФормы

&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуЛокализации(Команда)
	
	ЗакрытиеМесяцаКлиентЛокализация.ВыполнитьКомандуЛокализации(Команда, ЭтотОбъект);
	
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура СкрыватьЭтапыСоСтатусомНеТребуется(Команда)
	
	Объект.СкрыватьЭтапыСоСтатусомНеТребуется = НЕ Объект.СкрыватьЭтапыСоСтатусомНеТребуется;
	
	НастроитьОтметкуКнопокНастроек(Объект, Элементы);
	
	ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура СкрыватьЭтапыСоСтатусомВыполненоУспешно(Команда)
	
	Объект.СкрыватьЭтапыСоСтатусомВыполненоУспешно = НЕ Объект.СкрыватьЭтапыСоСтатусомВыполненоУспешно;
	
	НастроитьОтметкуКнопокНастроек(Объект, Элементы);
	
	ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура СкрыватьПоясненияКЭтапам(Команда)
	
	Объект.СкрыватьПоясненияКЭтапам = НЕ Объект.СкрыватьПоясненияКЭтапам;
	
	НастроитьОтметкуКнопокНастроек(Объект, Элементы);
	
	ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура АвтообновлениеПриЗакрытииПодчиненныхФорм(Команда)
	
	Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм = НЕ Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм;
	
	НастроитьОтметкуКнопокНастроек(Объект, Элементы);
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьПроверки(Команда)
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект);
	
	ОткрытьФорму(
		"Справочник.ПравилаПроверкиУчета.ФормаСписка",
		,
		ЭтотОбъект,
		УникальныйИдентификатор,
		,
		,
		ОбработчикЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаБлокировкиОтИзменений(Команда)

	ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект);
	
	ОткрытьФорму(
		"РегистрСведений.НастройкаБлокировкиОтИзменений.Форма.ФормаНастройки",
		,
		ЭтотОбъект,
		УникальныйИдентификатор,
		,
		,
		ОбработчикЗакрытия,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьЗакрытыйПериод(Команда)
	
	ФормироватьОперацииЗакрытогоПериода = НЕ ФормироватьОперацииЗакрытогоПериода;
	Элементы.КнопкаПроверитьЗакрытыйПериод.Пометка = ФормироватьОперацииЗакрытогоПериода;
	
	ОбновитьДанныеФормыВФонеНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтчетСверкаОстатковОперативногоУчетаИСебестоимости(Команда)
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("Период", КонецМесяца(Объект.ПериодРегистрации));
	
	Если ЗначениеЗаполнено(ОбщийМассивОрганизаций) Тогда
		ПараметрыОтчета.Вставить("Организация", ОбщийМассивОрганизаций);
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", ПараметрыОтчета, Истина);
	
	ОткрытьФорму(
		"Отчет.СверкаОстатковОперативногоУчетаИСебестоимости.ФормаОбъекта",
		ПараметрыФормы,
		ЭтотОбъект,
		УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьФорму(Команда)
	
	ОбновитьДанныеФормыВФонеНаКлиенте(, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьВсе(Команда)
	
	ОчиститьСообщения();
	
	Если ЗапуститьВыполнениеРасчета() Тогда
		Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
		УстановитьКартинкиСтатусаПриДлительнойОперации(Ложь);
		ПроверитьАктивностьФоновогоЗаданияРасчета();
		ОповеститьОНачалеРасчета();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьРасчетВФоне(Команда)
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ОтветНаВопросОстановкиРасчета", ЭтотОбъект);
	
	ПоказатьВопрос(
		ОбработчикЗакрытия,
		НСтр("ru='Прервать выполнение закрытия месяца'"),
		РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьАвтоматическоеЗакрытиеМесяца(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.РегламентныеЗаданияЗакрытияМесяца.Форма.Форма",
		Новый Структура("Организация", ЗакрытиеМесяцаКлиентЛокализация.ОрганизацияИзФиксированногоМассива(ОбщийМассивОрганизаций)),
		ЭтотОбъект,
		УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКЗакрытиюМесяца(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКЗакрытиюМесяца.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРасчетуСебестоимости(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРасчетуСебестоимости.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРаспределениюРасчетовСКлиентами(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРаспределениюРасчетовСКлиентами.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРаспределениюРасчетовСПоставщиками(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРаспределениюРасчетовСПоставщиками.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРасчетуАмортизацииОС(Команда)
	
	//++ НЕ УТ
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРасчетуАмортизацииОС.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	//-- НЕ УТ
	
	Возврат; // в УТ обработчик пустой
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРасчетуАмортизацииНМА(Команда)
	
	//++ НЕ УТ
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРасчетуАмортизацииНМА.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	//-- НЕ УТ
	
	Возврат; // в УТ обработчик пустой
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРасчетуСтоимостиВНА(Команда)
	
	//++ НЕ УТ
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРасчетуСтоимостиВНА.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	//-- НЕ УТ
	
	Возврат; // в УТ обработчик пустой
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКАктуализацииДвиженийПоВНА(Команда)
	
	//++ НЕ УТ
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКАктуализацииДвиженийПоВНА.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	//-- НЕ УТ
	
	Возврат; // в УТ обработчик пустой
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКФормированиюДвиженийПоВНА(Команда)
	
	//++ НЕ УТ
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКФормированиюДвиженийПоВНА.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	//-- НЕ УТ
	
	Возврат; // в УТ обработчик пустой
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКФормированиюДвиженийПоНДС(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКФормированиюДвиженийПоНДС.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЖурналРегистрации(Команда)
	
	ОтборПоУровню = Новый СписокЗначений;
	ОтборПоУровню.Добавить("Ошибка", "Ошибка");
	
	ПараметрыФормыЖурнала = Новый Структура("ДатаНачала, Уровень", Объект.ПериодРегистрации, ОтборПоУровню);
	
	ОткрытьФорму(
		"Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации",
		ПараметрыФормыЖурнала);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПротоколыРасчетаПартийИСебестоимости(Команда)
	
	ПараметрыОтбораРегистра = Новый Структура("ПериодРасчета", Объект.ПериодРегистрации);
	ПараметрыФормыРегистра  = Новый Структура("Отбор", ПараметрыОтбораРегистра);
	
	ОткрытьФорму(
		"РегистрСведений.ПротоколыРасчетаПартийИСебестоимости.Форма.ФормаСписка",
		ПараметрыФормыРегистра);
	
КонецПроцедуры

&НаКлиенте
Процедура АктивныеСеансыЗакрытияМесяца(Команда)
	
	ОткрытьФорму(
		"Обработка.ОперацииЗакрытияМесяца.Форма.АктивныеСеансы",
		,
		ЭтотОбъект,
		УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаТехнологическихПараметров(Команда)
	
	ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект);
	
	ОткрытьФорму(
		"Обработка.ОперацииЗакрытияМесяца.Форма.ПараметрыОпераций",
		,
		ЭтотОбъект,
		УникальныйИдентификатор,
		,
		,
		ОбработчикЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ПосмотретьПериодыЗаданий(Команда)

	ТабДок = ТабличныйДокументЗаданий();
	ТабДок.Показать(НСтр("ru='Периоды заданий к расчету операций закрытия месяца'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВидыНеоперативныхЗаданий(Команда)
	
	ОткрытьФорму(
		"Справочник.ВидыНеоперативныхЗаданий.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияНеоперативногоДопроведенияДокументов(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияНеоперативногоДопроведенияДокументов.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
		
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЗаданияКРаспределениюВзаиморасчетов(Команда)
	
	ОткрытьФорму(
		"РегистрСведений.ЗаданияКРаспределениюВзаиморасчетов.ФормаСписка",
		ЗакрытиеМесяцаКлиентЛокализация.ПараметрыФормыРегистраЗаданий(ЭтотОбъект));
		
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуЗакрытиеМесяца24(Команда)
	
	ОбновитьОсновнуюФормуСервер();
	Закрыть();
	ОткрытьФорму("Обработка.ОперацииЗакрытияМесяца.Форма",,,,,,,РежимОткрытияОкнаФормы.Независимый);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область УправлениеФормой

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	// Группы ручных операций
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповНаименование.Имя);
	
	ГруппаОтбора = ДобавитьГруппуОтбораДляОформления(ЭлементОформления);
	
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.ЭтоГруппа", Истина);
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.ВыделитьЦветом", Истина);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Малиновый);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ДеревоЭтаповНаименование.Шрифт,, 12));
	
	// Группы автоматических операций
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповНаименование.Имя);
	
	ГруппаОтбора = ДобавитьГруппуОтбораДляОформления(ЭлементОформления);
	
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.ЭтоГруппа", Истина);
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.ВыделитьЦветом", Ложь);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Зеленый);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ДеревоЭтаповНаименование.Шрифт,, 12));
	
	// Текущий рассчитываемый этап
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповНаименование.Имя);
	
	ГруппаОтбора = ДобавитьГруппуОтбораДляОформления(ЭлементОформления);
	
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.ЭтоЭтап", Истина);
	ДобавитьОтборДляОформления(ГруппаОтбора, "ДеревоЭтапов.Код", Новый ПолеКомпоновкиДанных("ТекущийРассчитываемыйЭтап"));
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ДеревоЭтаповНаименование.Шрифт,,, Истина));
	
	// Текст "Выполнить" неактивного этапа
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповТекстВыполнить.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.Состояние", Перечисления.СостоянияОперацийЗакрытияМесяца.НеТребуется);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru='Не требуется'"));
	
	// Текст "Подробнее" неактивного этапа
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповТекстПодробнее.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.Состояние", Перечисления.СостоянияОперацийЗакрытияМесяца.НеТребуется);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "");
	
	// Гиперссылка "Выполнить"
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	РасширеннаяПодсказка = Элементы.ДеревоЭтаповГиперссылкаВыполнитьРасширеннаяПодсказка; // ДекорацияФормы
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповГиперссылкаВыполнить.Имя);
	ДобавитьПолеДляОформления(ЭлементОформления, РасширеннаяПодсказка.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.ГиперссылкаВыполнить", Ложь);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость",  Ложь);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	// Текст "Выполнить"
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	РасширеннаяПодсказка = Элементы.ДеревоЭтаповТекстВыполнитьРасширеннаяПодсказка; // ДекорацияФормы
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповТекстВыполнить.Имя);
	ДобавитьПолеДляОформления(ЭлементОформления, РасширеннаяПодсказка.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.ГиперссылкаВыполнить", Истина);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость",  Ложь);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	// Гиперссылка "Подробнее"
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	РасширеннаяПодсказка = Элементы.ДеревоЭтаповГиперссылкаПодробнееРасширеннаяПодсказка; // ДекорацияФормы
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповГиперссылкаПодробнее.Имя);
	ДобавитьПолеДляОформления(ЭлементОформления, РасширеннаяПодсказка.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.ГиперссылкаПодробнее", Ложь);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость",  Ложь);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	// Текст "Подробнее"
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	РасширеннаяПодсказка = Элементы.ДеревоЭтаповТекстПодробнееРасширеннаяПодсказка; // ДекорацияФормы
	
	ДобавитьПолеДляОформления(ЭлементОформления, Элементы.ДеревоЭтаповТекстПодробнее.Имя);
	ДобавитьПолеДляОформления(ЭлементОформления, РасширеннаяПодсказка.Имя);
	
	ДобавитьОтборДляОформления(ЭлементОформления.Отбор, "ДеревоЭтапов.ГиперссылкаПодробнее", Истина);
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость",  Ложь);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
КонецПроцедуры

&НаСервере
Функция ДобавитьПолеДляОформления(ЭлементОформления, ИмяПоля)
	
	ПолеЭлемента = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
	
	Возврат ПолеЭлемента;
	
КонецФункции

&НаСервере
Функция ДобавитьГруппуОтбораДляОформления(ЭлементОформления)
	
	ГруппаОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	
	Возврат ГруппаОтбора;
	
КонецФункции

&НаСервере
Функция ДобавитьОтборДляОформления(ГруппаОтбора, ИмяПоляОтбора, ЗначениеОтбора)
	
	ОтборЭлемента = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляОтбора);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = ЗначениеОтбора;
	
	Возврат ОтборЭлемента;
	
КонецФункции

&НаСервере
Процедура НастроитьЭлементыПриИнициализацииФормы(ВыполняетсяЗагрузкаНастроек = Ложь)
	
	ПредставлениеПериодаРегистрации = ЗакрытиеМесяцаКлиентСервер.ПредставлениеПериодаМесяцГод(Объект.ПериодРегистрации);
	
	СформироватьПредставлениеОрганизаций();
	
	Если НЕ ВыполняетсяЗагрузкаНастроек Тогда
		
		// Настроим отображение элементов командной панели.
		Элементы.КнопкаНастроитьПроверки.Видимость =
			ПравоДоступа("Изменение", Метаданные.Справочники.ПравилаПроверкиУчета);
			
		БылВключенПартионныйУчет = РасчетСебестоимостиПовтИсп.ИспользовалсяПартионныйУчетДоПереходаНаВерсию22(Дата(1,1,1));
		Элементы.ФормаОтчетСверкаОстатковОперативногоУчетаИСебестоимости.Видимость =
		    ?(БылВключенПартионныйУчет = Неопределено, Ложь, БылВключенПартионныйУчет)
			И ПравоДоступа("Просмотр", Метаданные.Отчеты.СверкаОстатковОперативногоУчетаИСебестоимости);
			
		// Настроим видимость команд открытия регистров заданий.
		Элементы.ФормаОткрытьЗаданияКЗакрытиюМесяца.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКЗакрытиюМесяца);
		Элементы.ФормаОткрытьЗаданияКРасчетуСебестоимости.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуСебестоимости);
		Элементы.ФормаОткрытьЗаданияКРаспределениюРасчетовСКлиентами.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРаспределениюРасчетовСКлиентами);
		Элементы.ФормаОткрытьЗаданияКРаспределениюРасчетовСПоставщиками.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРаспределениюРасчетовСПоставщиками);

		Элементы.ФормаОткрытьЗаданияКРасчетуАмортизацииОС.Видимость =
		    Ложь // в УТ11

			//++ НЕ УТ
			ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуАмортизацииОС)
			//-- НЕ УТ
			ИЛИ Ложь; // для соблюдение стандарта по переносу выражений
		Элементы.ФормаОткрытьЗаданияКРасчетуАмортизацииНМА.Видимость =
		    Ложь // в УТ11

			//++ НЕ УТ
			ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуАмортизацииНМА)
			//-- НЕ УТ
			ИЛИ Ложь; // для соблюдение стандарта по переносу выражений
		Элементы.ФормаОткрытьЗаданияКРасчетуСтоимостиВНА.Видимость =
		    Ложь // в УТ11

			//++ НЕ УТ
			ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуСтоимостиВНА)
				И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы2_4")
			//-- НЕ УТ
			ИЛИ Ложь; // для соблюдение стандарта по переносу выражений
			
		Элементы.ФормаОткрытьЗаданияКАктуализацииДвиженийПоВНА.Видимость =
		    Ложь // в УТ11

			//++ НЕ УТ
			ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКАктуализацииДвиженийПоВНА)
				И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы2_4")
			//-- НЕ УТ
			ИЛИ Ложь; // для соблюдение стандарта по переносу выражений
			
		Элементы.ФормаОткрытьЗаданияКФормированиюДвиженийПоВНА.Видимость =
		    Ложь // в УТ11

			//++ НЕ УТ
			ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКФормированиюДвиженийПоВНА)
				И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы2_4")
			//-- НЕ УТ
			ИЛИ Ложь; // для соблюдение стандарта по переносу выражений
		
		Элементы.ФормаОткрытьЗаданияКФормированиюДвиженийПоНДС.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКФормированиюДвиженийПоНДС);
		
		Элементы.ФормаОткрытьЖурналРегистрации.Видимость =
			ПравоДоступа("Просмотр", Метаданные.Обработки.ЖурналРегистрации);
		
		Элементы.ФормаОткрытьПротоколыРасчетаПартийИСебестоимости.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ПротоколыРасчетаПартийИСебестоимости);
		
		Элементы.КнопкаНастройкаТехнологическихПараметров.Видимость =
			Пользователи.ЭтоПолноправныйПользователь();
		
		Элементы.ФормаАктивныеСеансыЗакрытияМесяца.Видимость =
			ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца);
		
		Элементы.ФормаОткрытьВидыНеоперативныхЗаданий.Видимость = ПравоДоступа("Просмотр",
			Метаданные.Справочники.ВидыНеоперативныхЗаданий);
		Элементы.ФормаОткрытьЗаданияНеоперативногоДопроведенияДокументов.Видимость = ПравоДоступа("Просмотр",
			Метаданные.РегистрыСведений.ЗаданияНеоперативногоДопроведенияДокументов);
		Элементы.ФормаОткрытьЗаданияКРаспределениюВзаиморасчетов.Видимость = ПравоДоступа("Просмотр",
			Метаданные.РегистрыСведений.ЗаданияКРаспределениюВзаиморасчетов);
		Элементы.ГруппаНеоперативнаяОчередьЗаданий.Видимость = Элементы.ФормаОткрытьВидыНеоперативныхЗаданий.Видимость
			Или Элементы.ФормаОткрытьЗаданияНеоперативногоДопроведенияДокументов.Видимость
			Или Элементы.ГруппаНеоперативнаяОчередьЗаданий.Видимость;
		
		// Настроим форму в зависимости от наличия активных фоновых заданий.
		НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
		
	КонецЕсли;
	
	// Настроим отметки элементов командной панели.
	НастроитьОтметкуКнопокНастроек(Объект, Элементы);
	ЗакрытиеМесяцаЛокализация.НастроитьЭлементыПриИнициализацииФормы(ЭтотОбъект, ВыполняетсяЗагрузкаНастроек);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура НастроитьОтметкуКнопокНастроек(Объект, Элементы)
	
	Элементы.КнопкаСкрыватьЭтапыСоСтатусомНеТребуется.Пометка 	    = Объект.СкрыватьЭтапыСоСтатусомНеТребуется;
	Элементы.КнопкаСкрыватьЭтапыСоСтатусомВыполненоУспешно.Пометка  = Объект.СкрыватьЭтапыСоСтатусомВыполненоУспешно;
	Элементы.КнопкаСкрыватьПоясненияКЭтапам.Пометка 		  	    = Объект.СкрыватьПоясненияКЭтапам;
	Элементы.КнопкаАвтообновлениеПриЗакрытииПодчиненныхФорм.Пометка = Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий()
	
	Если НЕ СостояниеРасчета.РасчетЗавершен Тогда
		
		ИдетРасчет = Истина;
		ИдетОбновление = Ложь;
		ОтменитьФоновоеЗадание(ИдентификаторЗаданияОбновленияСостоянийЭтапов, Ложь);
		
	Иначе
		
		ИдетРасчет = Ложь;
		СостояниеЗадания = ТекущееСостояниеФоновогоЗадания(ИдентификаторЗаданияОбновленияСостоянийЭтапов);
		ИдетОбновление = СостояниеЗадания.Активно;
		
		Если ИдетОбновление Тогда
			ПредставлениеРассчитываемогоЭтапа =
				Новый ФорматированнаяСтрока(СокрЛП(СостояниеЗадания.Наименование) + ": ");
				
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.ДекорацияБублик.Видимость 							  = ИдетРасчет ИЛИ ИдетОбновление;
	Элементы.ГруппаПериодИОрганизация.Доступность 	  			  = НЕ ИдетРасчет;
	Элементы.ПредставлениеОрганизаций.Доступность 	  			  = НЕ ИдетРасчет;
	Элементы.ГруппаСтатусРасчета.Доступность 	  				  = НЕ ИдетРасчет И НЕ ИдетОбновление;
	Элементы.ГруппаОтменаРасчетаВФоне.Видимость 	  			  = ИдетРасчет;
	Элементы.ГруппаВыполнениеРасчетаВФоне.Видимость   			  = Истина;
	
	Элементы.ОстановитьРасчетВФоне.Доступность   				  = НЕ ПрерватьРасчет;
	Элементы.КнопкаВыполнитьЗакрытие.Доступность 	  			  = НЕ ИдетРасчет И НЕ ИдетОбновление И НЕ ИзмененияЗапрещены;
	Элементы.КнопкаОбновитьФорму.Доступность 		  			  = НЕ ИдетРасчет И НЕ ИдетОбновление;
	Элементы.ГруппаКнопокНастройкаОтображенияСтрок.Доступность 	  = НЕ ИдетРасчет И НЕ ИдетОбновление;
	Элементы.ГруппаДеревоЭтапов.Доступность 				   	  = НЕ ИдетОбновление Или ФоновоеОбновлениеСостояния;
	Элементы.ФормаПосмотретьПериодыЗаданий.Доступность			  = НЕ ИдетРасчет И НЕ ИдетОбновление;
	
	Элементы.ДеревоЭтаповГиперссылкаВыполнить.Доступность		  = НЕ ИдетРасчет 
		И (НЕ ИдетОбновление Или ФоновоеОбновлениеСостояния) И НЕ ИзмененияЗапрещены;
	Элементы.ДеревоЭтаповГиперссылкаПодробнее.Доступность		  = (НЕ ИдетОбновление Или ФоновоеОбновлениеСостояния);
	
	Элементы.ДеревоЭтапов.Видимость 							  = НЕ ПериодЗаблокирован ИЛИ ФормироватьОперацииЗакрытогоПериода;
	Элементы.НадписьПериодЗаблокирован.Видимость 				  = ПериодЗаблокирован И НЕ ФормироватьОперацииЗакрытогоПериода;
	Элементы.КнопкаПроверитьЗакрытыйПериод.Видимость			  = ПериодЗаблокирован;
	
	Элементы.КнопкаНастроитьБлокировкиОтИзменений.Видимость		  =
		РегистрыСведений.НастройкаБлокировкиОтИзменений.ИспользоватьМеханизмБлокировкиОтИзменений()
		И ЗакрытиеМесяцаСервер.ЕстьПравоУправленияБлокировкойПериода();
	Элементы.КнопкаНастроитьБлокировкиОтИзменений.Доступность	  = НЕ ИдетРасчет
		И (НЕ ИдетОбновление Или ФоновоеОбновлениеСостояния);
	
	Если ИдетОбновление Тогда
		Элементы.ПредставлениеОрганизаций.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
	КонецЕсли;
	
	УстановитьДоступностьРежимаЗакрытияМесяца();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
	
	Элементы.ДатаПредварительногоЗакрытияМесяца.Видимость = (Объект.РежимЗакрытияМесяца = Перечисления.РежимыЗакрытияМесяца.ПредварительноеЗакрытие);
	Элементы.ПредставлениеПериодаРегистрации.Видимость = (Объект.РежимЗакрытияМесяца <> Перечисления.РежимыЗакрытияМесяца.ПредварительноеЗакрытие);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступностьРежимаЗакрытияМесяца()
	
	ПартионныйУчетВерсии22 = РасчетСебестоимостиПовтИсп.ПартионныйУчетВерсии22(Объект.ПериодРегистрации);
	Элементы.РежимЗакрытияМесяца.Доступность = ПартионныйУчетВерсии22; 
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеФормыВФонеНаКлиенте(ФормироватьОписаниеОрганизаций = Истина, ОбновитьКэшСтатусовОпераций = Истина)
	
	ОтключитьОбработчикОжидания("ПроверитьАктивностьФоновогоЗаданияОбновленияФормы");
	
	ЗапуститьОбновлениеДанныхФормыВФоне(ФормироватьОписаниеОрганизаций, ОбновитьКэшСтатусовОпераций);
	
	Если ФоновоеЗаданиеФормированияСписка <> Неопределено Тогда
		
		ОповещениеОПрогрессе = Новый ОписаниеОповещения(
			"ОбновитьПрогрессФормированияЭтапов", ЭтотОбъект);
		
		ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
		ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессе;
		 
		ОповещениеОЗавершение = Новый ОписаниеОповещения("ОбновитьДанныеФормыВФонеНаКлиентеЗавершение", ЭтотОбъект);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(
			ФоновоеЗаданиеФормированияСписка, ОповещениеОЗавершение, ПараметрыОжидания);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеФормыВФонеНаКлиентеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Выполнено" Тогда
		ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте(Истина);
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		
		ДатаДанных = ДатаАктуальностиДанных();
		ОтобразитьДатуСостоянияЭтапов(ДатаДанных);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПрогрессФормированияЭтапов(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено
		И Результат.Статус = "Выполняется"
		И Результат.Прогресс <> Неопределено Тогда
			
			Прогресс = Результат.Прогресс; // см. ДлительныеОперацииКлиент.НовоеСостояниеДлительнойОперации
			ДополнительныеПараметры = Прогресс.ДополнительныеПараметры; // см. ДлительныеОперации.СообщитьПрогресс.ДополнительныеПараметры
			
			Если ДополнительныеПараметры.ОбновитьКэшСтатусовОпераций Тогда
				
				Статус = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru='Статус операций закрытия месяца актуален на %1. Идет обновление %2%.'"),
					Формат(ДополнительныеПараметры.ДатаАктуальностиДанных, "ДЛФ=DDT"),
					Прогресс.Процент);
					
				ПредставлениеРассчитываемогоЭтапа = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
					Статус);
			Иначе
				ПредставлениеРассчитываемогоЭтапа = Новый ФорматированнаяСтрока(
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Формирование списка операций закрытия месяца %1: %2'"),
						ЗакрытиеМесяцаКлиентСервер.ПредставлениеПериодаМесяцГод(Объект.ПериодРегистрации),
						Строка(Прогресс.Процент) + "%"));
			КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ЗапуститьОбновлениеДанныхФормыВФоне(ФормироватьОписаниеОрганизаций = Истина, ОбновитьКэшСтатусовОпераций = Истина)
	
	// Отменим старое задания обновления состояний, если оно еще активно.
	ОтменитьФоновоеЗадание(ИдентификаторЗаданияОбновленияСостоянийЭтапов);
	
	// Подготовим вспомогательные данные для запуска обновления состояний этапов.
	АдресХранилищаДляЗаданияОбновленияСостоянийЭтапов = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	
	Период = ?(Объект.РежимЗакрытияМесяца = Перечисления.РежимыЗакрытияМесяца.ПредварительноеЗакрытие,
		Объект.ДатаПредварительногоЗакрытияМесяца,
		Объект.ПериодРегистрации);
	СтруктураДанных = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьСтруктуруДанныхДляЗаполненияСостоянияЭтапов(
		Период,
		Новый Массив(Объект.МассивОрганизаций),
		ПолучитьХранилищеДанных(),
		Объект.РежимЗакрытияМесяца);
		
	ПараметрыРасчета = СтруктураДанных.ПараметрыРасчета; // сохраним в данных формы
	
	ПараметрыЗапускаОбновленияСостояния = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыЗапускаДляЗаполненияСостоянияЭтапов(
		СтруктураДанных,
		АдресХранилищаДляЗаданияОбновленияСостоянийЭтапов,
		,
		РежимРаботы.ДоступностьВидовУчета);
	
	ПараметрыЗапускаОбновленияСостояния.ПроверятьДатуЗапрета 			  = Истина;
	ПараметрыЗапускаОбновленияСостояния.ОчищатьНеиспользуемыеЗаписиЗаданий= Истина;
	ПараметрыЗапускаОбновленияСостояния.ОбновлятьКэшиРегламентныхЗаданий  = Истина;
	ПараметрыЗапускаОбновленияСостояния.ОбновлятьСписокПроверок  		  = НЕ ВыполненыОперацииПриОткрытии;
	ПараметрыЗапускаОбновленияСостояния.ПроверятьЗавершениеРасчетов		  = НЕ ВыполненыОперацииПриОткрытии;
	ПараметрыЗапускаОбновленияСостояния.ВыполнятьПроверкиДоЭтапа 		  = Истина;
	ПараметрыЗапускаОбновленияСостояния.ФормироватьОписаниеОрганизаций	  = ФормироватьОписаниеОрганизаций;
	ПараметрыЗапускаОбновленияСостояния.ВыполняетсяПредварительноеЗакрытиеМесяца = 
		?(Объект.РежимЗакрытияМесяца = Перечисления.РежимыЗакрытияМесяца.ПредварительноеЗакрытие, Истина, Ложь);
	ПараметрыЗапускаОбновленияСостояния.ФормироватьОперацииЗакрытогоПериода = ФормироватьОперацииЗакрытогоПериода;
	ПараметрыЗапускаОбновленияСостояния.ОбновитьКэшСтатусовОпераций = ОбновитьКэшСтатусовОпераций;
	
	ФоновоеОбновлениеСостояния = ОбновитьКэшСтатусовОпераций;
	
	// Запустим обновление состояний.
	
	НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Формирование списка операций закрытия месяца %1'"),
		РасчетСебестоимостиПротоколРасчета.ПредставлениеПериодаРасчета(Объект.ПериодРегистрации));
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
	ПараметрыВыполнения.ОжидатьЗавершение = 1;
	
	ФоновоеЗаданиеФормированияСписка = ДлительныеОперации.ВыполнитьВФоне(
		"ЗакрытиеМесяцаСервер.ЗаполнитьСостоянияЭтаповВФоновомЗадании",
		ПараметрыЗапускаОбновленияСостояния,
		ПараметрыВыполнения);

	ИдентификаторЗаданияОбновленияСостоянийЭтапов = ФоновоеЗаданиеФормированияСписка.ИдентификаторЗадания;
	
	// Настроим элементы формы.
	НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
	
	УстановитьПараметрыРегламентногоЗаданияНеоперативнойОчереди();
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Процедура ПроверитьАктивностьФоновогоЗаданияОбновленияФормы()
	
	Если ФоновоеЗаданиеАктивно(ИдентификаторЗаданияОбновленияСостоянийЭтапов) Тогда
		ПодключитьОбработчикОжидания("ПроверитьАктивностьФоновогоЗаданияОбновленияФормы", ИнтервалПроверкиФоновыхЗаданий(), Истина);
		Возврат;
	КонецЕсли;
	
	ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте(ПолучитьДанныеИзФоновогоЗадания = Ложь)
	
	Результат = ЗаполнитьФормуОбновленнымиДаннымиНаСервере(ПолучитьДанныеИзФоновогоЗадания);
	
	ТекстОшибки =  Результат.ТекстОшибки;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	// Раскроем все уровни дерева.
	Если НЕ ПериодЗаблокирован ИЛИ ФормироватьОперацииЗакрытогоПериода Тогда
		Для Каждого ТекущаяСтрока Из ДеревоЭтапов.ПолучитьЭлементы() Цикл
			Элементы.ДеревоЭтапов.Развернуть(ТекущаяСтрока.ПолучитьИдентификатор(), Ложь);
		КонецЦикла;
	КонецЕсли;
	
	ВыполненыОперацииПриОткрытии = Истина; // список проверок обновляем однократно, при открытии формы
	
	Если Результат.ТребуетсяПерезапуск Тогда
		ОбновитьДанныеФормыВФонеНаКлиенте(,Истина);
	КонецЕсли;
	
	Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
	
КонецПроцедуры

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

			ПредставлениеРассчитываемогоЭтапа = СтроковыеФункции.ФорматированнаяСтрока(
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Статус операций закрытия месяца актуален на %1. Идет обновление 1%.'"),
					Формат(СтруктураДанных.ДатаАктуальностиДанных, "ДЛФ=DDT")));
			
		Иначе

			ПредставлениеРассчитываемогоЭтапа = СтроковыеФункции.ФорматированнаяСтрока(
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Статус операций закрытия месяца актуален на %1.'"),
						Формат(ТекущаяДатаСеанса(), "ДЛФ=DDT")));
			
		КонецЕсли;
		
		// Обновим шапку формы.
		ЗаполнитьСостояниеЗакрытияМесяца();
		
	КонецЕсли;
	
	Если ПолучитьДанныеИзФоновогоЗадания Тогда
		
		// Настроим вид формы в зависимости от наличия активных фоновых заданий.
		НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
		
	КонецЕсли;
	
	Если ТипЗнч(СтруктураДанных) <> Тип("Структура") Тогда
		
		// Вернем текст ошибки для вывода в форме.
		МесяцЗакрытУспешно  = Неопределено;
		ОписаниеОрганизаций = Обработки.ОперацииЗакрытияМесяца.ОписаниеОрганизацийДляРасчета(Объект.ПериодРегистрации, Истина);
		ОписаниеОрганизацийСформировано = Ложь;
		
		СостояниеЗадания = ТекущееСостояниеФоновогоЗадания(ИдентификаторЗаданияОбновленияСостоянийЭтапов);
		
		Если ЗначениеЗаполнено(СостояниеЗадания.ТекстОшибки) Тогда
			
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='При формировании списка операций закрытия месяца возникла ошибка:
					|%1.'"),
				СостояниеЗадания.ТекстОшибки);
			
		Иначе
			
			Пояснение = "";
			Если СостояниеЗадания.Отменено Тогда
				Пояснение = НСтр("ru = 'отменено администратором'");
			ИначеЕсли СостояниеЗадания.ЗавершеноАварийно Тогда
				Пояснение = НСтр("ru = 'завершено аварийно'");
			КонецЕсли;
			
			Если ЗначениеЗаполнено(Пояснение) Тогда
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'При формировании списка операций закрытия месяца возникла ошибка:
						|фоновое задание %1.'"), Пояснение);
			КонецЕсли;
			
		КонецЕсли;
		
		Результат.ТекстОшибки = ТекстОшибки;
		Возврат Результат;
		
	КонецЕсли;
	
	СтруктураДанных.Удалить("СостоянияЭтаповИзКэша");
	
	ХранилищеДанных = Новый ХранилищеЗначения(СтруктураДанных, Новый СжатиеДанных(9));
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьПромежуточныеПоясненияЭтапаНаСервере()
	
	СтруктураДанных = ПолучитьХранилищеДанных();
	ЗаполнитьПромежуточныеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных, Истина);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПромежуточныеПоясненияЭтапа(РассчитываемыйЭтап, СтруктураДанных, РасчетВыполняется = Ложь)
	
	// При начале расчета этапа и в процессе выполнения расчета этапа добавляет найденные проблемы в форму закрытия месяца
	СтрокаТаблицыЭтапов = СтруктураДанных.ТаблицаЭтапы.Найти(РассчитываемыйЭтап, "Код");
	ИдентификаторСтрокиЭтапа = СтруктураДанных.ТаблицаЭтапы.Найти(РассчитываемыйЭтап, "Код").ИдентификаторСтроки;
	
	Если ИдентификаторСтрокиЭтапа < 0 Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаЭтапа = ДеревоЭтапов.НайтиПоИдентификатору(ИдентификаторСтрокиЭтапа);
	
	Если СтрокаЭтапа = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаЭтапа.ПолучитьЭлементы().Очистить();
	
	ПараметрыЗапускаРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыЗапускаДляРасчетаЭтапов(
		СтруктураДанных,
		СтрокаТаблицыЭтапов.Код,
		СостояниеРасчета.ЭтапыКРасчету[СостояниеРасчета.КоличествоЭтапов - 1],
		Объект.РежимЗакрытияМесяца,
		АдресХранилищаДляЗаданияРасчетаЭтапов,
		РежимРаботы.ДоступностьВидовУчета,
		ИдентификаторРасчета);
		
	ПараметрыЗапускаОбновленияСостояния = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыЗапускаДляЗаполненияСостоянияЭтапов(
		СтруктураДанных,
		,
		СтрокаТаблицыЭтапов.Код,
		ПараметрыЗапускаРасчета);
	
	ПараметрыЗапускаОбновленияСостояния.ФормироватьОписаниеОрганизаций = Ложь;
	
	ПараметрыОбработчика = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыОбработчикаЭтапа(
		СтруктураДанных,
		СтрокаТаблицыЭтапов,
		ПараметрыЗапускаОбновленияСостояния,
		"ЗакрытиеМесяца.ОбновлениеСостояния."
			+ Справочники.ОперацииЗакрытияМесяца.ПолучитьИмяПредопределенного(СтрокаТаблицыЭтапов.Код));
 
	ОтборМоментыЗапускаПроверки = Новый Массив;
	ОтборМоментыЗапускаПроверки.Добавить(Перечисления.МоментЗапускаПроверкиОперацииЗакрытияМесяца.ДоРасчета);
	ОтборМоментыЗапускаПроверки.Добавить(Перечисления.МоментЗапускаПроверкиОперацииЗакрытияМесяца.ДоИПослеРасчета);
	Если РасчетВыполняется Тогда
		ОтборМоментыЗапускаПроверки.Добавить(Перечисления.МоментЗапускаПроверкиОперацииЗакрытияМесяца.ВоВремяРасчета);
	КонецЕсли;
	
	Обработки.ОперацииЗакрытияМесяца.ОпределитьСостояниеИЗаполнитьПоясненияКЭтапу(
		СтруктураДанных,
		СтрокаТаблицыЭтапов,
		ПараметрыОбработчика,
		ОтборМоментыЗапускаПроверки);
	
	ДобавитьСтрокиДереваИзТаблицы(
		СтруктураДанных.ТаблицаСгруппированныхПояснений,
		СтруктураДанных.ТаблицаЭтапы,
		"ЭтоПояснение",
		Новый Структура("Родитель", РассчитываемыйЭтап));
	
	ХранилищеДанных = Новый ХранилищеЗначения(СтруктураДанных, Новый СжатиеДанных(9));
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьВсеПоясненияЭтапа(РассчитываемыйЭтап, СтруктураДанных)
	
	// После выполнения расчета и определения состояния переносит все найденные проблемы в форму закрытия месяца
	СтрокаТаблицыЭтапов = СтруктураДанных.ТаблицаЭтапы.Найти(РассчитываемыйЭтап, "Код");
	ИдентификаторСтрокиЭтапа = СтрокаТаблицыЭтапов.ИдентификаторСтроки;
	
	СтрокаТаблицыРодителей = СтруктураДанных.ТаблицаГруппыЭтапов.Найти(СтрокаТаблицыЭтапов.Родитель, "Код");
	ИдентификаторСтрокиРодителя = СтрокаТаблицыРодителей.ИдентификаторСтроки;
	
	Если ИдентификаторСтрокиЭтапа >= 0 Тогда
		
		СтрокаЭтапа = ДеревоЭтапов.НайтиПоИдентификатору(ИдентификаторСтрокиЭтапа);
		
		Если СтрокаЭтапа <> Неопределено Тогда
			
			СтрокаЭтапа.ПолучитьЭлементы().Очистить();
			
			ЗаполнитьЗначенияСвойств(СтрокаЭтапа, СтрокаТаблицыЭтапов);
			УстановитьКартинкуСтатусаСтрокиДереваЭтапов(СтрокаЭтапа);
			
		КонецЕсли;
		
	КонецЕсли;

	Если ИдентификаторСтрокиРодителя >= 0 Тогда

		СтрокаРодителя = ДеревоЭтапов.НайтиПоИдентификатору(ИдентификаторСтрокиРодителя);
		Если СтрокаРодителя <> Неопределено Тогда
			ЗаполнитьЗначенияСвойств(СтрокаРодителя, СтрокаТаблицыРодителей);
			УстановитьКартинкуСтатусаСтрокиДереваЭтапов(СтрокаРодителя);
		КонецЕсли;
		
	КонецЕсли;
	
	ДобавитьСтрокиДереваИзТаблицы(
		СтруктураДанных.ТаблицаСгруппированныхПояснений,
		СтруктураДанных.ТаблицаЭтапы,
		"ЭтоПояснение",
		Новый Структура("Родитель", РассчитываемыйЭтап));
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьАктивностьФоновогоЗаданияРасчета()
	
	СостояниеЗадания = ТекущееСостояниеФоновогоЗадания(ИдентификаторЗаданияРасчетаЭтапов);
	
	Если ЗначениеЗаполнено(СостояниеЗадания.ТекстОшибки) Тогда
		
		ЗафиксироватьПроблемуАварийногоЗавершенияРасчета(СостояниеЗадания.ТекстОшибки);
		
	ИначеЕсли СостояниеЗадания.Отменено ИЛИ СостояниеЗадания.ЗавершеноАварийно ИЛИ СостояниеЗадания.НеНайдено Тогда
		
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Фоновое задание расчета %1.'", КодОсновногоЯзыка),
			?(СостояниеЗадания.Отменено,
				НСтр("ru='отменено администратором'", КодОсновногоЯзыка),
				?(СостояниеЗадания.ЗавершеноАварийно,
					НСтр("ru='завершено аварийно'", КодОсновногоЯзыка),
					НСтр("ru='не найдено в списке заданий'", КодОсновногоЯзыка))));
		
		ЗафиксироватьПроблемуАварийногоЗавершенияРасчета(ТекстОшибки);
		
	КонецЕсли;
	
	Если СостояниеЗадания.Активно // еще выполняется расчет этапа
	 ИЛИ ЗапуститьРасчетСледующегоЭтапаВФоне() Тогда // запущен расчет следующего этапа
	 
		Если НЕ СостояниеЗадания.Активно Тогда
			Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
			ДлительностьРасчетаЭтапа = 0;
		Иначе
			
			// Получим список уже найденных проблем
			ДлительностьРасчетаЭтапа = ДлительностьРасчетаЭтапа + 1;
			ИтерацийПроверкиАктивностиРасчета = ДлительностьРасчетаЭтапа / ИнтервалОбновленияПроблемРасчетаЭтапа();
			
			Если Цел(ИтерацийПроверкиАктивностиРасчета) = ИтерацийПроверкиАктивностиРасчета Тогда
				ЗаполнитьПромежуточныеПоясненияЭтапаНаСервере();
				Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
			КонецЕсли;
			
		КонецЕсли;
		
		ПредставлениеРассчитываемогоЭтапа = 
			Новый ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Выполняется операция ""%1""...'"),
				СостояниеРасчета.ПредставлениеЭтапа));
		
		УстановитьКартинкиСтатусаПриДлительнойОперации(Ложь);
	 	ПодключитьОбработчикОжидания("ПроверитьАктивностьФоновогоЗаданияРасчета", ИнтервалПроверкиФоновыхЗаданий(), Истина);
		Возврат;
		
	КонецЕсли;
	
	Если ПрерватьРасчет Тогда
		
		// Расчет прерван.
		ОбновитьДанныеФормыВФонеНаКлиенте(Ложь, Ложь);
		
	Иначе
		
		// Расчет завершен.
		ЗаполнитьФормуОбновленнымиДаннымиНаКлиенте();
		
		НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
		
	КонецЕсли;
	
	Оповестить("ВыполненоЗакрытиеМесяца");
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеПериодаРегистрацииНачалоВыбораЗавершение(ВыбранныйПериод, ДополнительныеПараметры) Экспорт 
	
	Если ВыбранныйПериод <> Неопределено Тогда
		
		Объект.ПериодРегистрации = ВыбранныйПериод;
		ПредставлениеПериодаРегистрации = ЗакрытиеМесяцаКлиентСервер.ПредставлениеПериодаМесяцГод(Объект.ПериодРегистрации);
		Объект.ДатаПредварительногоЗакрытияМесяца = КонецМесяца(Объект.ПериодРегистрации);
		
		ОбновитьДанныеФормыВФонеНаКлиенте(, Ложь);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗавершениеЗаданийПриЗакрытииФормы()
	
	ОтменитьФоновоеЗадание(ИдентификаторЗаданияОбновленияСостоянийЭтапов, Ложь);
	ОтменитьФоновоеЗадание(ИдентификаторЗаданияРасчетаЭтапов, Ложь);

	Обработки.ОперацииЗакрытияМесяца.ЗавершитьПодчиненныеЗаданияЭтапаРасчета(ИдентификаторРасчета);
	
	РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьОНачалеРасчета(ОписаниеДействия = Неопределено)
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Период", Объект.ПериодРегистрации);
	ПараметрыОповещения.Вставить("СписокОрганизаций", Объект.МассивОрганизаций);
	
	Оповестить("НачалоРасчетаЗакрытияМесяца", ПараметрыОповещения, ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьХранилищеДанных()
	
	ХранилищеДанныхТипизированное = ХранилищеДанных; // ХранилищеЗначения
	Возврат ХранилищеДанныхТипизированное.Получить();
		
КонецФункции

&НаСервере
Функция ЕстьПравоПросмотраФормы(ИмяФормы)
	
	ЕстьПравоДоступа = Истина;
	МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФормы, ".");
	
	Если МассивСтрок.Количество() >= 2 Тогда
		
		ИмяОбъектаФормы = МассивСтрок[0] + "." + МассивСтрок[1];
		ЕстьПравоДоступа = ПравоДоступа("Просмотр", Метаданные.НайтиПоПолномуИмени(ИмяОбъектаФормы));
		
		Если НЕ ЕстьПравоДоступа Тогда
			ОбщегоНазначения.СообщитьПользователю(
				НСтр("ru='Нет прав доступа к объекту'") + " " + ИмяОбъектаФормы + Символы.ПС
				+ НСтр("ru='Данную операцию может выполнить администратор системы.'"));
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ЕстьПравоДоступа;
	
КонецФункции

&НаСервере
Функция ТабличныйДокументЗаданий()
	
	РасшифровкаЗаданий = РасшифровкаЗаданий; // ХранилищеЗначения
	
	Возврат РасчетСебестоимостиУниверсальныеАлгоритмы.ТаблицуЗначенийВТабличныйДокумент(РасшифровкаЗаданий.Получить());
	
КонецФункции

&НаКлиенте
Процедура ОтветНаВопросОстановкиРасчета(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	Если РезультатЗакрытия <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ОстановитьРасчетВФонеЗавершение();
	
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьРасчетВФонеЗавершение()
	
	ПрерватьРасчет = Истина;
	
	Элементы.ОстановитьРасчетВФоне.Доступность = Ложь; // повторно нажимать кнопку незачем
	
	ОстановитьФоновоеЗаданиеРасчета();
	
	ПроверитьАктивностьФоновогоЗаданияРасчета();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрыРегламентногоЗаданияНеоперативнойОчереди()

	ПараметрыРегламентногоЗаданияНеоперативнойОчереди = НеоперативнаяОчередьЗаданий.ПараметрыРегламентногоЗаданияНеоперативнойОчереди();
	
	ОтображатьГиперссылку = Ложь;
	
	Если НЕ ОбщегоНазначения.РазделениеВключено()
	 И НЕ ПараметрыРегламентногоЗаданияНеоперативнойОчереди.ИдентификаторРегламентногоЗадания = Неопределено Тогда
		ОтображатьГиперссылку = Не ПараметрыРегламентногоЗаданияНеоперативнойОчереди.РегламентноеЗаданиеИспользуется;
	КонецЕсли;
	
	Элементы.НастройкиРегламентногоЗаданияНеоперативногоДопроведенияДокументов.Видимость = ОтображатьГиперссылку;

КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбновитьОсновнуюФормуСервер()

	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
		"Обработка.ОперацииЗакрытияМесяца",
		"ОсновнаяФорма",
		"Обработка.ОперацииЗакрытияМесяца.Форма.ЗакрытиеМесяца");

КонецПроцедуры

#КонецОбласти

#Область ЭтапыРасчета

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьКартинкуСтатусаСтрокиДереваЭтапов(СтрокаДереваЭтапов)
	
	НомерКартинки = 0; // индекс коллекции общей картинки СтатусыВыполненияЭтаповЗакрытияМесяца
	
	Если ТипЗнч(СтрокаДереваЭтапов.Состояние) = Тип("ПеречислениеСсылка.ВажностьПроблемыУчета") Тогда
		
		Если СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.ВажностьПроблемыУчета.Информация") Тогда
			НомерКартинки = 5;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.ВажностьПроблемыУчета.Предупреждение") Тогда
			НомерКартинки = 2;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.ВажностьПроблемыУчета.Ошибка") Тогда
			НомерКартинки = 3;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.ВажностьПроблемыУчета.ВажнаяИнформация") Тогда
			НомерКартинки = 4;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.ВажностьПроблемыУчета.ПолезныйСовет") Тогда
			НомерКартинки = 9;
		КонецЕсли;
		
	Иначе
		
		Если СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.НеТребуется") Тогда
			НомерКартинки = 10;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.Неопределено") Тогда
			НомерКартинки = 8;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.ОжидаетВыполненияПредыдущихОпераций") Тогда
			НомерКартинки = 6;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.ВыполненоСОшибками") Тогда
			НомерКартинки = 2;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.ВыполненоУспешно") Тогда
			Если СтрокаДереваЭтапов.ЕстьВажнаяИнформация Тогда
				НомерКартинки = 12;
			ИначеЕсли СтрокаДереваЭтапов.ЕстьПолезныйСовет Тогда
				НомерКартинки = 11;
			Иначе
				НомерКартинки = 1;
			КонецЕсли;
		ИначеЕсли СтрокаДереваЭтапов.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияОперацийЗакрытияМесяца.НеВыполнено") Тогда
			НомерКартинки = 3;
		КонецЕсли;
		
	КонецЕсли;
	
	СтрокаДереваЭтапов.КартинкаСтатуса = НомерКартинки;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьКартинкиСтатусаПриДлительнойОперации(ВыполняетсяОбновлениеСостояний = Ложь, РодительСтрок = Неопределено)
	
	Если РодительСтрок = Неопределено Тогда
		РодительСтрок = ДеревоЭтапов;
	КонецЕсли;
	
	// Получим индекс коллекции общей картинки СтатусыВыполненияЭтаповЗакрытияМесяца.
	Если ВыполняетсяОбновлениеСостояний Тогда
		НомерКартинки = 8; 
	Иначе
		НомерКартинки = 6; // выполняется расчет
	КонецЕсли;
	
	Для Каждого ТекущаяСтрокаДерева Из РодительСтрок.ПолучитьЭлементы() Цикл
		
		Если ВыполняетсяОбновлениеСостояний Тогда
			ТекущаяСтрокаДерева.КартинкаСтатуса = НомерКартинки;
		Иначе
			Если ТекущаяСтрокаДерева.Код = ТекущийРассчитываемыйЭтап Тогда
				ТекущаяСтрокаДерева.КартинкаСтатуса = НомерКартинки;
			Иначе
				//@skip-check structure-consructor-too-many-keys
				РеквизитыСтроки = Новый Структура("Состояние, ЕстьВажнаяИнформация, ЕстьПолезныйСовет, КартинкаСтатуса");
				ЗаполнитьЗначенияСвойств(РеквизитыСтроки, ТекущаяСтрокаДерева);
				УстановитьКартинкуСтатусаСтрокиДереваЭтапов(РеквизитыСтроки);
				ТекущаяСтрокаДерева.КартинкаСтатуса = РеквизитыСтроки.КартинкаСтатуса;
			КонецЕсли;
		КонецЕсли;
		
		УстановитьКартинкиСтатусаПриДлительнойОперации(ВыполняетсяОбновлениеСостояний, ТекущаяСтрокаДерева);
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьНажатиеГиперссылки(СтрокаДереваЭтапов, НажатоДействиеВыполнить = Истина, ТолькоОдинЭтап = Ложь)
	
	Если СтрокаДереваЭтапов.ЭтоГруппа Тогда
		Возврат; // не поддерживается для групп
	КонецЕсли;
	
	ОчиститьСообщения();
	
	ОписаниеДействия = ПолучитьОписаниеВыбранногоДействияДляВыполненияНаКлиенте(
		СтрокаДереваЭтапов.ЭтоЭтап,
		СтрокаДереваЭтапов.Код,
		НажатоДействиеВыполнить,
		ТолькоОдинЭтап);
	
	Если ОписаниеДействия = Неопределено Тогда
		Возврат; // действие было выполнено на сервере
	КонецЕсли;
	
	Если ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьФорму") Тогда
		
		Если НЕ ЕстьПравоПросмотраФормы(ОписаниеДействия.ИмяФормы) Тогда
			Возврат;
		КонецЕсли;
			
		ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
		
		Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПараметрыФормы, "Отбор") Тогда
			ЗаполнитьЗначенияСвойств(ПараметрыФормы.Отбор, ПараметрыРасчета);
			ПараметрыФормы.Отбор.Организация = ПараметрыФормы.Отбор.МассивОрганизаций;
		Иначе
			ЗаполнитьЗначенияСвойств(ПараметрыФормы, ПараметрыРасчета);
		КонецЕсли;
		
		Если Не (ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПараметрыФормы, "Организация")
			И ЗначениеЗаполнено(ПараметрыФормы.Организация)) Тогда 
			ПараметрыФормы.Вставить("Организация", ЗакрытиеМесяцаКлиентЛокализация.ОрганизацияИзФиксированногоМассива(ОбщийМассивОрганизаций));
		КонецЕсли;
		
		ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект, ПараметрыРасчета);
		
		Если ОписаниеДействия.ОткрыватьФормуСБлокированием Тогда
			РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
		Иначе
			РежимОткрытия = РежимОткрытияОкнаФормы.Независимый;
		КонецЕсли;
		
		ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код,,, ОбработчикЗакрытия, РежимОткрытия);
		
	ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьРезультатыПроверки") Тогда
		
		ПараметрыФормы = Новый Структура("ПараметрыПроверок", ОписаниеДействия.ПараметрыФормы);
		ПараметрыФормы.Вставить("ТекстПроблемы", СтрокаДереваЭтапов.Наименование);
		
		ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код);
		
	ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации") Тогда
		
		ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
		
		ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код);
		
	ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьРасчет") Тогда
		
		Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
		УстановитьКартинкиСтатусаПриДлительнойОперации(Ложь);
		ПроверитьАктивностьФоновогоЗаданияРасчета();
		ОповеститьОНачалеРасчета(ОписаниеДействия);
		
	ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьПроцедуруНаКлиенте") Тогда
		
		ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
		
		ПараметрыПроцедуры = Новый Структура;
		ПараметрыПроцедуры.Вставить("Период", 			 ПараметрыФормы.ПериодРегистрации);
		ПараметрыПроцедуры.Вставить("МассивОрганизаций", ПараметрыФормы.МассивОрганизаций);
		
		ОбработчикЗавершения = Новый ОписаниеОповещения("ВыполнитьПроцедуруНаКлиентеЗавершение", ЭтотОбъект);
		ПараметрыПроцедуры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
		
		Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(
			ПараметрыФормы, "ДополнительныеПараметры") Тогда
				ПараметрыПроцедуры.Вставить("ДополнительныеПараметры", ПараметрыФормы.ДополнительныеПараметры);
		КонецЕсли;
		
		ИмяПроцедуры = ОписаниеДействия.Обработчик + "(ПараметрыПроцедуры)";
		
		Результат = Вычислить(ИмяПроцедуры);

	ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьСправкуОбъекта") Тогда
		
		ОткрытьСправку(ОписаниеДействия.ИмяОбъектаМетаданных);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытиеФормыГиперссылкиДействие(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	Если НЕ СостояниеРасчета.РасчетЗавершен Тогда
		// Не обновляем форму при выполнении расчета
		Возврат;
	КонецЕсли;
	
	ПринудительноОбновитьФорму = ТипЗнч(РезультатЗакрытия) = Тип("Структура") И РезультатЗакрытия.Свойство("ОбновитьФормуЗакрытиМесяца");
	
	Если НЕ Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм И НЕ ПринудительноОбновитьФорму Тогда
		Возврат;
	КонецЕсли;
	
	// При закрытии формы ручной операции надо обновить состояние этапов.
	ОбновитьДанныеФормыВФонеНаКлиенте(, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПроцедуруНаКлиентеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ОбновитьДанныеФормыВФонеНаКлиенте();
	
КонецПроцедуры

&НаСервере
Функция ПолучитьОписаниеВыбранногоДействияДляВыполненияНаКлиенте(ЭтоЭтап, КодСтроки, НажатоДействиеВыполнить = Истина, ТолькоОдинЭтап = Ложь)
	
	СтруктураДанных = ПолучитьХранилищеДанных();
	
	ТаблицаОписанияДействий = ?(ЭтоЭтап, СтруктураДанных.ТаблицаЭтапы, СтруктураДанных.ТаблицаСгруппированныхПояснений);
	СтрокаТаблицыДействий   = ТаблицаОписанияДействий.Найти(КодСтроки, "Код");
	
	Если СтрокаТаблицыДействий = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ОписаниеДействия = ?(НажатоДействиеВыполнить, СтрокаТаблицыДействий.ДействиеВыполнить, СтрокаТаблицыДействий.ДействиеПодробнее);
	
	Если ЭтоЭтап И НЕ СтрокаТаблицыДействий.ВыполняетсяВручную И НЕ НажатоДействиеВыполнить Тогда // действие "Подробнее" у расчетного этапа
		
		// Если действие "Подробнее" не определено, то откроем ЖР.
		Если НЕ ЗначениеЗаполнено(ОписаниеДействия) Тогда
			ОписаниеДействия = ЗакрытиеМесяцаСервер.ОписаниеДействия_ОткрытьЖурналРегистрации(КодСтроки);
		КонецЕсли;
		
	КонецЕсли;
		
	Если ОписаниеДействия.ВидДействия = Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации Тогда
		
		СведенияОРасчете = РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.ПолучитьСведенияОВыполненииЭтапа(
			СтруктураДанных.ПараметрыРасчета.МассивОрганизаций,
			СтруктураДанных.ПараметрыРасчета.ПериодРегистрации,
			КодСтроки);
		
		ЗаполнитьЗначенияСвойств(ОписаниеДействия.ПараметрыФормы, СведенияОРасчете);
		
	КонецЕсли;
	
	Если ОписаниеДействия.НаКлиенте Тогда
		
		Если ОписаниеДействия.ВидДействия <> Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации Тогда
			
			ОписаниеДействия.ПараметрыФормы.Вставить("МассивОрганизаций", СтруктураДанных.ПараметрыРасчета.МассивОрганизаций);
			ОписаниеДействия.ПараметрыФормы.Вставить("ПериодРегистрации", СтруктураДанных.ПараметрыРасчета.ПериодРегистрации);
			ОписаниеДействия.ПараметрыФормы.Вставить("ПроверяемыйПериод", СтруктураДанных.ПараметрыРасчета.ПериодРегистрации);
			
			ДополнительныеОтборыФормы = Новый Структура("ТипыРегламентныхОпераций");
			ЗаполнитьЗначенияСвойств(ДополнительныеОтборыФормы, СтрокаТаблицыДействий);
			
			Если ЗначениеЗаполнено(ДополнительныеОтборыФормы.ТипыРегламентныхОпераций) Тогда
				ОписаниеДействия.ПараметрыФормы.Вставить("ТипОперации", ДополнительныеОтборыФормы.ТипыРегламентныхОпераций);
			КонецЕсли;
			
		КонецЕсли;
		
		Возврат ОписаниеДействия;
		
	КонецЕсли;
	
	Если ОписаниеДействия.ВидДействия = Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьРасчет Тогда
		
		Если ЗапуститьВыполнениеРасчета(КодСтроки, ТолькоОдинЭтап) Тогда
			Возврат ОписаниеДействия; // надо подключить обработчики ожидания
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Неопределено; // на клиенте выполнять не требуется
	
КонецФункции

&НаСервере
Процедура ЗаполнитьСостояниеЗакрытияМесяца()
	
	Если ТипЗнч(МесяцЗакрытУспешно) <> Тип("Булево") Тогда
		Элементы.ГруппаСтатусРасчета.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	Элементы.ПредставлениеСтатусаРасчета.ЦветТекста  = Элементы.ПредставлениеОрганизаций.ЦветТекстаЗаголовка;
	Элементы.ПредставлениеСтатусаРасчета.Гиперссылка = Ложь;
	
	Если МесяцЗакрытУспешно Тогда
		
		Если ЭтаповРассчитано = 0 Тогда
			ПредставлениеСтатусаРасчета = НСтр("ru='Закрытие месяца не требуется'");
		Иначе
			ПредставлениеСтатусаРасчета = НСтр("ru='Все операции выполнены успешно'");
		КонецЕсли;
		
		Если ИзмененияЗапрещены Тогда
			Элементы.ДекорацияСтатусаРасчета.Картинка = БиблиотекаКартинок.ЗакрытоДляИзменения;
		Иначе
			Элементы.ДекорацияСтатусаРасчета.Картинка = БиблиотекаКартинок.ЗеленаяГалкаСредняя;
		КонецЕсли;
		
	Иначе
		
		Если ИзмененияЗапрещены Тогда
			
			ПредставлениеСтатусаРасчета = Новый ФорматированнаяСтрока(
				Новый ФорматированнаяСтрока(НСтр("ru='Расчет невозможен'"),, WebЦвета.Красный),
				"  ",
				Новый ФорматированнаяСтрока(НСтр("ru='Подробнее'"),, WebЦвета.Синий,, "Подробнее"));
			
			Элементы.ДекорацияСтатусаРасчета.Картинка = БиблиотекаКартинок.ЗакрытоДляИзменения;
			
		Иначе

			Если ЗначениеЗаполнено(ОбщаяДатаНачалаРасчета) И ОбщаяДатаНачалаРасчета < Объект.ПериодРегистрации Тогда
				ПредставлениеСтатусаРасчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Требуется пересчет с периода %1'"),
					РасчетСебестоимостиПротоколРасчета.ПредставлениеПериодаРасчета(ОбщаяДатаНачалаРасчета));
				Элементы.ПредставлениеСтатусаРасчета.ЦветТекста  = WebЦвета.Красный;
			Иначе
				ПредставлениеСтатусаРасчета = НСтр("ru = 'Существуют невыполненные операции'");
			КонецЕсли;
			
			Элементы.ДекорацияСтатусаРасчета.Картинка = БиблиотекаКартинок.ВниманиеКрасный;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.ГруппаСтатусРасчета.Видимость = НЕ ПериодЗаблокирован ИЛИ ФормироватьОперацииЗакрытогоПериода;
	
	СформироватьПредставлениеОрганизаций();
	
КонецПроцедуры

&НаСервере
Функция ЗапуститьВыполнениеРасчета(РассчитатьПоЭтап = Неопределено, ТолькоОдинЭтап = Ложь)
	
	// Инициализируем расчет.
	ПрерватьРасчет = Ложь;
	АдресХранилищаДляЗаданияРасчетаЭтапов = "";
	ДлительностьРасчетаЭтапа = 0;
	
	СостояниеРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьСтруктуруСостоянияРасчетаЭтапов(
		ПолучитьХранилищеДанных(),
		РассчитатьПоЭтап);
		
	Если ТолькоОдинЭтап Тогда
		СостояниеРасчета.ЭтапыКРасчету.Очистить();
		СостояниеРасчета.ЭтапыКРасчету.Добавить(РассчитатьПоЭтап);
		СостояниеРасчета.КоличествоЭтапов = СостояниеРасчета.ЭтапыКРасчету.Количество();
		СостояниеРасчета.НомерТекущегоЭтапа = СостояниеРасчета.НомерПредыдущегоЭтапа + 1;
		РасчетЗапущен = ЗапуститьРасчетОдногоЭтапаВФоне();
	Иначе
		РасчетЗапущен = ЗапуститьРасчетСледующегоЭтапаВФоне();
	КонецЕсли;
	
	Если РасчетЗапущен Тогда
		НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
	КонецЕсли;
	
	Возврат РасчетЗапущен;
	
КонецФункции

&НаСервере
Функция ЗапуститьРасчетОдногоЭтапаВФоне()
	Перем СтруктураДанных;
	
	ЗаданиеЗапущено = Ложь;
	
	// Получим из фонового задания обновленные состояния этапов.
	Если ЗначениеЗаполнено(АдресХранилищаДляЗаданияРасчетаЭтапов) Тогда
		СтруктураДанных = ПолучитьИзВременногоХранилища(АдресХранилищаДляЗаданияРасчетаЭтапов);
	КонецЕсли;
	
	Если ТипЗнч(СтруктураДанных) <> Тип("Структура") Тогда
		СтруктураДанных = ПолучитьХранилищеДанных();
	КонецЕсли;
	
	АдресХранилищаДляЗаданияРасчетаЭтапов = "";
	
	Если СостояниеРасчета.НомерТекущегоЭтапа < СостояниеРасчета.КоличествоЭтапов - 1 Тогда
		
		Если ЗначениеЗаполнено(ИдентификаторРасчета) Тогда
			РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
		КонецЕсли;
		
		ИдентификаторРасчета = Новый УникальныйИдентификатор;
		
		// Проверим возможность запуска расчета.
		АктивныеРасчеты = РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакЗапускаРасчета(
			Новый Массив(ОбщийМассивОрганизаций),
			ИдентификаторРасчета,
			ИнформацияОЗапускеРасчета, 
			СтруктураДанных.ПараметрыРасчета.ПериодРегистрации,
			СостояниеРасчета.ЭтапыКРасчету[СостояниеРасчета.НомерТекущегоЭтапа + 1]);
		
		Если АктивныеРасчеты.ЕстьАктивныеРасчеты Тогда
			ОбщегоНазначения.СообщитьПользователю(АктивныеРасчеты.ТекстОшибки,,,, ПрерватьРасчет);
		КонецЕсли;
		
	КонецЕсли;
	
	Если ПрерватьРасчет Тогда
		
		СостояниеРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьСтруктуруСостоянияРасчетаЭтапов(Неопределено);
		ТекущийРассчитываемыйЭтап = Неопределено;
		ПредыдущийРассчитываемыйЭтап = Неопределено;
		
		РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
		
		Возврат ЗаданиеЗапущено;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекущийРассчитываемыйЭтап) Тогда
		// Заполним ошибки рассчитанного ранее этапа
		ЗаполнитьВсеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
	КонецЕсли;
	
	НомерЭтапа = 0;
	
	ТаблицаЭтапы = СтруктураДанных.ТаблицаЭтапы; // см. Обработки.ОперацииЗакрытияМесяца.ИнициализироватьТаблицуОписанияЭтапов
	
	ТекущийЭтап   = СостояниеРасчета.ЭтапыКРасчету[НомерЭтапа];
	ТекущаяСтрока = ТаблицаЭтапы.Найти(ТекущийЭтап, "Код");
	
	ТекущийРассчитываемыйЭтап = ТекущийЭтап;
	
	СостояниеРасчета.ПредставлениеЭтапа = ТекущаяСтрока.Наименование;
	
	Если НЕ ЗакрытиеМесяцаСервер.ТребуетсяПересчетЭтапа(ТекущаяСтрока) Тогда
		ЗаполнитьПромежуточныеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
		ЗаполнитьВсеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ИдентификаторРасчета) Тогда
		РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
	КонецЕсли;
	
	// Проверим возможность запуска расчета.
	АктивныеРасчеты = РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакЗапускаРасчета(
		Новый Массив(ОбщийМассивОрганизаций),
		ИдентификаторРасчета,
		ИнформацияОЗапускеРасчета,
		СтруктураДанных.ПараметрыРасчета.ПериодРегистрации,
		СостояниеРасчета.ЭтапыКРасчету[НомерЭтапа]);
	
	Если АктивныеРасчеты.ЕстьАктивныеРасчеты Тогда
		ОбщегоНазначения.СообщитьПользователю(АктивныеРасчеты.ТекстОшибки,,,, ПрерватьРасчет);
	КонецЕсли;
	
	// Подготовим вспомогательные данные для запуска расчета.
	АдресХранилищаДляЗаданияРасчетаЭтапов = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	
	ПараметрыЗапускаРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыЗапускаДляРасчетаЭтапов(
		СтруктураДанных,
		ТекущийЭтап,
		СостояниеРасчета.ЭтапыКРасчету[СостояниеРасчета.КоличествоЭтапов - 1],
		Объект.РежимЗакрытияМесяца,
		АдресХранилищаДляЗаданияРасчетаЭтапов,
		РежимРаботы.ДоступностьВидовУчета,
		ИдентификаторРасчета);
	
	// Запустим расчет.
	ПараметрыЭкспортнойПроцедуры = Новый Массив;
	ПараметрыЭкспортнойПроцедуры.Добавить(ПараметрыЗапускаРасчета);
	
	НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выполнение операций закрытия месяца %1'"),
		РасчетСебестоимостиПротоколРасчета.ПредставлениеПериодаРасчета(СтруктураДанных.ПараметрыРасчета.ПериодРегистрации));
	
	ЗаданиеРасчетаЭтапов = ФоновыеЗадания.Выполнить(
		"ЗакрытиеМесяцаСервер.ВыполнитьРасчетЭтаповВФоновомЗадании",
		ПараметрыЭкспортнойПроцедуры,
		ЗакрытиеМесяцаСервер.ИмяФоновогоЗадания(ИдентификаторРасчета),
		НаименованиеЗадания);
	
	ИдентификаторЗаданияРасчетаЭтапов = ЗаданиеРасчетаЭтапов.УникальныйИдентификатор;
	СостояниеРасчета.НомерПредыдущегоЭтапа = НомерЭтапа;
	
	ЗаполнитьПромежуточныеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
	
	ЗаданиеЗапущено = Истина;
	
	СостояниеРасчета.НомерТекущегоЭтапа = НомерЭтапа;
	СостояниеРасчета.РасчетЗавершен = (НомерЭтапа >= СостояниеРасчета.КоличествоЭтапов);
	
	ХранилищеДанных = Новый ХранилищеЗначения(СтруктураДанных, Новый СжатиеДанных(9));
	
	Если НЕ ЗаданиеЗапущено Тогда
		ТекущийРассчитываемыйЭтап = Неопределено;
		ПредыдущийРассчитываемыйЭтап = Неопределено;
		РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
	КонецЕсли;
	
	Возврат ЗаданиеЗапущено;
	
КонецФункции

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

			ПредыдущаяСтрока = ТаблицаЭтапы.Найти(ПредыдущийРассчитываемыйЭтап, "Код");
			
			Для НомерСтрокиЭтапа = ТаблицаЭтапы.Индекс(ПредыдущаяСтрока) + 1 По ТаблицаЭтапы.Индекс(ТекущаяСтрока) - 1 Цикл
				
				ПропущеннаяСтрока = ТаблицаЭтапы[НомерСтрокиЭтапа];
				Если НЕ ПропущеннаяСтрока.ВыполняетсяВручную Тогда
					Продолжить;
				КонецЕсли;

				ЗаполнитьПромежуточныеПоясненияЭтапа(ПропущеннаяСтрока.Код, СтруктураДанных);
				ЗаполнитьВсеПоясненияЭтапа(ПропущеннаяСтрока.Код, СтруктураДанных);
				
			КонецЦикла;
			
		КонецЕсли;
		
		СостояниеРасчета.ПредставлениеЭтапа = ТекущаяСтрока.Наименование;
		
		Если НЕ ЗакрытиеМесяцаСервер.ТребуетсяПересчетЭтапа(ТекущаяСтрока) Тогда
			ЗаполнитьПромежуточныеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
			ЗаполнитьВсеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ИдентификаторРасчета) Тогда
			РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
		КонецЕсли;
		
		// Проверим возможность запуска расчета.
		АктивныеРасчеты = РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакЗапускаРасчета(
			Новый Массив(ОбщийМассивОрганизаций),
			ИдентификаторРасчета,
			ИнформацияОЗапускеРасчета,
			СтруктураДанных.ПараметрыРасчета.ПериодРегистрации,
			СостояниеРасчета.ЭтапыКРасчету[НомерЭтапа]);
		
		Если АктивныеРасчеты.ЕстьАктивныеРасчеты Тогда
			ОбщегоНазначения.СообщитьПользователю(АктивныеРасчеты.ТекстОшибки,,,, ПрерватьРасчет);
		КонецЕсли;
		
		// Подготовим вспомогательные данные для запуска расчета.
		АдресХранилищаДляЗаданияРасчетаЭтапов = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
		
		ПараметрыЗапускаРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьПараметрыЗапускаДляРасчетаЭтапов(
			СтруктураДанных,
			ТекущийЭтап,
			СостояниеРасчета.ЭтапыКРасчету[СостояниеРасчета.КоличествоЭтапов - 1],
			Объект.РежимЗакрытияМесяца,
			АдресХранилищаДляЗаданияРасчетаЭтапов,
			РежимРаботы.ДоступностьВидовУчета,
			ИдентификаторРасчета);
		
		// Запустим расчет.
		ПараметрыЭкспортнойПроцедуры = Новый Массив;
		ПараметрыЭкспортнойПроцедуры.Добавить(ПараметрыЗапускаРасчета);
		
		НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Выполнение операций закрытия месяца %1'"),
			РасчетСебестоимостиПротоколРасчета.ПредставлениеПериодаРасчета(СтруктураДанных.ПараметрыРасчета.ПериодРегистрации));
		
		ЗаданиеРасчетаЭтапов = ФоновыеЗадания.Выполнить(
			"ЗакрытиеМесяцаСервер.ВыполнитьРасчетЭтаповВФоновомЗадании",
			ПараметрыЭкспортнойПроцедуры,
			ЗакрытиеМесяцаСервер.ИмяФоновогоЗадания(ИдентификаторРасчета),
			НаименованиеЗадания);
		
		ИдентификаторЗаданияРасчетаЭтапов = ЗаданиеРасчетаЭтапов.УникальныйИдентификатор;
		СостояниеРасчета.НомерПредыдущегоЭтапа = НомерЭтапа;
		
		ЗаполнитьПромежуточныеПоясненияЭтапа(ТекущийРассчитываемыйЭтап, СтруктураДанных);
		
		ЗаданиеЗапущено = Истина;
		
		Прервать;
		
	КонецЦикла;
	
	СостояниеРасчета.НомерТекущегоЭтапа = НомерЭтапа;
	СостояниеРасчета.РасчетЗавершен = (НомерЭтапа >= СостояниеРасчета.КоличествоЭтапов);
	
	ХранилищеДанных = Новый ХранилищеЗначения(СтруктураДанных, Новый СжатиеДанных(9));
	
	Если НЕ ЗаданиеЗапущено Тогда
		ТекущийРассчитываемыйЭтап = Неопределено;
		ПредыдущийРассчитываемыйЭтап = Неопределено;
		РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
	КонецЕсли;
	
	Возврат ЗаданиеЗапущено;
	
КонецФункции

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

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

&НаКлиенте
Процедура ОтобразитьДатуСостоянияЭтапов(ДатаСостояния)
	
	Статус = "";
	
	Если ДатаСостояния <> Дата(1,1,1) Тогда
		Статус = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Статус операций закрытия месяца актуален на %1.'"), Формат(ДатаСостояния, "ДЛФ=DDT"));
	КонецЕсли;
	
	ПредставлениеРассчитываемогоЭтапа = СтроковыеФункцииКлиент.ФорматированнаяСтрока(Статус);
	
КонецПроцедуры

#КонецОбласти

#Область ФоновыеЗадания

&НаСервереБезКонтекста
Функция ТекущееСостояниеФоновогоЗадания(ИдентификаторЗадания, ДляЧтенияНаКлиенте = Истина)
	
	СостояниеЗадания = ЗакрытиеМесяцаСервер.ТекущееСостояниеФоновогоЗадания(ИдентификаторЗадания);
	
	Если ДляЧтенияНаКлиенте Тогда
		СостояниеЗадания.Удалить("Задание"); // тип значения этого свойства недоступен на клиенте
	КонецЕсли;
	
	Возврат СостояниеЗадания;
	
КонецФункции

&НаСервереБезКонтекста
Функция ФоновоеЗаданиеАктивно(ИдентификаторЗадания)
	
	СостояниеЗадания = ТекущееСостояниеФоновогоЗадания(ИдентификаторЗадания);
	
	Возврат СостояниеЗадания.Активно;
	
КонецФункции

&НаСервере
Функция ОтменитьФоновоеЗадание(ИдентификаторЗадания, СообщатьОбОшибке = Истина)
	
	Если НЕ ЗакрытиеМесяцаСервер.ОтменитьВыполнениеФоновогоЗадания(ИдентификаторЗадания) Тогда
		
		Если СообщатьОбОшибке Тогда
			ОбщегоНазначения.СообщитьПользователю(
				НСтр("ru='Не удалось отменить выполнение фонового задания формирования списка операций.
					|Подробности см. в Журнале регистрации.'"));
		КонецЕсли;
		
		Возврат Ложь;
		
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Функция ИнтервалПроверкиФоновыхЗаданий()
	Возврат 1;
КонецФункции

&НаКлиенте
Функция ИнтервалОбновленияПроблемРасчетаЭтапа()
	Возврат 10;
КонецФункции

&НаСервере
Функция ОстановитьФоновоеЗаданиеРасчета()
	
	Результат = ЗакрытиеМесяцаСервер.ОтменитьВыполнениеФоновогоЗадания(ИдентификаторЗаданияРасчетаЭтапов);

	Обработки.ОперацииЗакрытияМесяца.ЗавершитьПодчиненныеЗаданияЭтапаРасчета(ИдентификаторРасчета);
	
	РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.УстановитьПризнакОкончанияРасчета(ИдентификаторРасчета);
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ДатаАктуальностиДанных()
	
	НастроитьЭлементыВЗависимостиОтНаличияФоновыхЗаданий();
	
	СтруктураДанных = ПолучитьХранилищеДанных();
	
	Если СтруктураДанных = Неопределено Тогда
		Возврат Дата(1,1,1);
	Иначе
		Возврат СтруктураДанных.ДатаАктуальностиДанных;
	КонецЕсли;
	
	
КонецФункции

#КонецОбласти

#Область Организации

&НаСервере
Функция ОрганизациюВФиксированныйМассив(Организация = Неопределено)
	
	МассивОрганизаций = Новый Массив;
	
	Если ЗначениеЗаполнено(Организация) Тогда
		МассивОрганизаций.Добавить(Организация);
	КонецЕсли;
	
	Возврат Новый ФиксированныйМассив(МассивОрганизаций);
	
КонецФункции

&НаСервере
Процедура СформироватьПредставлениеОрганизаций(МассивОрганизаций = Неопределено)
	
	Если МассивОрганизаций = Неопределено Тогда
		МассивОрганизаций = Объект.МассивОрганизаций;
	КонецЕсли;
	
	Если Объект.ВсеОрганизации
	 ИЛИ (ЗначениеЗаполнено(ОписаниеОрганизаций)
	   И ОбщегоНазначенияУТКлиентСервер.МассивыРавны(МассивОрганизаций, ОписаниеОрганизаций.ДоступныеОрганизации, Ложь)) Тогда
	   
		Если ЗначениеЗаполнено(ОписаниеОрганизаций) И ОписаниеОрганизаций.ЕстьОграниченияДоступа Тогда
			ПредставлениеОрганизаций = НСтр("ru='По всем доступным организациям'");
		Иначе
			ПредставлениеОрганизаций = НСтр("ru='По всем организациям'");
		КонецЕсли;
		
		Элементы.ПредставлениеОрганизаций.КнопкаОчистки = Ложь;
		
	Иначе
		
		ПредставлениеОрганизаций = РасчетСебестоимостиПрикладныеАлгоритмы.ПредставлениеОрганизаций(МассивОрганизаций, ", ");
		
		Элементы.ПредставлениеОрганизаций.КнопкаОчистки = Истина;
		
	КонецЕсли;
	
	Если МесяцЗакрытУспешно = Ложь И НЕ ИзмененияЗапрещены И ЗначениеЗаполнено(ЗаблокированныеОрганизации) Тогда
		
		Элементы.ПредставлениеОрганизаций.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
		Элементы.ПредставлениеОрганизаций.Подсказка = НСтр("ru='Расчет не будет выполнен по заблокированным организациям:'");
		
		Для Каждого ТекОрганизация Из ЗаблокированныеОрганизации Цикл
			Элементы.ПредставлениеОрганизаций.Подсказка = Элементы.ПредставлениеОрганизаций.Подсказка
				+ Символы.ПС + СокрЛП(ТекОрганизация);
		КонецЦикла;
		
	Иначе
		
		Элементы.ПредставлениеОрганизаций.Подсказка = Ложь;
		Элементы.ПредставлениеОрганизаций.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

Связанные материалы