Разукомплектация ОС / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Если Основание.Свойство("ОсновноеСредство") Тогда
		ЗаполнитьНаОснованииОбъектаЭксплуатации(Основание.ОсновноеСредство);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура ПроверитьТаблицуОсновныхСредств(ВспомогательныеРеквизиты, ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов, Отказ)

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

	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, ПроверяемыеРеквизитыТЧ);

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

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

	ВалютаУпр = Константы.ВалютаУправленческогоУчета.Получить();
	ВалютаРегл = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);

	ОчиститьНеиспользуемыеРеквизиты();
	
	Если ОтражатьВУпрУчете И ОтражатьВРеглУчете Тогда
		ДокументВДругомУчете = Неопределено;
	КонецЕсли;
		
	Для каждого ДанныеСтроки Из ОС Цикл

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

		Если ВалютаУпр = ВалютаРегл Тогда
			ДанныеСтроки.ЛиквидационнаяСтоимость = ДанныеСтроки.ЛиквидационнаяСтоимостьРегл;
		КонецЕсли;
		
	КонецЦикла; 
	
КонецПроцедуры

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

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

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

#КонецЕсли

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