#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
Если НЕ ОбменДаннымиУТ.ВЭтомУзлеДоступноВыполнениеОперацийЗакрытияМесяца(Отказ) Тогда
Возврат;
КонецЕсли;
КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Обработка.ОперацииЗакрытияМесяца.Команда.ОперацииЗакрытияМесяца");
Обработки.ОперацииЗакрытияМесяца.ПроверитьБлокировкуВходящихДанныхПриОбновленииИБ();
РежимРаботы = Новый Структура;
РежимРаботы.Вставить("БазоваяВерсия", ПолучитьФункциональнуюОпцию("БазоваяВерсия"));
РежимРаботы.Вставить("УправлениеПредприятием", ПолучитьФункциональнуюОпцию("УправлениеПредприятием"));
РежимРаботы.Вставить("КомплекснаяАвтоматизация", ПолучитьФункциональнуюОпцию("КомплекснаяАвтоматизация"));
РежимРаботы.Вставить("УправлениеТорговлей", ПолучитьФункциональнуюОпцию("УправлениеТорговлей"));
РежимРаботы.Вставить("КонтекстноеОткрытиеФормы", ЗначениеЗаполнено(Параметры.ПериодРегистрации));
РежимРаботы.Вставить("ИспользоватьНесколькоОрганизаций",
ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций"));
ЕстьПравоОтраженияДокументовВРеглУчете = ПолучитьФункциональнуюОпцию("УправлениеТорговлей");
ЕстьПравоОтраженияДокументовВРеглУчете =
ЕстьПравоОтраженияДокументовВРеглУчете ИЛИ РеглУчетСервер.ЕстьПравоОтраженияДокументовВРеглУчете();
ЕстьПравоОтраженияДокументовВМеждународномУчете = Ложь;
РежимРаботы.Вставить("ДоступностьВидовУчета", Новый Структура);
РежимРаботы.ДоступностьВидовУчета.Вставить("ОперативныйУчет", Истина);
РежимРаботы.ДоступностьВидовУчета.Вставить("РегламентированныйУчет", ЕстьПравоОтраженияДокументовВРеглУчете);
РежимРаботы.ДоступностьВидовУчета.Вставить("МеждународныйУчет", ЕстьПравоОтраженияДокументовВМеждународномУчете);
РежимРаботы = Новый ФиксированнаяСтруктура(РежимРаботы);
Если РежимРаботы.КонтекстноеОткрытиеФормы Тогда
Объект.ПериодРегистрации = Параметры.ПериодРегистрации;
Объект.МассивОрганизаций = ОрганизациюВФиксированныйМассив(Параметры.Организация);
Иначе
Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
Объект.МассивОрганизаций = ОрганизациюВФиксированныйМассив(ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию());
КонецЕсли;
Если НЕ РежимРаботы.ИспользоватьНесколькоОрганизаций Тогда
Объект.МассивОрганизаций = Новый ФиксированныйМассив(Новый Массив);
КонецЕсли;
Объект.ВсеОрганизации = НЕ ЗначениеЗаполнено(Объект.МассивОрганизаций);
ОписаниеОрганизаций = Обработки.ОперацииЗакрытияМесяца.ОписаниеОрганизацийДляРасчета(Объект.ПериодРегистрации, Истина);
ОписаниеОрганизацийСформировано = Ложь;
Объект.СкрыватьЭтапыСоСтатусомНеТребуется = Истина;
Объект.СкрыватьЭтапыСоСтатусомВыполненоУспешно = Ложь;
Объект.СкрыватьПоясненияКЭтапам = Ложь;
Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм = Истина;
Объект.РежимЗакрытияМесяца = Перечисления.РежимыЗакрытияМесяца.ОкончательноеЗакрытие;
Объект.ДатаПредварительногоЗакрытияМесяца = КонецМесяца(Объект.ПериодРегистрации);
ХранилищеДанных = Новый ХранилищеЗначения(Неопределено);
СостояниеРасчета = Обработки.ОперацииЗакрытияМесяца.ИнициализироватьСтруктуруСостоянияРасчетаЭтапов(Неопределено);
НастроитьЭлементыПриИнициализацииФормы();
УстановитьВидимостьЭлементовФормы();
УстановитьДоступностьРежимаЗакрытияМесяца();
ЗакрытиеМесяцаЛокализация.ПриСозданииНаСервереФормаЗакрытиеМесяца(Отказ, СтандартнаяОбработка, ЭтотОбъект);
Если НЕ РежимРаботы.ДоступностьВидовУчета.ОперативныйУчет
И НЕ РежимРаботы.ДоступностьВидовУчета.РегламентированныйУчет
И НЕ РежимРаботы.ДоступностьВидовУчета.МеждународныйУчет Тогда
ОбщегоНазначения.СообщитьПользователю(
НСтр("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));
Элементы.ФормаОтчетСверкаОстатковОперативногоУчетаИСебестоимости.Видимость =
?(БылВключенПартионныйУчет = Неопределено, Ложь, БылВключенПартионныйУчет)
И ПравоДоступа("Просмотр", Метаданные.Отчеты.СверкаОстатковОперативногоУчетаИСебестоимости);
Элементы.ФормаОткрытьЗаданияКЗакрытиюМесяца.Видимость =
ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКЗакрытиюМесяца);
Элементы.ФормаОткрытьЗаданияКРасчетуСебестоимости.Видимость =
ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуСебестоимости);
Элементы.ФормаОткрытьЗаданияКРаспределениюРасчетовСКлиентами.Видимость =
ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРаспределениюРасчетовСКлиентами);
Элементы.ФормаОткрытьЗаданияКРаспределениюРасчетовСПоставщиками.Видимость =
ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРаспределениюРасчетовСПоставщиками);
Элементы.ФормаОткрытьЗаданияКРасчетуАмортизацииОС.Видимость =
Ложь
ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуАмортизацииОС)
ИЛИ Ложь;
Элементы.ФормаОткрытьЗаданияКРасчетуАмортизацииНМА.Видимость =
Ложь
ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуАмортизацииНМА)
ИЛИ Ложь;
Элементы.ФормаОткрытьЗаданияКРасчетуСтоимостиВНА.Видимость =
Ложь
ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКРасчетуСтоимостиВНА)
И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы2_4")
ИЛИ Ложь;
Элементы.ФормаОткрытьЗаданияКАктуализацииДвиженийПоВНА.Видимость =
Ложь
ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКАктуализацииДвиженийПоВНА)
И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы2_4")
ИЛИ Ложь;
Элементы.ФормаОткрытьЗаданияКФормированиюДвиженийПоВНА.Видимость =
Ложь
ИЛИ ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ЗаданияКФормированиюДвиженийПоВНА)
И ПолучитьФункциональнуюОпцию("ИспользоватьВнеоборотныеАктивы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;
КонецЕсли;
Для Каждого ТекущаяСтрокаДерева Из РодительСтрок.ПолучитьЭлементы() Цикл
Если ВыполняетсяОбновлениеСостояний Тогда
ТекущаяСтрокаДерева.КартинкаСтатуса = НомерКартинки;
Иначе
Если ТекущаяСтрокаДерева.Код = ТекущийРассчитываемыйЭтап Тогда
ТекущаяСтрокаДерева.КартинкаСтатуса = НомерКартинки;
Иначе
РеквизитыСтроки = Новый Структура("Состояние, ЕстьВажнаяИнформация, ЕстьПолезныйСовет, КартинкаСтатуса");
ЗаполнитьЗначенияСвойств(РеквизитыСтроки, ТекущаяСтрокаДерева);
УстановитьКартинкуСтатусаСтрокиДереваЭтапов(РеквизитыСтроки);
ТекущаяСтрокаДерева.КартинкаСтатуса = РеквизитыСтроки.КартинкаСтатуса;
КонецЕсли;
КонецЕсли;
УстановитьКартинкиСтатусаПриДлительнойОперации(ВыполняетсяОбновлениеСостояний, ТекущаяСтрокаДерева);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьНажатиеГиперссылки(СтрокаДереваЭтапов, НажатоДействиеВыполнить = Истина, ТолькоОдинЭтап = Ложь)
Если СтрокаДереваЭтапов.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
ОчиститьСообщения();
ОписаниеДействия = ПолучитьОписаниеВыбранногоДействияДляВыполненияНаКлиенте(
СтрокаДереваЭтапов.ЭтоЭтап,
СтрокаДереваЭтапов.Код,
НажатоДействиеВыполнить,
ТолькоОдинЭтап);
Если ОписаниеДействия = Неопределено Тогда
Возврат;
КонецЕсли;
Если ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьФорму") Тогда
Если НЕ ЕстьПравоПросмотраФормы(ОписаниеДействия.ИмяФормы) Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПараметрыФормы, "Отбор") Тогда
ЗаполнитьЗначенияСвойств(ПараметрыФормы.Отбор, ПараметрыРасчета);
ПараметрыФормы.Отбор.Организация = ПараметрыФормы.Отбор.МассивОрганизаций;
Иначе
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ПараметрыРасчета);
КонецЕсли;
Если Не (ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПараметрыФормы, "Организация")
И ЗначениеЗаполнено(ПараметрыФормы.Организация)) Тогда
ПараметрыФормы.Вставить("Организация", ЗакрытиеМесяцаКлиентЛокализация.ОрганизацияИзФиксированногоМассива(ОбщийМассивОрганизаций));
КонецЕсли;
ОбработчикЗакрытия = Новый ОписаниеОповещения("ЗакрытиеФормыГиперссылкиДействие", ЭтотОбъект, ПараметрыРасчета);
Если ОписаниеДействия.ОткрыватьФормуСБлокированием Тогда
РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
Иначе
РежимОткрытия = РежимОткрытияОкнаФормы.Независимый;
КонецЕсли;
ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код,,, ОбработчикЗакрытия, РежимОткрытия);
ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьРезультатыПроверки") Тогда
ПараметрыФормы = Новый Структура("ПараметрыПроверок", ОписаниеДействия.ПараметрыФормы);
ПараметрыФормы.Вставить("ТекстПроблемы", СтрокаДереваЭтапов.Наименование);
ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код);
ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации") Тогда
ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
ОткрытьФорму(ОписаниеДействия.ИмяФормы, ПараметрыФормы, ЭтотОбъект, СтрокаДереваЭтапов.Код);
ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьРасчет") Тогда
Оповестить("ОбновлениеРезультатовПроверокВФормеЗакрытияМесяца");
УстановитьКартинкиСтатусаПриДлительнойОперации(Ложь);
ПроверитьАктивностьФоновогоЗаданияРасчета();
ОповеститьОНачалеРасчета(ОписаниеДействия);
ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьПроцедуруНаКлиенте") Тогда
ПараметрыФормы = ОписаниеДействия.ПараметрыФормы;
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("Период", ПараметрыФормы.ПериодРегистрации);
ПараметрыПроцедуры.Вставить("МассивОрганизаций", ПараметрыФормы.МассивОрганизаций);
ОбработчикЗавершения = Новый ОписаниеОповещения("ВыполнитьПроцедуруНаКлиентеЗавершение", ЭтотОбъект);
ПараметрыПроцедуры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(
ПараметрыФормы, "ДополнительныеПараметры") Тогда
ПараметрыПроцедуры.Вставить("ДополнительныеПараметры", ПараметрыФормы.ДополнительныеПараметры);
КонецЕсли;
ИмяПроцедуры = ОписаниеДействия.Обработчик + "(ПараметрыПроцедуры)";
Результат = Вычислить(ИмяПроцедуры);
ИначеЕсли ОписаниеДействия.ВидДействия = ПредопределенноеЗначение("Перечисление.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьСправкуОбъекта") Тогда
ОткрытьСправку(ОписаниеДействия.ИмяОбъектаМетаданных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытиеФормыГиперссылкиДействие(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
Если НЕ СостояниеРасчета.РасчетЗавершен Тогда
Возврат;
КонецЕсли;
ПринудительноОбновитьФорму = ТипЗнч(РезультатЗакрытия) = Тип("Структура") И РезультатЗакрытия.Свойство("ОбновитьФормуЗакрытиМесяца");
Если НЕ Объект.АвтообновлениеПриЗакрытииПодчиненныхФорм И НЕ ПринудительноОбновитьФорму Тогда
Возврат;
КонецЕсли;
ОбновитьДанныеФормыВФонеНаКлиенте(, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПроцедуруНаКлиентеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ОбновитьДанныеФормыВФонеНаКлиенте();
КонецПроцедуры
&НаСервере
Функция ПолучитьОписаниеВыбранногоДействияДляВыполненияНаКлиенте(ЭтоЭтап, КодСтроки, НажатоДействиеВыполнить = Истина, ТолькоОдинЭтап = Ложь)
СтруктураДанных = ПолучитьХранилищеДанных();
ТаблицаОписанияДействий = ?(ЭтоЭтап, СтруктураДанных.ТаблицаЭтапы, СтруктураДанных.ТаблицаСгруппированныхПояснений);
СтрокаТаблицыДействий = ТаблицаОписанияДействий.Найти(КодСтроки, "Код");
Если СтрокаТаблицыДействий = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ОписаниеДействия = ?(НажатоДействиеВыполнить, СтрокаТаблицыДействий.ДействиеВыполнить, СтрокаТаблицыДействий.ДействиеПодробнее);
Если ЭтоЭтап И НЕ СтрокаТаблицыДействий.ВыполняетсяВручную И НЕ НажатоДействиеВыполнить Тогда
Если НЕ ЗначениеЗаполнено(ОписаниеДействия) Тогда
ОписаниеДействия = ЗакрытиеМесяцаСервер.ОписаниеДействия_ОткрытьЖурналРегистрации(КодСтроки);
КонецЕсли;
КонецЕсли;
Если ОписаниеДействия.ВидДействия = Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации Тогда
СведенияОРасчете = РегистрыСведений.ВыполнениеОперацийЗакрытияМесяца.ПолучитьСведенияОВыполненииЭтапа(
СтруктураДанных.ПараметрыРасчета.МассивОрганизаций,
СтруктураДанных.ПараметрыРасчета.ПериодРегистрации,
КодСтроки);
ЗаполнитьЗначенияСвойств(ОписаниеДействия.ПараметрыФормы, СведенияОРасчете);
КонецЕсли;
Если ОписаниеДействия.НаКлиенте Тогда
Если ОписаниеДействия.ВидДействия <> Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьЖурналРегистрации Тогда
ОписаниеДействия.ПараметрыФормы.Вставить("МассивОрганизаций", СтруктураДанных.ПараметрыРасчета.МассивОрганизаций);
ОписаниеДействия.ПараметрыФормы.Вставить("ПериодРегистрации", СтруктураДанных.ПараметрыРасчета.ПериодРегистрации);
ОписаниеДействия.ПараметрыФормы.Вставить("ПроверяемыйПериод", СтруктураДанных.ПараметрыРасчета.ПериодРегистрации);
ДополнительныеОтборыФормы = Новый Структура("ТипыРегламентныхОпераций");
ЗаполнитьЗначенияСвойств(ДополнительныеОтборыФормы, СтрокаТаблицыДействий);
Если ЗначениеЗаполнено(ДополнительныеОтборыФормы.ТипыРегламентныхОпераций) Тогда
ОписаниеДействия.ПараметрыФормы.Вставить("ТипОперации", ДополнительныеОтборыФормы.ТипыРегламентныхОпераций);
КонецЕсли;
КонецЕсли;
Возврат ОписаниеДействия;
КонецЕсли;
Если ОписаниеДействия.ВидДействия = Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ВыполнитьРасчет Тогда
Если ЗапуститьВыполнениеРасчета(КодСтроки, ТолькоОдинЭтап) Тогда
Возврат ОписаниеДействия;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
&НаСервере
Процедура ЗаполнитьСостояниеЗакрытияМесяца()
Если ТипЗнч(МесяцЗакрытУспешно) <> Тип("Булево") Тогда
Элементы.ГруппаСтатусРасчета.Видимость = Ложь;
Возврат;
КонецЕсли;
Элементы.ПредставлениеСтатусаРасчета.ЦветТекста = Элементы.ПредставлениеОрганизаций.ЦветТекстаЗаголовка;
Элементы.ПредставлениеСтатусаРасчета.Гиперссылка = Ложь;
Если МесяцЗакрытУспешно Тогда
Если ЭтаповРассчитано = 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='Расчет не будет выполнен по заблокированным организациям:'");
Для Каждого ТекОрганизация Из ЗаблокированныеОрганизации Цикл
Элементы.ПредставлениеОрганизаций.Подсказка = Элементы.ПредставлениеОрганизаций.Подсказка
+ Символы.ПС + СокрЛП(ТекОрганизация);
КонецЦикла;
Иначе
Элементы.ПредставлениеОрганизаций.Подсказка = Ложь;
Элементы.ПредставлениеОрганизаций.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти