Операция (регламентированный учет) / Модуль объекта

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

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

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

	Дата = ОбщегоНазначения.ТекущаяДатаПользователя();
	Ответственный = Пользователи.ТекущийПользователь();
	УточнениеПериода = 0;
	
	Если ТипЗнч(ОбъектКопирования) <> Тип("ДокументОбъект.ОперацияБух") Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

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

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

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

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

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

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

//++ НЕ УТ

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

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

#КонецЕсли

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