Корректировка стоимости и амортизации ОС / Модуль объекта

файл

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);

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

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

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

#Область Заполнение

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

Процедура ЗаполнитьДокументПоОтбору(Основание)

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

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

#Область ПроверкаЗаполнения

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

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

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

#Область Прочее

Процедура ЗаблокироватьДанные()

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

Процедура ЗаполнитьРеквизитыПередЗаписью()

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

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

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

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

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

#КонецЕсли

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