Признание расходов по исследованиям и разработкам / Модуль объекта

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

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

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

Процедура ПриКопировании(ОбъектКопирования)

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

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

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

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

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

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

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

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

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

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

	КонецЕсли;
	
	Возврат ПроверяемыеРеквизитыРаспределения;
	
КонецФункции

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

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

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

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

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

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

Процедура СформироватьЗаданиеКЗакрытиюМесяца()

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

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

#КонецЕсли

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