Амортизация и износ основных средств (2.2) / Модуль менеджера

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

#Область ПрограммныйИнтерфейс

#Область Проведение

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

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	Возврат; //В дальнейшем будет добавлен код команд
	
КонецПроцедуры

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
КонецПроцедуры

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
	
	ИсточникиДанных = Новый Соответствие;
	Возврат ИсточникиДанных;
	
КонецФункции

Функция АдаптированныйТекстЗапросаДвиженийПоРегистру(ИмяРегистра) Экспорт

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

	Результат = ОбновлениеИнформационнойБазыУТ.РезультатАдаптацииЗапроса();
	Результат.ЗначенияПараметров = ЗначенияПараметров;
	Результат.ТекстЗапроса = ТекстЗапроса;
	
	Возврат Результат;
	
КонецФункции

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

Функция ЗначенияПараметровПроведения(Реквизиты = Неопределено)

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

	Если Реквизиты <> Неопределено Тогда
		ЗначенияПараметровПроведения.Вставить("НомерНаПечать", ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Реквизиты.Номер));
	КонецЕсли; 
	
	Возврат ЗначенияПараметровПроведения;
	
КонецФункции

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

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

#Область ПроведениеПоРеглУчету

Функция ТекстОтраженияВРеглУчете() Экспорт
	
	Возврат УчетОСВызовСервера.ТекстОтраженияВРеглУчетеНачисленнойАмортизации();
	
КонецФункции

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

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

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
КонецПроцедуры

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

#Область БлокировкаПриОбновленииИБ

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

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

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

#КонецЕсли

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