Списание НМА / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	СписаниеНМАЛокализация.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьНаОснованииСписания(Основание, НематериальныйАктив = Неопределено)

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

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

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

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

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

	КонецЕсли;
	
КонецПроцедуры

Процедура ПроверитьНМА(МассивНепроверяемыхРеквизитов, Отказ)

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

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

КонецФункции

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

#КонецЕсли

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