#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Процедура ЗаполнитьКодВидаОперации() Экспорт
Основание = Неопределено;
Если ДокументыОснования.Количество() > 0 Тогда
Основание = ДокументыОснования[0].ДокументОснование;
КонецЕсли;
КодВидаОперации = "01";
ВерсияКодовВидовОпераций = УчетНДСКлиентСервер.ВерсияКодовВидовОпераций(?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Основание", Основание);
Запрос.Текст = "
|ВЫБРАТЬ
| ДанныеОснованийСчетовФактур.ЭтоВозврат
|ИЗ
| РегистрСведений.ДанныеОснованийСчетовФактур КАК ДанныеОснованийСчетовФактур
|ГДЕ
| ДанныеОснованийСчетовФактур.Регистратор = &Основание
|";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.ЭтоВозврат Тогда
КодВидаОперации = ?(ВерсияКодовВидовОпераций >= 3, "01", "03");
КонецЕсли;
Если СоставленКомиссионеромОтИмениПродавца И Продавцы.Количество() > 1 Тогда
КодВидаОперации = "27";
КонецЕсли;
Если КодВидаОперации = "" Тогда
КодВидаОперации = "01";
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПризнакСводныйКорректировочный() Экспорт
Если Корректировочный Тогда
МассивОснований = ДокументыОснования.ВыгрузитьКолонку("ИсходныйДокумент");
МассивОснований = ОбщегоНазначенияКлиентСервер.СвернутьМассив(МассивОснований);
СводныйКорректировочный = МассивОснований.Количество() > 1;
Иначе
СводныйКорректировочный = Ложь;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
ВводОстатков = ДокументыОснования.Количество() > 0
И ТипЗнч(ДокументыОснования[0].ДокументОснование) = Тип("ДокументСсылка.ПервичныйДокумент")
И ДокументыОснования[0].ДокументОснование.ТипПервичногоДокумента = Перечисления.ТипыПервичныхДокументов.ПриобретениеУПоставщика;
#Область КорректировкаПриобретения
ЕстьКорректировки = Ложь;
ЕстьИсправления = Ложь;
НетИсходногоСчетФактуры = Ложь;
ХозОперации = Перечисления.ХозяйственныеОперации;
КоличествоОснований = ДокументыОснования.Количество();
СводныйКорректировочныйПризнак = Истина;
Если ДокументыОснования.Количество() = 0 Тогда
ТекстСообщения = НСтр("ru = 'Не введено ни одной строки в список ""Основания""'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ДокументыОснованияПредставление", , Отказ);
КонецЕсли;
Для Каждого СтрТЧ Из ДокументыОснования Цикл
Если ТипЗнч(СтрТЧ.ДокументОснование) = Тип("ДокументСсылка.КорректировкаПриобретения") Тогда
Если НЕ ПравоДоступа("Чтение", Метаданные.Документы.КорректировкаПриобретения) Тогда
ТекстСообщения = НСтр("ru = 'Нет прав на чтение документов типа Корректировка приобретения'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ДокументыОснованияПредставление", , Отказ);
Возврат;
КонецЕсли;
ОперацияОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрТЧ.ДокументОснование, "ВидКорректировки");
ЕстьКорректировки = ЕстьКорректировки Или ОперацияОснования = ХозОперации.КорректировкаПоСогласованиюСторон;
ЕстьИсправления = ЕстьИсправления Или ОперацияОснования = ХозОперации.ИсправлениеОшибок;
ИначеЕсли ТипЗнч(СтрТЧ.ДокументОснование) = Тип("ДокументСсылка.ВозвратТоваровПоставщику") Тогда
ЕстьКорректировки = Истина;
Иначе
СводныйКорректировочныйПризнак = Ложь;
КонецЕсли;
Если Корректировочный И Не ЗначениеЗаполнено(СтрТЧ.ИсходныйДокумент) Тогда
НетИсходногоСчетФактуры = Истина;
КонецЕсли;
КонецЦикла;
ТекстОшибки = "";
ПутьКЭлементу = "";
Если НетИсходногоСчетФактуры И Не ВводОстатков Тогда
Если КоличествоОснований > 1 Тогда
ТекстСообщения = НСтр("ru = 'Перед добавлением корректировочного счета-фактуры создайте исходный счет-фактуру для всех документов списка ""Документы-основания"".'");
Иначе
ТекстСообщения = НСтр("ru = 'Перед добавлением корректировочного счета-фактуры создайте исходный счет-фактуру для документа-основания.'");
КонецЕсли;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ДокументыОснованияПредставление", , Отказ);
КонецЕсли;
Если ЕстьКорректировки И Не Корректировочный И Не ВводОстатков Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Счет-фактура должен быть корректировочным, т.к. среди документов-оснований есть корректировка приобретения с операцией ""%1""'"),
ХозОперации.КорректировкаПоСогласованиюСторон);
ПутьКЭлементу = "Корректировочный";
ИначеЕсли ЕстьИсправления И Не Исправление И Не СводныйКорректировочныйПризнак И Не ВводОстатков Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Счет-фактура должен быть исправительным, т.к. среди документов-оснований есть корректировка приобретения с операцией ""%1""'"),
ХозОперации.ИсправлениеОшибок);
ПутьКЭлементу = "Исправление";
КонецЕсли;
Если Не ПустаяСтрока(ТекстОшибки) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ПутьКЭлементу,
,
Отказ);
КонецЕсли;
#КонецОбласти
Если НЕ Исправление Или ВводОстатков Тогда
МассивНепроверяемыхРеквизитов.Добавить("НомерИсправления");
МассивНепроверяемыхРеквизитов.Добавить("ДатаИсправления");
КонецЕсли;
Если НЕ СоставленКомиссионеромОтИмениПродавца Тогда
МассивНепроверяемыхРеквизитов.Добавить("Продавцы");
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
Если Не Отказ И ОбщегоНазначенияУТ.ПроверитьЗаполнениеРеквизитовОбъекта(ЭтотОбъект, ПроверяемыеРеквизиты) Тогда
Отказ = Истина;
КонецЕсли;
ПроверитьЗаполнениеДокументовОснований(Отказ);
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
Если ДокументыОснования.Количество() > 0
И ТипЗнч(ДокументыОснования[0].ДокументОснование) = Тип("ДокументСсылка.ПервичныйДокумент")
И ДокументыОснования[0].ДокументОснование.ТипПервичногоДокумента = Перечисления.ТипыПервичныхДокументов.ПриобретениеУПоставщика Тогда
ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения", Истина);
КонецЕсли;
Если НЕ Исправление Тогда
НомерИсправления = "";
ДатаИсправления = '00010101';
КонецЕсли;
СводныйКомиссионный = СоставленКомиссионеромОтИмениПродавца И (Продавцы.Количество() > 1);
ЗаполнитьПризнакСводныйКорректировочный();
ЗаполнитьХозяйственнуюОперациюДокументовОснований();
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроверитьДублиСчетФактуры(Отказ);
ПроверитьИсправлениеСчетФактуры(Отказ);
КонецЕсли;
Если Не Отказ
И (РежимЗаписи = РежимЗаписиДокумента.Проведение
Или (РежимЗаписи = РежимЗаписиДокумента.Запись И Проведен))
И Не РучнаяКорректировкаСуммДокумента Тогда
РезультатЗаполнения = ПолучитьСуммыДокументовОснований();
ЗаполнитьСуммыДокументовОснований(РезультатЗаполнения);
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаЗаписиКнигиПокупок) Тогда
НачалоНалоговогоПериода = УчетНДСПереопределяемый.БлижайшийНалоговыйПериод(Организация, Дата).Период;
Если НачалоКвартала(Дата) = НачалоНалоговогоПериода Тогда
ДатаЗаписиКнигиПокупок = Дата;
Иначе
ДатаЗаписиКнигиПокупок = НачалоНалоговогоПериода;
КонецЕсли;
КонецЕсли;
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
РучнаяКорректировкаЖурналаСФ = Ложь;
КонецЕсли;
Если Исправление Тогда
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(ЭтотОбъект, "ДокументыОснования");
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаУдаленияПроведения(Отказ)
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("Исправление") И ДанныеЗаполнения.Исправление Тогда
Если ДанныеЗаполнения.Свойство("СчетФактураОснование") Тогда
ЗаполнитьИсправлениеПоСчетуФактуре(ДанныеЗаполнения);
ИначеЕсли ДанныеЗаполнения.Свойство("ДокументОснование") Тогда
ЗаполнитьИсправлениеПоОснованию(ДанныеЗаполнения);
КонецЕсли;
ИначеЕсли ДанныеЗаполнения.Свойство("ДокументОснование")
Или ДанныеЗаполнения.Свойство("ДокументыОснования") Тогда
ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения);
КонецЕсли;
КонецЕсли;
ИнициализироватьДокумент(ДанныеЗаполнения);
КонецПроцедуры
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Если Исправление Тогда
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ВЫБОР
| КОГДА СчетФактураПолученный.Исправление
| ТОГДА СчетФактураПолученный.СчетФактураОснование
| ИНАЧЕ СчетФактураПолученный.Ссылка
| КОНЕЦ КАК Ссылка,
| СчетФактураПолученный.Номер КАК Номер
|ПОМЕСТИТЬ ИсходныеДокументы
|ИЗ Документ.СчетФактураПолученный КАК СчетФактураПолученный
|ГДЕ
| СчетФактураПолученный.Ссылка = &СчетФактураОснование
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| ИсходныеДокументы.Номер КАК Номер,
| ЕСТЬNULL(Исправления.НомерИсправления, 0) КАК НомерИсправления
|ИЗ
| ИсходныеДокументы КАК ИсходныеДокументы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный КАК Исправления
| ПО ИсходныеДокументы.Ссылка = Исправления.СчетФактураОснование
| И ИсходныеДокументы.Ссылка <> Исправления.Ссылка
| И Исправления.Исправление
| И Исправления.Корректировочный = &Корректировочный
| И НЕ Исправления.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| НомерИсправления УБЫВ");
Запрос.УстановитьПараметр("СчетФактураОснование", СчетФактураОснование);
Запрос.УстановитьПараметр("Корректировочный", Корректировочный);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтандартнаяОбработка = Ложь;
Префикс = "И";
ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации(ЭтотОбъект, СтандартнаяОбработка, Префикс);
НомерБезПрефикса = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(Выборка.Номер, Истина, Истина);
Если СтрДлина(СокрП(НомерБезПрефикса)) = 7 Тогда
НомерБезПрефикса = Прав(НомерБезПрефикса, СтрДлина(НомерБезПрефикса)-1);
КонецЕсли;
Номер = Префикс + НомерБезПрефикса;
НомерИсправления = Формат(Число(Выборка.НомерИсправления)+1, "ЧЦ=10; ЧДЦ=0; ЧГ=0");
КонецЕсли;
Иначе
Префикс = "0";
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
Если НЕ Отказ Тогда
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(Ссылка);
УчетНДСУП.СформироватьЗаданияПоДокументам(МассивДокументов);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ИнициализацияИЗаполнение
Процедура ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения)
Если ДанныеЗаполнения.Свойство("ДокументыОснования") Тогда
МассивДокументовОснований = ДанныеЗаполнения.ДокументыОснования;
ДанныеЗаполнения.Вставить("ДокументОснование", МассивДокументовОснований[0]);
ИначеЕсли ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив") Тогда
МассивДокументовОснований = ДанныеЗаполнения.ДокументОснование;
ДанныеЗаполнения.Вставить("ДокументОснование", МассивДокументовОснований[0]);
Иначе
МассивДокументовОснований = Новый Массив;
МассивДокументовОснований.Добавить(ДанныеЗаполнения.ДокументОснование);
КонецЕсли;
Для Каждого ОснованиеЗаполнения Из МассивДокументовОснований Цикл
СтрокаОснования = ДокументыОснования.Добавить();
СтрокаОснования.ДокументОснование = ОснованиеЗаполнения;
КонецЦикла;
ДанныеЗаполнения.Свойство("Корректировочный", Корректировочный);
ПараметрыСчетаФактуры = ПолучитьПараметрыСчетаФактурыПоОснованиям(МассивДокументовОснований);
Если Не ПараметрыСчетаФактуры.Организация = Неопределено Тогда
ДанныеЗаполнения.Вставить("Организация", ПараметрыСчетаФактуры.Организация);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Подразделение = Неопределено Тогда
ДанныеЗаполнения.Вставить("Подразделение", ПараметрыСчетаФактуры.Подразделение);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Контрагент = Неопределено Тогда
ДанныеЗаполнения.Вставить("Контрагент", ПараметрыСчетаФактуры.Контрагент);
ДанныеЗаполнения.Вставить("КППКонтрагента", ПараметрыСчетаФактуры.КППКонтрагента);
ДанныеЗаполнения.Вставить("ИННКонтрагента", ПараметрыСчетаФактуры.ИННКонтрагента);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Склад = Неопределено Тогда
ДанныеЗаполнения.Вставить("Склад", ПараметрыСчетаФактуры.Склад);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Партнер = Неопределено Тогда
ДанныеЗаполнения.Вставить("Партнер", ПараметрыСчетаФактуры.Партнер);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Договор = Неопределено Тогда
ДанныеЗаполнения.Вставить("Договор", ПараметрыСчетаФактуры.Договор);
КонецЕсли;
Если Не ПараметрыСчетаФактуры.НаправлениеДеятельности = Неопределено Тогда
ДанныеЗаполнения.Вставить("НаправлениеДеятельности", ПараметрыСчетаФактуры.НаправлениеДеятельности);
КонецЕсли;
Если НЕ ПараметрыСчетаФактуры.Корректировочный = Неопределено Тогда
Корректировочный = ПараметрыСчетаФактуры.Корректировочный ИЛИ Корректировочный;
ДанныеЗаполнения.Вставить("Корректировочный", Корректировочный);
ДанныеЗаполнения.Вставить("Исправление", ПараметрыСчетаФактуры.Исправление);
КонецЕсли;
Если НЕ ПараметрыСчетаФактуры.СчетФактураОснование = Неопределено И ДанныеЗаполнения.Исправление Тогда
ДанныеЗаполнения.Вставить("СчетФактураОснование", ПараметрыСчетаФактуры.СчетФактураОснование);
КонецЕсли;
Если НЕ ДанныеЗаполнения.Свойство("КодВидаОперации") Тогда
ЗаполнитьКодВидаОперации();
КонецЕсли;
РеквизитыОснования = ПараметрыСчетаФактуры.РеквизитыОснований;
Если Корректировочный И РеквизитыОснования.Количество() > 0 Тогда
ДокументыОснования.Загрузить(РеквизитыОснования);
ДатаЗаписиКнигиПродаж = ТекущаяДатаСеанса();
КонецЕсли;
Для Каждого СтрокаОснования Из ДокументыОснования Цикл
СтрокаОснования.ХозяйственнаяОперация =
ПараметрыСчетаФактуры.ХозяйственныеОперацииДокументовОснований[СтрокаОснования.ДокументОснование];
Если Не ЗначениеЗаполнено(СтрокаОснования.ХозяйственнаяОперация)Тогда
СтрокаОснования.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
КонецЕсли;
КонецЦикла;
Если ДанныеЗаполнения.Свойство("НомерСФ") Тогда
Номер = ДанныеЗаполнения.НомерСФ;
КонецЕсли;
Если ДанныеЗаполнения.Свойство("ДатаСоставления") Тогда
Дата = ТекущаяДатаСеанса();
ДатаСоставления = ДанныеЗаполнения.ДатаСоставления;
КонецЕсли;
Если ДанныеЗаполнения.Свойство("Дата") Тогда
Дата = ДанныеЗаполнения.Дата;
КонецЕсли;
Если Не ДанныеЗаполнения.Свойство("Валюта") И ДанныеЗаполнения.Свойство("Организация") Тогда
ДанныеЗаполнения.Вставить("Валюта", ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(ДанныеЗаполнения.Организация));
КонецЕсли;
СуммыДокумента = ПолучитьСуммыДокументовОснований(ДанныеЗаполнения);
ЗаполнитьСуммыДокументовОснований(СуммыДокумента);
КонецПроцедуры
Процедура ЗаполнитьИсправлениеПоОснованию(ДанныеЗаполнения)
Если ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив") Тогда
МассивОснований = ДанныеЗаполнения.ДокументОснование;
Для Каждого ОснованиеЗаполнения Из МассивОснований Цикл
СтрокаОснования = ДокументыОснования.Добавить();
СтрокаОснования.ДокументОснование = ОснованиеЗаполнения;
КонецЦикла;
ДанныеЗаполнения.ДокументОснование = МассивОснований[0];
Иначе
СтрокаОснования = ДокументыОснования.Добавить();
СтрокаОснования.ДокументОснование = ДанныеЗаполнения.ДокументОснование;
КонецЕсли;
Основание = ДанныеЗаполнения.ДокументОснование;
РеквизитыСчетаФактуры = ИсправляемыйСчетФактураПоОснованию(
ЭтотОбъект.Ссылка,
Основание,
?(ДанныеЗаполнения.Свойство("Организация"), ДанныеЗаполнения.Организация, Неопределено));
Если ЗначениеЗаполнено(РеквизитыСчетаФактуры.Ссылка) Тогда
Для Каждого РеквизитСФ Из РеквизитыСчетаФактуры Цикл
ИмяРеквизита = РеквизитСФ.Ключ;
ЗначениеРеквизита = РеквизитСФ.Значение;
Если ИмяРеквизита = "ДокументыОснования" Тогда
ДокументыОснования.Загрузить(ЗначениеРеквизита);
ИначеЕсли ИмяРеквизита = "Ссылка" Тогда
ДанныеЗаполнения.Вставить("СчетФактураОснование", ЗначениеРеквизита);
ИначеЕсли ЗначениеЗаполнено(ЗначениеРеквизита) Тогда
ДанныеЗаполнения.Вставить(ИмяРеквизита, ЗначениеРеквизита);
КонецЕсли;
КонецЦикла;
Иначе
ТекстСообщения = НСтр("ru = 'Не обнаружен исходный счет-фактура к исправлению.
|Введите счет-фактуру к исходному документу покупки, а уже затем введите исправительный счет-фактуру.'");
ВызватьИсключение ТекстСообщения;
КонецЕсли;
СуммыДокумента = ПолучитьСуммыДокументовОснований(ДанныеЗаполнения);
ЗаполнитьСуммыДокументовОснований(СуммыДокумента);
КонецПроцедуры
Процедура ЗаполнитьИсправлениеПоСчетуФактуре(ДанныеЗаполнения = Неопределено) Экспорт
Если ДанныеЗаполнения <> Неопределено Тогда
Основание = ДанныеЗаполнения.СчетФактураОснование;
Иначе
Основание = СчетФактураОснование;
Исправление = Истина;
КонецЕсли;
РеквизитыСчетаФактуры = Документы.СчетФактураПолученный.ДанныеСчетаФактуры(Основание);
Для Каждого РеквизитСФ Из РеквизитыСчетаФактуры Цикл
ИмяРеквизита = РеквизитСФ.Ключ;
ЗначениеРеквизита = РеквизитСФ.Значение;
Если ИмяРеквизита = "ДокументыОснования" Тогда
ДокументыОснования.Загрузить(РеквизитСФ.Значение);
ИначеЕсли ИмяРеквизита = "Дата" Тогда
Продолжить;
ИначеЕсли ЗначениеЗаполнено(ЗначениеРеквизита) Тогда
Если ДанныеЗаполнения <> Неопределено Тогда
ДанныеЗаполнения.Вставить(ИмяРеквизита, ЗначениеРеквизита);
Иначе
ЭтотОбъект[ИмяРеквизита] = ЗначениеРеквизита;
КонецЕсли;
КонецЕсли;
КонецЦикла;
СуммыДокумента = ПолучитьСуммыДокументовОснований(ДанныеЗаполнения);
ЗаполнитьСуммыДокументовОснований(СуммыДокумента);
КонецПроцедуры
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или Не ДанныеЗаполнения.Свойство("Организация") Тогда
Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Организация") Тогда
Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(ДанныеЗаполнения.Организация);
Иначе
Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или Не ДанныеЗаполнения.Свойство("Ответственный") Тогда
Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или Не ДанныеЗаполнения.Свойство("Подразделение") Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Ответственный, Подразделение);
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или Не ДанныеЗаполнения.Свойство("ДатаСоставления")Тогда
ДатаСоставления = ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
Функция ПолучитьПараметрыСчетаФактурыПоОснованиям(МассивДокументовОснований)
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Структура("Организация, Контрагент, КППКонтрагента, ИННКонтрагента,
|Партнер, Договор, Валюта, НаправлениеДеятельности, Склад, Подразделение,
|СчетФактураОснование, РеквизитыОснований, Ответственный");
Результат.Вставить("ХозяйственныеОперацииДокументовОснований", Новый Соответствие);
Результат.Вставить("Корректировочный", Корректировочный);
Результат.Вставить("Исправление", Исправление);
РеквизитыОснований = Новый ТаблицаЗначений;
Колонки = РеквизитыОснований.Колонки;
Колонки.Добавить("ДокументОснование");
Колонки.Добавить("ИсходныйДокумент");
Результат.РеквизитыОснований = РеквизитыОснований;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДокументыОснования", МассивДокументовОснований);
Запрос.УстановитьПараметр("ДанныеОснований", ПолучитьДанныеОснований(ДокументыОснования.ВыгрузитьКолонку("ДокументОснование")));
Запрос.УстановитьПараметр("СчетФактура", Ссылка);
ТекстЗапросаОснований =
"ВЫБРАТЬ
| ДанныеОснований.Регистратор КАК Регистратор,
| ДанныеОснований.Организация КАК Организация,
| ДанныеОснований.Контрагент КАК Контрагент,
| ВЫРАЗИТЬ(ДанныеОснований.Грузоотправитель КАК Справочник.Контрагенты) КАК Грузоотправитель,
| ДанныеОснований.Подразделение КАК Подразделение,
| ДанныеОснований.Валюта КАК Валюта
|ПОМЕСТИТЬ ДанныеОснований
|ИЗ
| &ДанныеОснований КАК ДанныеОснований
|;
|
|
|ВЫБРАТЬ
| ДанныеОснований.Регистратор КАК Ссылка,
| ДанныеОснований.Организация,
| ДанныеОснований.Контрагент,
| ВЫБОР
| КОГДА ДанныеОснований.Грузоотправитель <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
| И ДанныеОснований.Грузоотправитель <> ДанныеОснований.Контрагент
| И ДанныеОснований.Грузоотправитель.ОбособленноеПодразделение
| И ДанныеОснований.Грузоотправитель.ГоловнойКонтрагент = ДанныеОснований.Контрагент
| ТОГДА ДанныеОснований.Грузоотправитель.КПП
| КОГДА ДанныеОснований.Контрагент ССЫЛКА Справочник.Контрагенты
| ТОГДА ВЫРАЗИТЬ(ДанныеОснований.Контрагент КАК Справочник.Контрагенты).КПП
| ИНАЧЕ ВЫРАЗИТЬ(ДанныеОснований.Контрагент КАК Справочник.Организации).КПП
| КОНЕЦ КАК КППКонтрагента,
| ВЫБОР
| КОГДА ДанныеОснований.Грузоотправитель <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
| И ДанныеОснований.Грузоотправитель <> ДанныеОснований.Контрагент
| И ДанныеОснований.Грузоотправитель.ОбособленноеПодразделение
| И ДанныеОснований.Грузоотправитель.ГоловнойКонтрагент = ДанныеОснований.Контрагент
| ТОГДА ДанныеОснований.Грузоотправитель.ИНН
| КОГДА ДанныеОснований.Контрагент ССЫЛКА Справочник.Контрагенты
| ТОГДА ВЫРАЗИТЬ(ДанныеОснований.Контрагент КАК Справочник.Контрагенты).ИНН
| ИНАЧЕ ВЫРАЗИТЬ(ДанныеОснований.Контрагент КАК Справочник.Организации).ИНН
| КОНЕЦ КАК ИННКонтрагента,
| ДанныеОснований.Подразделение,
| ВЫБОР ТИПЗНАЧЕНИЯ(ДанныеОснований.Регистратор)
| КОГДА ТИП(Документ.ВводОстатков)
| ТОГДА ВводОстатков.Склад
| ИНАЧЕ ВЫРАЗИТЬ(ДанныеРеестра.МестоХранения.Ключ КАК Справочник.Склады)
| КОНЕЦ КАК Склад,
| ВЫБОР ТИПЗНАЧЕНИЯ(ДанныеОснований.Регистратор)
| КОГДА ТИП(Документ.ВводОстатков)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика)
| КОГДА ТИП(Документ.ПервичныйДокумент)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика)
| КОГДА ТИП(Документ.ВыкупВозвратнойТарыУПоставщика)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика)
| КОГДА ТИП(Документ.КорректировкаРеализации)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВозвратНедопоставленногоТовара)
| КОГДА ТИП(Документ.ОтчетКомиссионера)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ОтчетКомиссионера)
| КОГДА ТИП(Документ.ПередачаТоваровМеждуОрганизациями)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУДругойОрганизации)
| КОГДА ТИП(Документ.ОтчетПоКомиссииМеждуОрганизациями)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ОтчетПоКомиссииМеждуОрганизациями)
| КОГДА ТИП(Документ.ПоступлениеУслугПоАренде)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.НачислениеПоДоговоруАренды)
| ИНАЧЕ ЕСТЬNULL(ДанныеРеестра.ХозяйственнаяОперация,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика))
| КОНЕЦ КАК ХозяйственнаяОперация,
| ВЫБОР ТИПЗНАЧЕНИЯ(ДанныеОснований.Регистратор)
| КОГДА ТИП(Документ.ВводОстатков)
| ТОГДА ВводОстатков.НаправлениеДеятельности
| КОГДА ТИП(Документ.ПервичныйДокумент)
| ТОГДА ПервичныйДокумент.НаправлениеДеятельности
| ИНАЧЕ ЕСТЬNULL(ДанныеРеестра.НаправлениеДеятельности, НЕОПРЕДЕЛЕНО)
| КОНЕЦ КАК НаправлениеДеятельности,
| ВЫБОР ТИПЗНАЧЕНИЯ(ДанныеОснований.Регистратор)
| КОГДА ТИП(Документ.ВводОстатков)
| ТОГДА ВводОстатков.Партнер
| КОГДА ТИП(Документ.ПервичныйДокумент)
| ТОГДА ПервичныйДокумент.Партнер
| ИНАЧЕ ЕСТЬNULL(ДанныеРеестра.Партнер, НЕОПРЕДЕЛЕНО)
| КОНЕЦ КАК Партнер,
| ВЫБОР ТИПЗНАЧЕНИЯ(ДанныеОснований.Регистратор)
| КОГДА ТИП(Документ.ПервичныйДокумент)
| ТОГДА ПервичныйДокумент.Договор
| ИНАЧЕ ЕСТЬNULL(ДанныеРеестра.Договор, НЕОПРЕДЕЛЕНО)
| КОНЕЦ КАК Договор,
| ДанныеОснований.Валюта
|ИЗ
| ДанныеОснований КАК ДанныеОснований
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК ДанныеРеестра
| ПО ДанныеОснований.Регистратор = ДанныеРеестра.Ссылка
| И НЕ ДанныеРеестра.ДополнительнаяЗапись
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВводОстатков КАК ВводОстатков
| ПО ДанныеОснований.Регистратор = ВводОстатков.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПервичныйДокумент КАК ПервичныйДокумент
| ПО ДанныеОснований.Регистратор = ПервичныйДокумент.Ссылка";
ТекстЗапросаИсходныхДанных =
"ВЫБРАТЬ
| ТекущийДокумент.Ссылка КАК Ссылка,
| ТекущийДокумент.ДокументОснование КАК ДокументОснование,
| ТекущийДокумент.ВидКорректировки КАК ХозяйственнаяОперация
|ПОМЕСТИТЬ ВТ_ДокументыОснования
|ИЗ
| Документ.КорректировкаПриобретения КАК ТекущийДокумент
|ГДЕ
| ТекущийДокумент.Ссылка В (&ДокументыОснования)
| И ТекущийДокумент.ВидКорректировки В (
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.КорректировкаПоСогласованиюСторон),
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ИсправлениеОшибок))
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТекущийДокумент.Ссылка КАК Ссылка,
| ТекущийДокумент.ДокументПоступления КАК ДокументОснование,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.КорректировкаПоСогласованиюСторон)
|ИЗ
| Документ.ВозвратТоваровПоставщику.ВидыЗапасов КАК ТекущийДокумент
|ГДЕ
| ТекущийДокумент.Ссылка В (&ДокументыОснования)
|;
|
|
|ВЫБРАТЬ
| ТекущийДокумент.Ссылка КАК Ссылка,
| ИсходныйСчетФактура.Ссылка КАК СчетФактура,
| ТекущийДокумент.ХозяйственнаяОперация КАК ХозяйственнаяОперация
|ПОМЕСТИТЬ ВТ_ИсходныеСчетаФактуры
|ИЗ
| ВТ_ДокументыОснования КАК ТекущийДокумент
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК ИсходныйСФОснования
| ПО ТекущийДокумент.ДокументОснование = ИсходныйСФОснования.ДокументОснование
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный КАК ИсходныйСчетФактура
| ПО ИсходныйСФОснования.Ссылка = ИсходныйСчетФактура.Ссылка
| И ИсходныйСчетФактура.Проведен
| И НЕ ИсходныйСчетФактура.Исправление
|;
|
|
|ВЫБРАТЬ
| ИсходныеСчетаФактуры.Ссылка КАК Ссылка,
| Основания.ДокументОснование КАК ДокументОснование,
| ИсходныеСчетаФактуры.СчетФактура КАК СчетФактура,
| ИсходныеСчетаФактуры.ХозяйственнаяОперация КАК ХозяйственнаяОперация
|ПОМЕСТИТЬ ВТ_ОснованияИсходных
|ИЗ
| ВТ_ИсходныеСчетаФактуры КАК ИсходныеСчетаФактуры
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК Основания
| ПО ИсходныеСчетаФактуры.СчетФактура = Основания.Ссылка
|;
|
|ВЫБРАТЬ
| ОснованияИсходных.Ссылка КАК Ссылка,
| КорректировкаПриобретения.Ссылка КАК ДокументОснование,
| ОснованияИсходных.СчетФактура КАК СчетФактура,
| ОснованияИсходных.ХозяйственнаяОперация КАК ХозяйственнаяОперация
|ПОМЕСТИТЬ ВТ_ОснованияИсходныхИКорректировки
|ИЗ
| ВТ_ОснованияИсходных КАК ОснованияИсходных
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.КорректировкаПриобретения КАК КорректировкаПриобретения
| ПО ОснованияИсходных.ДокументОснование = КорректировкаПриобретения.ДокументОснование
| И (КорректировкаПриобретения.Проведен)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОснованияИсходных.Ссылка КАК Ссылка,
| ВозвратТоваровПоставщику.Ссылка КАК ДокументОснование,
| ОснованияИсходных.СчетФактура КАК СчетФактура,
| ОснованияИсходных.ХозяйственнаяОперация КАК ХозяйственнаяОперация
|ИЗ
| ВТ_ОснованияИсходных КАК ОснованияИсходных
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровПоставщику.ВидыЗапасов КАК ВозвратТоваровПоставщику
| ПО ОснованияИсходных.ДокументОснование = ВозвратТоваровПоставщику.ДокументПоступления
| И (ВозвратТоваровПоставщику.Ссылка.Проведен)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОснованияИсходных.Ссылка,
| ОснованияИсходных.ДокументОснование,
| ОснованияИсходных.СчетФактура,
| ОснованияИсходных.ХозяйственнаяОперация
|ИЗ
| ВТ_ОснованияИсходных КАК ОснованияИсходных
|;
|
|
|ВЫБРАТЬ
| ОснованияИсходных.Ссылка КАК ДокументОснование,
| ОснованияИсходных.СчетФактура КАК ИсходныйСчетФактура,
| ВЫБОР
| КОГДА ИсходныеДокументы.Исправление
| ТОГДА ИсходныеДокументы.СчетФактураОснование
| ИНАЧЕ ИсходныеДокументы.Ссылка
| КОНЕЦ КАК ИсходныйДокумент,
| СчетФактураОснования.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
|
| ВЫБОР КОГДА ОснованияИсходных.ХозяйственнаяОперация =
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.КорректировкаПоСогласованиюСторон)
| ИЛИ ИсходныеДокументы.Корректировочный ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК Корректировочный,
|
| ВЫБОР КОГДА ОснованияИсходных.ХозяйственнаяОперация =
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ИсправлениеОшибок) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК Исправление
|
|ИЗ
| ВТ_ОснованияИсходныхИКорректировки КАК ОснованияИсходных
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураОснования
| ПО ОснованияИсходных.ДокументОснование = СчетФактураОснования.ДокументОснование
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный КАК ИсходныеДокументы
| ПО СчетФактураОснования.Ссылка = ИсходныеДокументы.Ссылка
| И (НЕ ИсходныеДокументы.Ссылка = &СчетФактура)
| И (НЕ ИсходныеДокументы.ПометкаУдаления)
|
|УПОРЯДОЧИТЬ ПО
| ИсходныеДокументы.Корректировочный УБЫВ,
| ВЫБОР КОГДА ИсходныеДокументы.Корректировочный И ИсходныеДокументы.Исправление ТОГДА
| ЕСТЬNULL(ИсходныеДокументы.СчетФактураОснование.Дата, Неопределено)
| КОГДА ИсходныеДокументы.Корректировочный ТОГДА
| ИсходныеДокументы.Дата
| ИНАЧЕ
| 0
| КОНЕЦ УБЫВ,
| НомерИсправления УБЫВ
|
|ИТОГИ
| МАКСИМУМ(Корректировочный),
| МАКСИМУМ(Исправление)
|ПО
| ОБЩИЕ,
| ИсходныйСчетФактура";
Запрос.Текст = ТекстЗапросаОснований + ОбщегоНазначения.РазделительПакетаЗапросов() + ТекстЗапросаИсходныхДанных;
РезультатЗапроса = Запрос.ВыполнитьПакет();
ВыборкаОснований = РезультатЗапроса[1].Выбрать();
КоличествоЗапросов = РезультатЗапроса.Количество();
ВыборкаИсходныхДанных = РезультатЗапроса[КоличествоЗапросов-1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
УстановитьПривилегированныйРежим(Ложь);
ПерваяСтрока = Истина;
РазныеОрганизации = Ложь;
РазныеКонтрагенты = Ложь;
РазныеПартнеры = Ложь;
РазныеДоговоры = Ложь;
РазныеСклады = Ложь;
РазныеВалюты = Ложь;
РазныеПодразделения = Ложь;
РазныеНаправленияДеятельности = Ложь;
Пока ВыборкаОснований.Следующий() Цикл
Результат.ХозяйственныеОперацииДокументовОснований.Вставить(
ВыборкаОснований.Ссылка, ВыборкаОснований.ХозяйственнаяОперация);
Если ПерваяСтрока Тогда
ПерваяСтрока = Ложь;
ЗаполнитьЗначенияСвойств(Результат, ВыборкаОснований);
Продолжить;
КонецЕсли;
РазныеОрганизации = РазныеОрганизации Или Результат.Организация <> ВыборкаОснований.Организация;
РазныеКонтрагенты = РазныеКонтрагенты Или Результат.Контрагент <> ВыборкаОснований.Контрагент;
РазныеПартнеры = РазныеПартнеры Или Результат.Партнер <> ВыборкаОснований.Партнер;
РазныеДоговоры = РазныеДоговоры Или Результат.Договор <> ВыборкаОснований.Договор;
РазныеСклады = РазныеСклады Или Результат.Склад <> ВыборкаОснований.Склад;
РазныеВалюты = РазныеВалюты Или Результат.Валюта <> ВыборкаОснований.Валюта;
РазныеПодразделения = РазныеПодразделения Или Результат.Подразделение <> ВыборкаОснований.Подразделение;
РазныеНаправленияДеятельности = РазныеНаправленияДеятельности
Или Результат.НаправлениеДеятельности <> ВыборкаОснований.НаправлениеДеятельности;
КонецЦикла;
Если РазныеОрганизации ИЛИ РазныеКонтрагенты ИЛИ РазныеВалюты Тогда
ТекстСообщения = НСтр("ru = 'Реквизиты документов, на основании которых зарегистрирован счет-фактура, не совпадают:'")
+ ?(РазныеОрганизации, Символы.ПС + НСтр("ru = '- организация'"), "")
+ ?(РазныеКонтрагенты, Символы.ПС + НСтр("ru = '- контрагент'"), "")
+ ?(РазныеВалюты, Символы.ПС + НСтр("ru = '- валюта документа'"), "") + Символы.ПС
+ НСтр("ru = 'Необходимо изменить реквизиты документов-оснований или зарегистрировать по документам с расхождениями отдельные счета-фактуры.'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
Если РазныеОрганизации Тогда
Результат.Организация = Неопределено;
КонецЕсли;
Если РазныеКонтрагенты Тогда
Результат.Контрагент = Неопределено;
КонецЕсли;
Если РазныеВалюты Тогда
Результат.Валюта = Неопределено;
КонецЕсли;
КонецЕсли;
Результат.Ответственный = Пользователи.ТекущийПользователь();
Если РазныеПартнеры Тогда
Результат.Партнер = Неопределено;
КонецЕсли;
Если РазныеДоговоры Тогда
Результат.Договор = Неопределено;
КонецЕсли;
Если РазныеСклады Тогда
Результат.Склад = Неопределено;
КонецЕсли;
Если РазныеПодразделения Тогда
Результат.Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Результат.Ответственный, Результат.Подразделение);
КонецЕсли;
Если РазныеНаправленияДеятельности Тогда
Результат.НаправлениеДеятельности = Неопределено;
КонецЕсли;
Если ВыборкаИсходныхДанных <> Неопределено Тогда
Если ВыборкаИсходныхДанных.Следующий() Тогда
Результат.Исправление = ВыборкаИсходныхДанных.Исправление;
Результат.Корректировочный = ВыборкаИсходныхДанных.Корректировочный;
ИначеЕсли Корректировочный И НЕ ОбменДанными.Загрузка И Проведен Тогда
ТекстСообщения = НСтр("ru = 'Не обнаружен исходный счет-фактура к корректировке.
|Введите счет-фактуру к исходному документу приобретения, а уже затем введите корректировочный счет-фактуру.'");
ВызватьИсключение ТекстСообщения;
КонецЕсли;
ВыборкаПоИсходнымСчетамФактуры = ВыборкаИсходныхДанных.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
РеквизитыСчетаФактурыОснования = Неопределено;
Если Результат.Исправление Тогда
ПерваяСтрока = Истина;
РазныеСчетФактураОснование = Ложь;
Пока ВыборкаПоИсходнымСчетамФактуры.Следующий() Цикл
ВыборкаПоДокументам = ВыборкаПоИсходнымСчетамФактуры.Выбрать();
Если ВыборкаПоДокументам.Следующий() Тогда
Результат.ХозяйственныеОперацииДокументовОснований.Вставить(
ВыборкаПоДокументам.ДокументОснование, ВыборкаПоДокументам.ХозяйственнаяОперация);
Если ПерваяСтрока Тогда
ПерваяСтрока = Ложь;
Результат.СчетФактураОснование = ВыборкаПоДокументам.ИсходныйДокумент;
Иначе
РазныеСчетФактураОснование = РазныеСчетФактураОснование
Или Результат.СчетФактураОснование <> ВыборкаПоДокументам.ИсходныйДокумент;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если РазныеСчетФактураОснование Тогда
Результат.Исправление = Ложь;
Результат.Корректировочный = Истина;
Иначе
РеквизитыСчетаФактурыОснования = ДанныеСчетаФактуры(Результат.СчетФактураОснование);
Если Результат.Корректировочный И Не РеквизитыСчетаФактурыОснования.Корректировочный Тогда
Результат.Исправление = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Результат.Корректировочный ИЛИ Корректировочный Тогда
Если Результат.Исправление Тогда
МассивКорректировок = Запрос.Параметры.ДокументыОснования;
ИсходныеДанныеСчетаФактуры = РеквизитыСчетаФактурыОснования.ДокументыОснования;
Для Каждого ОснованиеКорректировка Из МассивКорректировок Цикл
Для Каждого СтрокаТаблицы Из ИсходныеДанныеСчетаФактуры Цикл
СтрокаСРеквизитами = РеквизитыОснований.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСРеквизитами, СтрокаТаблицы);
СтрокаСРеквизитами.ДокументОснование = ОснованиеКорректировка;
КонецЦикла;
КонецЦикла;
Иначе
ВыборкаПоИсходнымСчетамФактуры.Сбросить();
Пока ВыборкаПоИсходнымСчетамФактуры.Следующий() Цикл
ВыборкаПоДокументам = ВыборкаПоИсходнымСчетамФактуры.Выбрать();
Пока ВыборкаПоДокументам.Следующий() Цикл
Если Результат.ХозяйственныеОперацииДокументовОснований.Получить(ВыборкаПоДокументам.ДокументОснование) = Неопределено Тогда
Результат.ХозяйственныеОперацииДокументовОснований.Вставить(
ВыборкаПоДокументам.ДокументОснование, ВыборкаПоДокументам.ХозяйственнаяОперация);
КонецЕсли;
Если ТипЗнч(ВыборкаПоДокументам.ДокументОснование) = Тип("ДокументСсылка.ВозвратТоваровПоставщику")
И (РеквизитыОснований.Найти(ВыборкаПоДокументам.ИсходныйСчетФактура) = Неопределено
ИЛИ РеквизитыОснований.Найти(ВыборкаПоДокументам.ДокументОснование) = Неопределено)
ИЛИ ТипЗнч(ВыборкаПоДокументам.ДокументОснование) = Тип("ДокументСсылка.КорректировкаПриобретения")
И РеквизитыОснований.Найти(ВыборкаПоДокументам.ДокументОснование) = Неопределено Тогда
СтрокаСРеквизитами = РеквизитыОснований.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСРеквизитами, ВыборкаПоДокументам);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьДанныеОснований(МассивДокументовОснований)
ДанныеОснований = Новый ТаблицаЗначений;
ДанныеОснований.Колонки.Добавить("Регистратор", Документы.ТипВсеСсылки());
ДанныеОснований.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
ДанныеОснований.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Организации, СправочникСсылка.Контрагенты"));
ДанныеОснований.Колонки.Добавить("Грузоотправитель", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
ДанныеОснований.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.СтруктураПредприятия"));
ДанныеОснований.Колонки.Добавить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Для Каждого Основание Из МассивДокументовОснований Цикл
Если Не ЗначениеЗаполнено(Основание) Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
ХозяйственнаяОперацияОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Основание, "ХозяйственнаяОперация");
Если ХозяйственнаяОперацияОснования = Перечисления.ХозяйственныеОперации.ЗакупкаПоИмпорту Или
ХозяйственнаяОперацияОснования = Перечисления.ХозяйственныеОперации.ПриемНаКомиссию Тогда
УстановитьПривилегированныйРежим(Истина);
ТаблицыДляДвижений = ПроведениеДокументов.ДанныеДокументаДляПроведения(Основание,);
УстановитьПривилегированныйРежим(Ложь);
Иначе
УстановитьПривилегированныйРежим(Истина);
ТаблицыДляДвижений = ПроведениеДокументов.ДанныеДокументаДляПроведения(Основание, "ЗаполнениеШапкиСФПолученный");
УстановитьПривилегированныйРежим(Ложь);
ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТаблицыДляДвижений.ТаблицаЗаполнениеШапкиСФПолученный, ДанныеОснований);
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Основание) Тогда
УстановитьПривилегированныйРежим(Истина);
ТаблицыДляДвижений = ПроведениеДокументов.ДанныеДокументаДляПроведения(Основание, "ЗаполнениеШапкиСФПолученный");
УстановитьПривилегированныйРежим(Ложь);
ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТаблицыДляДвижений.ТаблицаЗаполнениеШапкиСФПолученный, ДанныеОснований);
КонецЕсли;
КонецЦикла;
Возврат ДанныеОснований;
КонецФункции
Процедура ЗаполнитьПараметрыСчетаФактурыПоОснованию() Экспорт
Если ДокументыОснования.Количество() = 0
Или Не ЗначениеЗаполнено(ДокументыОснования[0].ДокументОснование) Тогда
Возврат;
КонецЕсли;
МассивДокументовОснований = ДокументыОснования.ВыгрузитьКолонку("ДокументОснование");
ПараметрыСчетаФактуры = ПолучитьПараметрыСчетаФактурыПоОснованиям(МассивДокументовОснований);
Если Не ПараметрыСчетаФактуры.Организация = Неопределено И Не ПараметрыСчетаФактуры.Организация = Организация Тогда
Номер = "";
Организация = ПараметрыСчетаФактуры.Организация;
КонецЕсли;
ВалютаРегламентированногоУчета = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Если Не ПараметрыСчетаФактуры.Контрагент = Неопределено И Не ПараметрыСчетаФактуры.Контрагент = Контрагент Тогда
Контрагент = ПараметрыСчетаФактуры.Контрагент;
Если Не ПараметрыСчетаФактуры.ИННКонтрагента = Неопределено И Не ПараметрыСчетаФактуры.ИННКонтрагента = ИННКонтрагента Тогда
ИННКонтрагента = ПараметрыСчетаФактуры.ИННКонтрагента;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.КППКонтрагента = Неопределено И Не ПараметрыСчетаФактуры.КППКонтрагента = КППКонтрагента Тогда
КППКонтрагента = ПараметрыСчетаФактуры.КППКонтрагента;
КонецЕсли;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Партнер = Неопределено И Не ПараметрыСчетаФактуры.Партнер = Партнер Тогда
Партнер = ПараметрыСчетаФактуры.Партнер;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Договор = Неопределено И Не ПараметрыСчетаФактуры.Договор = Договор Тогда
Договор = ПараметрыСчетаФактуры.Договор;
КонецЕсли;
Если НЕ ПараметрыСчетаФактуры.Валюта = Неопределено
И Валюта <> ВалютаРегламентированногоУчета И Валюта <> ПараметрыСчетаФактуры.Валюта Тогда
Валюта = ПараметрыСчетаФактуры.Валюта;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Ответственный = Неопределено И Не ПараметрыСчетаФактуры.Ответственный = Ответственный Тогда
Ответственный = ПараметрыСчетаФактуры.Ответственный;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Подразделение = Неопределено И Не ПараметрыСчетаФактуры.Подразделение = Подразделение Тогда
Подразделение = ПараметрыСчетаФактуры.Подразделение;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.Склад = Неопределено И Не ПараметрыСчетаФактуры.Склад = Склад Тогда
Склад = ПараметрыСчетаФактуры.Склад;
КонецЕсли;
Если Не ПараметрыСчетаФактуры.НаправлениеДеятельности = Неопределено И Не ПараметрыСчетаФактуры.НаправлениеДеятельности = НаправлениеДеятельности Тогда
НаправлениеДеятельности = ПараметрыСчетаФактуры.НаправлениеДеятельности;
КонецЕсли;
Если НЕ ПараметрыСчетаФактуры.Корректировочный = Неопределено Тогда
Корректировочный = ПараметрыСчетаФактуры.Корректировочный;
Исправление = ПараметрыСчетаФактуры.Исправление;
КонецЕсли;
Если НЕ ПараметрыСчетаФактуры.СчетФактураОснование = Неопределено И Исправление Тогда
СчетФактураОснование = ПараметрыСчетаФактуры.СчетФактураОснование;
КонецЕсли;
ЗаполнитьКодВидаОперации();
РеквизитыОснования = ПараметрыСчетаФактуры.РеквизитыОснований;
Если РеквизитыОснования.Количество() > 0 Тогда
ДокументыОснования.Загрузить(РеквизитыОснования);
КонецЕсли;
Для Каждого СтрокаОснования Из ДокументыОснования Цикл
СтрокаОснования.ХозяйственнаяОперация =
ПараметрыСчетаФактуры.ХозяйственныеОперацииДокументовОснований[СтрокаОснования.ДокументОснование];
Если Не ЗначениеЗаполнено(СтрокаОснования.ХозяйственнаяОперация)Тогда
СтрокаОснования.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
КонецЕсли;
КонецЦикла;
СуммыДокумента = ПолучитьСуммыДокументовОснований();
ЗаполнитьСуммыДокументовОснований(СуммыДокумента);
КонецПроцедуры
Процедура ЗаполнитьХозяйственнуюОперациюДокументовОснований()
Для Каждого СтрокаТаблицы Из ДокументыОснования Цикл
Если Не ЗначениеЗаполнено(СтрокаТаблицы.ХозяйственнаяОперация) Тогда
СтрокаТаблицы.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ИсправляемыйСчетФактураПоОснованию(Ссылка, Основание, Организация = Неопределено)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| &ДокументОснование КАК Ссылка
|ПОМЕСТИТЬ ОснованияСчетаФактуры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДанныеКорректировок.ДокументОснование КАК Ссылка
|ИЗ
| Документ.КорректировкаПриобретения КАК ДанныеКорректировок
|ГДЕ
| ДанныеКорректировок.Ссылка = &ДокументОснование
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДанныеКорректировок.Ссылка КАК Ссылка
|ИЗ
| Документ.КорректировкаПриобретения КАК ДанныеОснования
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Документ.КорректировкаПриобретения КАК ДанныеКорректировок
| ПО
| ДанныеКорректировок.ДокументОснование = ДанныеОснования.ДокументОснование
|
|ГДЕ
| ДанныеОснования.Ссылка = &ДокументОснование
|;
|
|
|ВЫБРАТЬ
| ДанныеОснований.Ссылка КАК ДокументОснование,
| ЕСТЬNULL(ДанныеРеестра.ХозяйственнаяОперация,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика)) КАК ХозяйственнаяОперация
|ИЗ
| ОснованияСчетаФактуры КАК ДанныеОснований
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК ДанныеРеестра
| ПО ДанныеОснований.Ссылка = ДанныеРеестра.Ссылка
| И НЕ ДанныеРеестра.ДополнительнаяЗапись
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| СчетФактураПолученный.Ссылка КАК Ссылка,
| СчетФактураПолученный.Валюта КАК Валюта,
| СчетФактураПолученный.Организация КАК Организация,
| СчетФактураПолученный.Контрагент КАК Контрагент,
| СчетФактураПолученный.НаправлениеДеятельности КАК НаправлениеДеятельности,
| СчетФактураПолученный.Партнер КАК Партнер,
| СчетФактураПолученный.Договор КАК Договор,
| СчетФактураПолученный.Склад КАК Склад,
| СчетФактураПолученный.КодВидаОперации КАК КодВидаОперации,
| СчетФактураПолученный.Корректировочный КАК Корректировочный,
| СчетФактураПолученный.Номер КАК Номер,
| СчетФактураПолученный.Подразделение КАК Подразделение,
| ВЫБОР КОГДА СчетФактураПолученный.Исправление ТОГДА
| ЕСТЬNULL(СчетФактураПолученный.СчетФактураОснование.ДатаСоставления, Неопределено)
| ИНАЧЕ
| СчетФактураПолученный.ДатаСоставления
| КОНЕЦ КАК ДатаСоставления,
|
| СчетФактураПолученный.ДокументыОснования.(
| ДокументОснование,
| ХозяйственнаяОперация,
| ИсходныйДокумент
| ) КАК ДокументыОснования
|ИЗ
| Документ.СчетФактураПолученный КАК СчетФактураПолученный
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураПолученныйОснования
| ПО СчетФактураПолученный.Ссылка = СчетФактураПолученныйОснования.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОснованияСчетаФактуры КАК ОснованияСчетаФактуры
| ПО ОснованияСчетаФактуры.Ссылка = СчетФактураПолученныйОснования.ДокументОснование
|
|ГДЕ
| СчетФактураПолученный.Ссылка <> &Ссылка
| И (СчетФактураПолученный.Организация = &Организация
| ИЛИ &Организация = НЕОПРЕДЕЛЕНО)
| И СчетФактураПолученный.Проведен
| И НЕ СчетФактураПолученный.ПометкаУдаления
| И НЕ СчетФактураПолученный.Исправление
|
|УПОРЯДОЧИТЬ ПО
| СчетФактураПолученный.Корректировочный УБЫВ,
| СчетФактураПолученный.МоментВремени УБЫВ
|");
Запрос.УстановитьПараметр("ДокументОснование", Основание);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
УстановитьПривилегированныйРежим(Истина);
МассивРезультатов = Запрос.ВыполнитьПакет();
УстановитьПривилегированныйРежим(Ложь);
РезультатЗапроса = МассивРезультатов[2];
РеквизитыСчетаФактуры = Новый Структура;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
РеквизитыСчетаФактуры.Вставить(Колонка.Имя);
КонецЦикла;
ВидыОпераций = Новый Соответствие;
ВыборкаОпераций = МассивРезультатов[1].Выбрать();
Пока ВыборкаОпераций.Следующий() Цикл
ВидыОпераций.Вставить(ВыборкаОпераций.ДокументОснование, ВыборкаОпераций.ХозяйственнаяОперация);
КонецЦикла;
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(РеквизитыСчетаФактуры, Выборка);
ТаблицаОснований = Выборка.ДокументыОснования.Выгрузить();
Если ТаблицаОснований.Найти(Основание,"ДокументОснование")=Неопределено Тогда
ИсходныйДокумент = Неопределено;
Если Выборка.Корректировочный Тогда
ИсходныйДокумент = Выборка.Ссылка;
ТаблицаИсходныхДокументов = ТаблицаОснований.Скопировать(, "ИсходныйДокумент");
ТаблицаИсходныхДокументов.Свернуть("ИсходныйДокумент");
Если ТаблицаИсходныхДокументов.Количество() > 0 И ЗначениеЗаполнено(ТаблицаИсходныхДокументов[0].ИсходныйДокумент) Тогда
ИсходныйДокумент = ТаблицаИсходныхДокументов[0].ИсходныйДокумент;
КонецЕсли;
КонецЕсли;
ТаблицаОснований.Очистить();
СтрокаОснования = ТаблицаОснований.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаОснования, Выборка);
СтрокаОснования.ДокументОснование = Основание;
СтрокаОснования.ХозяйственнаяОперация = ВидыОпераций[Основание];
СтрокаОснования.ИсходныйДокумент = ИсходныйДокумент;
КонецЕсли;
РеквизитыСчетаФактуры.Вставить("ДокументыОснования", ТаблицаОснований);
КонецЕсли;
Возврат РеквизитыСчетаФактуры;
КонецФункции
Функция ДанныеСчетаФактуры(СчетФактура)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ВЫБОР КОГДА СчетФактураПолученный.Исправление ТОГДА
| СчетФактураПолученный.СчетФактураОснование
| ИНАЧЕ
| НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК СчетФактураОснование,
| СчетФактураПолученный.Валюта КАК Валюта,
| СчетФактураПолученный.Организация КАК Организация,
| СчетФактураПолученный.Контрагент КАК Контрагент,
| СчетФактураПолученный.ИННКонтрагента КАК ИННКонтрагента,
| СчетФактураПолученный.КППКонтрагента КАК КППКонтрагента,
| СчетФактураПолученный.НаправлениеДеятельности КАК НаправлениеДеятельности,
| СчетФактураПолученный.Партнер КАК Партнер,
| СчетФактураПолученный.Договор КАК Договор,
| СчетФактураПолученный.Склад КАК Склад,
| СчетФактураПолученный.КодВидаОперации КАК КодВидаОперации,
| СчетФактураПолученный.Корректировочный КАК Корректировочный,
| СчетФактураПолученный.Номер КАК Номер,
| СчетФактураПолученный.Дата КАК Дата,
| СчетФактураПолученный.ДатаСоставления КАК ДатаСоставления,
| СчетФактураПолученный.Подразделение КАК Подразделение,
| СчетФактураПолученный.ДокументыОснования.(
| ДокументОснование,
| ХозяйственнаяОперация,
| ИсходныйДокумент
| ) КАК ДокументыОснования
|ИЗ
| Документ.СчетФактураПолученный КАК СчетФактураПолученный
|ГДЕ
| СчетФактураПолученный.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СчетФактура);
УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
СтруктураДанных = Новый Структура;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
СтруктураДанных.Вставить(Колонка.Имя);
КонецЦикла;
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(СтруктураДанных, Выборка);
СтруктураДанных.Вставить("ДокументыОснования", Выборка.ДокументыОснования.Выгрузить());
КонецЕсли;
Возврат СтруктураДанных;
КонецФункции
#Область ЗаполнениеСуммДокументовОснований
Функция ПолучитьСуммыДокументовОснований(ДанныеЗаполнения = Неопределено) Экспорт
ЭтоКорректировочный = ?(ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Корректировочный"),
ДанныеЗаполнения.Корректировочный, Корректировочный);
ВалютаСчетаФактуры = ?(ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Валюта"),
ДанныеЗаполнения.Валюта, Валюта);
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Корректировочный", ЭтоКорректировочный);
ПараметрыЗаполнения.Вставить("Валюта", ВалютаСчетаФактуры);
ПараметрыЗаполнения.Вставить("ДокументыОснования", ДокументыОснования.Выгрузить());
Возврат Документы.СчетФактураПолученный.ПолучитьСуммыДокументовОснований(ПараметрыЗаполнения);
КонецФункции
Процедура ЗаполнитьСуммыДокументовОснований(СуммыДокумента) Экспорт
ДокументыОснования.Загрузить(СуммыДокумента);
РучнаяКорректировкаСуммДокумента = Ложь;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область Прочее
Процедура ПроверитьЗаполнениеДокументовОснований(Отказ)
ЭтоЗакупкаУПоставщика = Неопределено;
ТипОснования = Неопределено;
ВалютаОснования = Неопределено;
Для Каждого СтрокаОснование Из ДокументыОснования Цикл
Если ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг")
ИЛИ ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.ПриобретениеУслугПрочихАктивов")
ИЛИ ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.ВозвратТоваровПоставщику")
ИЛИ ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.КорректировкаПриобретения") Тогда
Если ЭтоЗакупкаУПоставщика = Неопределено Тогда
ЭтоЗакупкаУПоставщика = Истина;
ИначеЕсли НЕ ЭтоЗакупкаУПоставщика Тогда
СообщитьОбОшибкеТиповОснований(СтрокаОснование.НомерСтроки, Отказ);
КонецЕсли;
ИначеЕсли ТипЗнч(СтрокаОснование.ДокументОснование) = Тип("ДокументСсылка.ВозвратТоваровОтКлиента")
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаОснование.ДокументОснование, "ПокупательНеПлательщикНДС") = Истина Тогда
СообщитьОбОшибкеОснования(СтрокаОснование.НомерСтроки, Отказ);
ИначеЕсли ТипОснования = Неопределено Тогда
ТипОснования = ТипЗнч(СтрокаОснование.ДокументОснование);
ИначеЕсли ТипОснования <> Неопределено И ТипОснования <> ТипЗнч(СтрокаОснование.ДокументОснование) Тогда
СообщитьОбОшибкеТиповОснований(СтрокаОснование.НомерСтроки, Отказ);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаОснование.ДокументОснование) И
НЕ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаОснование.ДокументОснование, "Проведен") Тогда
СообщитьОбОшибкеСостоянияПроведенияОснований(СтрокаОснование.НомерСтроки, Отказ);
КонецЕсли;
Если ВалютаОснования = Неопределено Тогда
ВалютаОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаОснование.ДокументОснование, "Валюта");
ИначеЕсли ВалютаОснования <> Неопределено
И ВалютаОснования <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаОснование.ДокументОснование, "Валюта") Тогда
СообщитьОбОшибкеВалютыОснований(СтрокаОснование.НомерСтроки, Отказ);
КонецЕсли;
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаОснование.ДокументОснование, "НалогообложениеНДС")
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаОснование.ДокументОснование, "НалогообложениеНДС") =
Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя Тогда
СообщитьОбОшибкеНалогообложенияНДСОснований(СтрокаОснование.НомерСтроки, Отказ);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СообщитьОбОшибкеТиповОснований(НомерСтроки, Отказ)
ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы различных типов.'");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецПроцедуры
Процедура СообщитьОбОшибкеОснования(НомерСтроки, Отказ)
ТекстСообщения = НСтр("ru = 'Запрещено формировать счет-фактуру полученный для возврата от неплательщиков НДС.'");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецПроцедуры
Процедура СообщитьОбОшибкеСостоянияПроведенияОснований(НомерСтроки, Отказ)
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В строке %1 документ-основание не проведен. Счет-фактуру можно провести только на основании проведенных документов.'"),
НомерСтроки,);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецПроцедуры
Процедура СообщитьОбОшибкеВалютыОснований(НомерСтроки, Отказ)
ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы, оформленные в различной валюте.'");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецПроцедуры
Процедура СообщитьОбОшибкеНалогообложенияНДСОснований(НомерСтроки, Отказ)
ТекстСообщения = НСтр("ru = 'Запрещено выбирать в качестве оснований документы с типом налогообложения ""Облагается НДС у покупателя"".'");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ДокументыОснования", НомерСтроки, "ДокументОснование");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецПроцедуры
Процедура ПроверитьДублиСчетФактуры(Отказ)
Если Исправление ИЛИ Корректировочный Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаОснований.ДокументОснование КАК ДокументОснование
|ИЗ
| Документ.СчетФактураПолученный.ДокументыОснования КАК ТаблицаОснований
|ГДЕ
| ТаблицаОснований.Ссылка <> &Ссылка
| И ТаблицаОснований.ДокументОснование В(&СписокОснований)
| И ТаблицаОснований.Ссылка.Проведен
| И (ТаблицаОснований.Ссылка.Организация = &Организация
| ИЛИ &Организация = Неопределено)
| И (НЕ ТаблицаОснований.Ссылка.Исправление)
| И (НЕ ТаблицаОснований.ДокументОснование ССЫЛКА Документ.ОтчетКомитенту)
|");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("СписокОснований", ДокументыОснования.ВыгрузитьКолонку("ДокументОснование"));
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для документа %1 по организации %2 уже введен счет-фактура'"),
Выборка.ДокументОснование,
Организация);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
Текст,
ЭтотОбъект,
"ДокументыОснования",
,
Отказ);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьИсправлениеСчетФактуры(Отказ)
Если Не Исправление Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.ДокументОснование
|ПОМЕСТИТЬ вт_ДокументыОснования
|ИЗ
| &ДокументыОснования КАК Т
|;
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаОснований.ДокументОснование КАК ДокументОснование,
| ВЫБОР
| КОГДА ТаблицаОснований.Ссылка.Исправление
| ТОГДА ТаблицаОснований.Ссылка.СчетФактураОснование
| ИНАЧЕ ТаблицаОснований.Ссылка
| КОНЕЦ КАК СчетФактураОснование
|ПОМЕСТИТЬ вт_СчетаФактурыОснования
|ИЗ
| Документ.СчетФактураПолученный.ДокументыОснования КАК ТаблицаОснований
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_ДокументыОснования КАК вт_ДокументыОснования
| ПО ТаблицаОснований.ДокументОснование = вт_ДокументыОснования.ДокументОснование
|ГДЕ
| НЕ ТаблицаОснований.Ссылка = &Ссылка
| И ТаблицаОснований.Ссылка.Проведен
| И (ТаблицаОснований.Ссылка.Организация = &Организация
| ИЛИ &Организация = Неопределено)
| И (НЕ ТаблицаОснований.ДокументОснование ССЫЛКА Документ.ОтчетКомитенту)
|;
|
|ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ вт_ДокументыОснования.ДокументОснование) КАК Количество,
| ВЫБОР
| КОГДА &Исправление
| ТОГДА &СчетФактураОснование
| ИНАЧЕ вт_СчетаФактурыОснования.СчетФактураОснование
| КОНЕЦ КАК СчетФактураОснование
|ПОМЕСТИТЬ вт_ВыставленныеИсправления
|ИЗ
| вт_ДокументыОснования КАК вт_ДокументыОснования
| ЛЕВОЕ СОЕДИНЕНИЕ вт_СчетаФактурыОснования КАК вт_СчетаФактурыОснования
| ПО вт_ДокументыОснования.ДокументОснование = вт_СчетаФактурыОснования.ДокументОснование
|СГРУППИРОВАТЬ ПО
| ВЫБОР
| КОГДА &Исправление
| ТОГДА &СчетФактураОснование
| ИНАЧЕ вт_СчетаФактурыОснования.СчетФактураОснование
| КОНЕЦ
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ вт_ДокументыОснования.ДокументОснование) > 1
|;
|
|ВЫБРАТЬ
| вт_СчетаФактурыОснования.ДокументОснование
|ИЗ
| вт_СчетаФактурыОснования КАК вт_СчетаФактурыОснования
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_ВыставленныеИсправления КАК вт_ВыставленныеИсправления
| ПО вт_СчетаФактурыОснования.СчетФактураОснование = вт_ВыставленныеИсправления.СчетФактураОснование";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ДокументыОснования", ДокументыОснования.Выгрузить());
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Исправление", Исправление);
Запрос.УстановитьПараметр("СчетФактураОснование", СчетФактураОснование);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для документа %1 по организации %2 уже введен счет-фактура'"),
Выборка.ДокументОснование,
Организация);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
Текст,
ЭтотОбъект,
"ДокументыОснования",
,
Отказ);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли