Сторно / Модуль объекта

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ВызватьИсключение НСтр("ru = 'Копирование документа ""Сторно"" не предусмотрено.'")
	
КонецПроцедуры

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

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

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

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

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

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

#Область ВидыЗапасов

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

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

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

#КонецЕсли

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