Авансовый отчет / Модуль объекта

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

#Область ПрограммныйИнтерфейс

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

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

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

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

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

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

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

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

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

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

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

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

#Область ИнициализацияИЗаполнение

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

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

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

Функция ПолучитьЭлектронныеБилеты(Знач ДанныеЗаполнения, ЦелиВыдачи = Неопределено, Заявка = Неопределено)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	КОНЕЦПЕРИОДА(ДанныеДокумента.Дата, ДЕНЬ) КАК Дата
	|ПОМЕСТИТЬ ПредыдущийОтчет
	|ИЗ
	|	Документ.АвансовыйОтчет КАК ДанныеДокумента
	|ГДЕ
	|	ДанныеДокумента.ПодотчетноеЛицо = &ПодотчетноеЛицо
	|	И ДанныеДокумента.Подразделение = &Подразделение
	|	И ДанныеДокумента.Организация = &Организация
	|	И ДанныеДокумента.Ссылка <> &Ссылка
	|	И ДанныеДокумента.Проведен
	|УПОРЯДОЧИТЬ ПО
	|	ДанныеДокумента.Дата УБЫВ
	|;
	|
	|ВЫБРАТЬ
	|	Операции.ЭлектронныйБилет КАК ЭлектронныйБилет,
	|	МАКСИМУМ(Операции.БланкСтрогойОтчетности) КАК БланкСтрогойОтчетности,
	|	Операции.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
	|	Операции.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
	|	Операции.НаименованиеВходящегоДокумента КАК НаименованиеВходящегоДокумента,
	|	Операции.Подразделение КАК Подразделение,
	|	ВЫРАЗИТЬ(Операции.Содержание КАК Строка(128)) КАК Содержание,
	|	Операции.Валюта КАК Валюта,
	|	Операции.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств,
	|	Операции.СтавкаНДС КАК СтавкаНДС,
	|	Операции.Контрагент КАК Контрагент,
	|	СУММА(Операции.Сумма) КАК Сумма,
	|	СУММА(Операции.СуммаНДС) КАК СуммаНДС,
	|	СУММА(Операции.Сумма) КАК СуммаСНДС
	|ИЗ
	|(ВЫБРАТЬ
	|	ДанныеДокумента.Ссылка                                КАК ЭлектронныйБилет,
	|	ДанныеДокумента.СуммаНДС <> 0                         КАК БланкСтрогойОтчетности,
	|	ДанныеДокумента.Ссылка.НомерБилета                    КАК НомерВходящегоДокумента,
	|	ДанныеДокумента.Ссылка.Дата                           КАК ДатаВходящегоДокумента,
	|	ДанныеДокумента.Ссылка.Подразделение                  КАК Подразделение,
	|	ПРЕДСТАВЛЕНИЕ(ДанныеДокумента.Ссылка.ТипУслуги)       КАК НаименованиеВходящегоДокумента,
	|	ВЫБОР КОГДА ДанныеДокумента.ТипОперации = ЗНАЧЕНИЕ(Перечисление.ТипыОперацийСБилетами.Возврат)
	|		ТОГДА -ДанныеДокумента.Сумма
	|		ИНАЧЕ ДанныеДокумента.Сумма
	|	КОНЕЦ                                                 КАК Сумма,
	|	ДанныеДокумента.Ссылка.ДеталиПоездки                  КАК Содержание,
	|	ДанныеДокумента.Ссылка.Валюта                         КАК Валюта,
	|	ДанныеДокумента.Ссылка.СтатьяДвиженияДенежныхСредств  КАК СтатьяДвиженияДенежныхСредств,
	|	ДанныеДокумента.СтавкаНДС                             КАК СтавкаНДС,
	|	ВЫБОР КОГДА ДанныеДокумента.ТипОперации = ЗНАЧЕНИЕ(Перечисление.ТипыОперацийСБилетами.Возврат)
	|		ТОГДА -ДанныеДокумента.СуммаНДС
	|		ИНАЧЕ ДанныеДокумента.СуммаНДС
	|	КОНЕЦ                                                 КАК СуммаНДС,
	|	ДанныеДокумента.Ссылка.КонтрагентПеревозчик           КАК Контрагент
	|ИЗ
	|	Документ.Бронирование.Операции КАК ДанныеДокумента
	|	ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущийОтчет
	|	ПО ИСТИНА
	|	ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ПрочиеРасходы КАК ДанныеОтчета
	|	ПО ДанныеОтчета.ЭлектронныйБилет = ДанныеДокумента.Ссылка
	|	И НЕ ДанныеОтчета.Ссылка = &Ссылка
	|ГДЕ
	|	ДанныеДокумента.Ссылка.ТипБронирования = ЗНАЧЕНИЕ(Перечисление.ТипыБронирования.ЭлектронныйБилет)
	|	И ДанныеДокумента.Ссылка.Сотрудник = &ПодотчетноеЛицо
	|	И ДанныеДокумента.Ссылка.Подразделение = &Подразделение
	|	И ДанныеДокумента.Ссылка.Организация = &Организация
	|	И НЕ ДанныеДокумента.Ссылка.СпособСписанияНапрямую
	|	И (ДанныеДокумента.Ссылка.СтатьяДвиженияДенежныхСредств В (&ЦелиВыдачи)
	|		ИЛИ &ЛюбыеЦели)
	|	И (ДанныеДокумента.Ссылка.ДокументОснование В (&Заявка)
	|		ИЛИ &ЗаявкаНеУказана)
	|	И (ДанныеДокумента.Ссылка.Валюта = &Валюта ИЛИ &Мультивалютный)
	|	И ДанныеДокумента.Ссылка.ДатаПрибытия > ЕСТЬNULL(ПредыдущийОтчет.Дата,ДАТАВРЕМЯ(1,1,1))
	|	И ДанныеДокумента.Ссылка.Проведен
	|	И ДанныеОтчета.Ссылка ЕСТЬ NULL) КАК Операции
	|СГРУППИРОВАТЬ ПО
	|	Операции.ЭлектронныйБилет,
	|	Операции.НомерВходящегоДокумента,
	|	Операции.Подразделение,
	|	Операции.ДатаВходящегоДокумента,
	|	Операции.НаименованиеВходящегоДокумента,
	|	ВЫРАЗИТЬ(Операции.Содержание КАК Строка(128)),
	|	Операции.Валюта,
	|	Операции.СтатьяДвиженияДенежныхСредств,
	|	Операции.СтавкаНДС,
	|	Операции.Контрагент
	|ИМЕЮЩИЕ 
	|	СУММА(Операции.Сумма) > 0
	|";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("ПодотчетноеЛицо", ДанныеЗаполнения.ПодотчетноеЛицо);
	Запрос.УстановитьПараметр("Подразделение", ДанныеЗаполнения.Подразделение);
	Запрос.УстановитьПараметр("Организация", ДанныеЗаполнения.Организация);
	Запрос.УстановитьПараметр("ЦелиВыдачи", ЦелиВыдачи);
	Запрос.УстановитьПараметр("ЛюбыеЦели", Не ЗначениеЗаполнено(ЦелиВыдачи) Или Не ЦелиВыдачи.Количество());
	Запрос.УстановитьПараметр("Заявка", Заявка);
	Запрос.УстановитьПараметр("ЗаявкаНеУказана", Не ЗначениеЗаполнено(Заявка));
	Запрос.УстановитьПараметр("Валюта", ДанныеЗаполнения.Валюта);
	Запрос.УстановитьПараметр("Мультивалютный", ДанныеЗаполнения.Мультивалютный);

	Возврат Запрос.Выполнить();
	
КонецФункции

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

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

#Область Прочее

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

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

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

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

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

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

#КонецЕсли

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