Списание ОС (2.2) / Модуль объекта

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ИнициализироватьДокумент();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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