Амортизация НМА и списание расходов по НИОКР / Расчет амортизации / Модуль формы

файл

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ОпределитьСледующийМесяцРасчета();
	НачатьРасчетАмортизации();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура НачатьРасчетАмортизации()

	ВыполняетсяРасчет = Истина;
	
	Если ТекущийМесяц = '000101010000' Тогда
		ЗавершитьРасчетИЗакрытьФорму(Неопределено);
		Возврат;
	КонецЕсли;
	
	ПредставлениеПериода = ОбщегоНазначенияУТКлиентСервер.ПолучитьПредставлениеПериодаРегистрации(ТекущийМесяц);
	Элементы.ЗаголовокРасчетаВФоне.Заголовок = СтрШаблон(НСтр("ru = 'Выполняется расчет амортизации за %1'"), ПредставлениеПериода);
	
	ПодключитьОбработчикОжидания("Подключаемый_НачатьРасчетАмортизации", 1, Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеРасчетаАмортизации(Результат, ДополнительныеПараметры) Экспорт

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

&НаКлиенте
Процедура ЗавершитьРасчетИЗакрытьФорму(РезультатРасчета)

	ОбщегоНазначенияУТКлиент.ОповеститьОЗаписиДокументаВЖурнал();
	ВнеоборотныеАктивыКлиент.ОповеститьОЗаписиДокументаВЖурналНМА();
	ВнеоборотныеАктивыКлиент.ОповеститьОРасчетеАмортизации(РезультатРасчета);
	
	Закрыть();

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

&НаКлиенте
Процедура Подключаемый_НачатьРасчетАмортизации()

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

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

&НаКлиенте
Процедура ОпределитьСледующийМесяцРасчета()

	Для каждого ЭлементКоллекции Из ДанныеКРасчету Цикл
		Если ЭлементКоллекции.Дата > ТекущийМесяц Тогда
			ТекущийМесяц = ЭлементКоллекции.Дата;
			Возврат;
		КонецЕсли; 
	КонецЦикла; 

	ТекущийМесяц = '000101010000';
	
КонецПроцедуры

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

&НаСервере
Процедура ОтменитьФоновыйРасчетАмортизации()

	ВыполняетсяРасчет = Ложь;
	ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);

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

&НаСервереБезКонтекста
Функция ПолучитьРезультатРасчета(Знач АдресХранилища)

	РезультатРасчета = ПолучитьИзВременногоХранилища(АдресХранилища);
		
	Возврат РезультатРасчета;
	
КонецФункции

&НаСервере
Процедура ИнициализироватьСлужебныеПараметрыФормы()

	СлужебныеПараметры = Новый Структура;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	АмортизацияНМА2_4.Ссылка КАК Ссылка,
	|	АмортизацияНМА2_4.Организация КАК Организация,
	|	АмортизацияНМА2_4.НомерПакета,
	|	АмортизацияНМА2_4.Дата КАК Дата
	|ИЗ
	|	Документ.АмортизацияНМА2_4 КАК АмортизацияНМА2_4
	|ГДЕ
	|	АмортизацияНМА2_4.Ссылка В(&СписокДокументов)
	|	И НЕ АмортизацияНМА2_4.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	Дата,
	|	Организация";
	СлужебныеПараметры.Вставить("ТекстЗапроса", ТекстЗапроса);
	
	СлужебныеПараметры.Вставить("СобытияЗаписи", Новый Массив);
	СлужебныеПараметры.СобытияЗаписи.Добавить("Запись_АмортизацияНМА2_4");
	
	СлужебныеПараметры.Вставить("ТипыДокументов", Новый Массив);
	СлужебныеПараметры.ТипыДокументов.Добавить("ДокументСсылка.АмортизацияНМА2_4");
	
	АмортизацияНМАЛокализация.ДополнитьСлужебныеПараметрыФормыРасчетАмортизации(СлужебныеПараметры);
	
	СлужебныеПараметрыФормы = Новый ФиксированнаяСтруктура(СлужебныеПараметры);

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

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

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