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