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