Счет-фактура выданный (аванс) / Форма рабочее место / Модуль формы

файл

#Область ОписаниеПеременных

&НаКлиенте
Перем ПараметрыОбработчикаОжидания;

&НаКлиенте
Перем ФормаДлительнойОперации;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

	Если Параметры.Свойство("ЗаполнитьПриОткрытии") Тогда
		ЗаполнитьПолученныеАвансыНаСервере(); 
		УстановитьОтборСостояния(Элементы.ПолученныеАвансы, ОтборСостояние);
	КонецЕсли;

	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
	УстановитьВидимостьКоманд();
	УстановитьВидимостьПолей();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	// Подсистема "ЭлектронныеДокументы"
	Если ИмяСобытия = "ОбновитьСостояниеЭД" Тогда
		Элементы.ПолученныеАвансы.Обновить();
	КонецЕсли;
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
	
	ПриИзмененииОтбора();
	
КонецПроцедуры

&НаКлиенте
Процедура КонецПериодаПриИзменении(Элемент)
	
	ПриИзмененииОтбора();
	
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	
	ПриИзмененииОтбора();
	ОрганизацияПриИзмененииНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
	ВалютаРеглУчета = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецПроцедуры

&НаКлиенте
Процедура ОтборСостояниеПриИзменении(Элемент)
	
	УстановитьОтборСостояния(Элементы.ПолученныеАвансы, ОтборСостояние);
	
КонецПроцедуры

&НаКлиенте
Процедура НадписьЗакрытьНажатие(Элемент)
	
	ПоказатьИнформационнуюНадпись = Ложь;
	
	ОбновитьОтображениеИнформационнойНадписи();
	
КонецПроцедуры

&НаКлиенте
Процедура НадписьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОтборСостояние = "НетДанныхПлатежноРасчетногоДокумента";
	УстановитьОтборСостояния(Элементы.ПолученныеАвансы, ОтборСостояние);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПолученныеАвансыСтавкаНДСПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ПолученныеАвансы.ТекущиеДанные;
	
	СтруктураПересчетаСуммы = ПересчетСуммыНДСВСтрокеТЧ();
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	
	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПолученныеАвансыВалютнаяСуммаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ПолученныеАвансы.ТекущиеДанные;
	
	ТекущаяСтрока.Сумма = ТекущаяСтрока.ВалютнаяСумма;
	
	// Проверим валюту, если она отличается от валюты регл. учета, то пересчитаем суммы
	ВалютаДанных = ТекущаяСтрока.ВалютаДокумента;
	Если ЗначениеЗаполнено(ВалютаДанных)
		И ВалютаДанных <> ВалютаРеглУчета Тогда
		
		ПолученныеАвансыВалютнаяСуммаПриИзмененииСервер(
			ВалютаРеглУчета,
			ВалютаДанных,
			ТекущаяСтрока.ДатаДокументаОснования, 
			ТекущаяСтрока.ВалютнаяСумма,
			ТекущаяСтрока.Сумма);
	КонецЕсли; 

	СтруктураПересчетаСуммы = ПересчетСуммыНДСВСтрокеТЧ();
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	
	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
	
КонецПроцедуры

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

&НаКлиенте
Процедура НеиспользуемыеСчетаФактурыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ТекущийДокумент = Элемент.ТекущиеДанные.СчетФактура;
	
	Если ЗначениеЗаполнено(ТекущийДокумент) Тогда
		ПоказатьЗначение(Неопределено, ТекущийДокумент);
	КонецЕсли;
			
КонецПроцедуры

&НаКлиенте
Процедура ПолученныеАвансыВыбранПриИзменении(Элемент)
	
	ТекущийДокументОснование = Элементы.ПолученныеАвансы.ТекущиеДанные.ДокументОснование;
	Выбран = Элементы.ПолученныеАвансы.ТекущиеДанные.Выбран;
	
	СтрокиОснования = ПолученныеАвансы.НайтиСтроки(Новый Структура("ДокументОснование", ТекущийДокументОснование));
	Для Каждого Строка Из СтрокиОснования Цикл
		Строка.Выбран = Выбран;
	КонецЦикла;
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ВыбратьПериод(Команда)
	
	ПараметрыВыбора = Новый Структура("НачалоПериода,КонецПериода", НачалоПериода, КонецПериода);
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ВыборСтандартногоПериода", ПараметрыВыбора, Элементы.ВыбратьПериод, , , , ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПолученныеАвансы(Команда)
	
	ОчиститьСообщения();
	Если ПроверитьЗаполнение() Тогда
		ЗаполнитьПолученныеАвансыНаСервере();
	КонецЕсли; 
	
	УстановитьОтборСостояния(Элементы.ПолученныеАвансы, ОтборСостояние);
	
КонецПроцедуры

&НаКлиенте
Процедура СформироватьСчетаФактуры(Команда)
	
	ФормированиеСчетовФактур();
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьНеиспользуемыеСчетаФактуры(Команда)
	
	УдалитьНеиспользуемыеСчетаФактурыСервер();	
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьСчетФактуру(Команда)
	
	ДанныеАванса = Элементы.ПолученныеАвансы.ТекущиеДанные;
	
	Если ДанныеАванса = Неопределено Тогда
		ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Необходимо выбрать полученный аванс!'"));
	Иначе
		ФормированиеСчетовФактур(ДанныеАванса.ПолучитьИдентификатор())
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСтавкуНДС(Команда)
	
	ПараметрыФормы = ПараметрыФормыВыбораСтавкиНДС();
	ОткрытьФорму("Справочник.СтавкиНДС.ФормаВыбора", 
		ПараметрыФормы,,,,, 
		Новый ОписаниеОповещения("УстановитьСтавкуНДСЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьПодразделение(Команда)
	
	ПараметрыОбработки = Новый Структура;
	ПараметрыОбработки.Вставить("РеквизитИмя", "Подразделение");
	ПараметрыОбработки.Вставить("РеквизитТип", "Справочник.СтруктураПредприятия");
	ПараметрыОбработки.Вставить("Отбор", Новый Структура("Организация", Организация));
	
	УстановитьРеквизит(ПараметрыОбработки);
	
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьГлавногоБухгалтера(Команда)
	
	СтруктураОтбора = Новый Структура("Владелец,ОтветственноеЛицо",
		Организация, ПредопределенноеЗначение("Перечисление.ОтветственныеЛицаОрганизаций.ГлавныйБухгалтер"));
	
	ПараметрыОбработки = Новый Структура;
	ПараметрыОбработки.Вставить("РеквизитИмя", "ГлавныйБухгалтер");
	ПараметрыОбработки.Вставить("РеквизитТип", "Справочник.ОтветственныеЛицаОрганизаций");
	ПараметрыОбработки.Вставить("Отбор", СтруктураОтбора);
	
	УстановитьРеквизит(ПараметрыОбработки);
	
КонецПроцедуры

&НаКлиенте
Процедура Выбрать(Команда)
	
	Для Каждого СтрокаАванса Из ПолученныеАвансы Цикл
		СтрокаАванса.Выбран = Истина;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура Исключить(Команда)
	
	Для Каждого СтрокаАванса Из ПолученныеАвансы Цикл
		СтрокаАванса.Выбран = Ложь;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВыделенные(Команда)
	
	Для Каждого СтрокаАванса Из Элементы.ПолученныеАвансы.ВыделенныеСтроки Цикл
		Элементы.ПолученныеАвансы.ДанныеСтроки(СтрокаАванса).Выбран = Истина;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьВыделенные(Команда)
	
	Для Каждого СтрокаАванса Из Элементы.ПолученныеАвансы.ВыделенныеСтроки Цикл
		Элементы.ПолученныеАвансы.ДанныеСтроки(СтрокаАванса).Выбран = Ложь;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.ПолученныеАвансы);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.ПолученныеАвансы, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.ПолученныеАвансы);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

#Область ПриИзмененииРеквизитов

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

&НаСервереБезКонтекста
Процедура ПолученныеАвансыВалютнаяСуммаПриИзмененииСервер(ВалютаРеглУчета, ВалютаДанных, ДатаДокументаОснования, ВалютнаяСумма, Сумма)
	
	СтруктураКурсаРегл = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаРеглУчета, ДатаДокументаОснования, ВалютаРеглУчета);
	СтруктураКурса = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаДанных, ДатаДокументаОснования, ВалютаРеглУчета);
	Сумма = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
		ВалютнаяСумма,
		СтруктураКурсаРегл,
		СтруктураКурса);
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОтбора()
	
	УстановитьПравилоОтбораПолученныхАвансов();
	
КонецПроцедуры

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

#Область ЗаполнениеФормы

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

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

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

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

#Область ОбработкаДанныхФормы

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

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

&НаСервере
Процедура ОбновитьДанныеОСчетахФактурахВСтроке(Строка, ТаблицаОбработанных,  ТаблицаВозниклиОшибки)
	
	Отбор = Новый Структура;
	Отбор.Вставить("ДокументОснование",  Строка.ДокументОснование);
	Отбор.Вставить("Контрагент",         Строка.Контрагент);
	Отбор.Вставить("НалогообложениеНДС", Строка.НалогообложениеНДС);
	
	РезультатПоискаОбработанных = ТаблицаОбработанных.НайтиСтроки(Отбор);
	РезультатПоискаОшибки = ТаблицаВозниклиОшибки.НайтиСтроки(Отбор);
	
	Если РезультатПоискаОбработанных.Количество() <> 0 Тогда
		Строка.СФсформирован = Истина;
		ПараметрыСчетаФактуры = РезультатПоискаОбработанных[0].ПараметрыСчетаФактуры;
		Если ПараметрыСчетаФактуры[Строка.СтавкаНДС] <> Неопределено Тогда
			Строка.СуммаСчетаФактуры = ПараметрыСчетаФактуры[Строка.СтавкаНДС];
		КонецЕсли;
		Строка.СчетФактура = ПараметрыСчетаФактуры["СчетФактура"];
		Если ТипЗнч(Строка.ДокументОснование) = Тип("ДокументСсылка.Сторно") Тогда
			Строка.НетДанныхПлатежноРасчетногоДокумента = Истина;
		КонецЕсли;
	ИначеЕсли РезультатПоискаОшибки.Количество() <> 0 Тогда
		Строка.СФсформирован = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УдалитьНеиспользуемыеСчетаФактурыСервер()
	
	Для каждого ДанныеСчетФактуры Из НеИспользуемыеСчетаФактуры Цикл
		ДокументОбъект = ДанныеСчетФактуры.Значение.ПолучитьОбъект();
		ДокументОбъект.УстановитьПометкуУдаления(Истина);
	КонецЦикла; 
	
	ЗаполнитьНеиспользуемыеСчетаФактуры();
	
КонецПроцедуры

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

#Область Оформление

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансыСтавкаНДС.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансыСуммаНДС.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.СФсформирован");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Указана в СФ'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Ложь);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

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

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансыКонтрагент.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.Контрагент");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Указано в СФ'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Ложь);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансыСтавкаНДС.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.СФсформирован");
	ОтборЭлемента.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.НалогообложениеНДС");
	ОтборЭлемента.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста",     ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст",          НСтр("ru = 'НДС исчисляется налоговым агентом'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Ложь);

	//
	
	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансы.Имя);
	
	ОтборЭлемента = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.ПравилоОтбораАванса");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.ВсеОплаты;//;

	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//

	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансы.Имя);

	ОтборЭлемента = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолученныеАвансы.ОшибкаСумм");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200));
	
	//

	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолученныеАвансы.Имя);

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

	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200));

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьСтавкуНДСЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	СтавкаНДС = Результат;
	Если ЗначениеЗаполнено(СтавкаНДС) Тогда
		УстановитьСтавкуНДСНаСервере(СтавкаНДС);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьРеквизит(ПараметрыОбработки)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьРеквизитЗавершение", ЭтотОбъект, ПараметрыОбработки);
	ОткрытьФорму(ПараметрыОбработки.РеквизитТип + ".ФормаВыбора", ПараметрыОбработки, ЭтотОбъект,,,, ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРеквизитЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ИндексСтроки Из Элементы.ПолученныеАвансы.ВыделенныеСтроки Цикл
		ДанныеСтроки = Элементы.ПолученныеАвансы.ДанныеСтроки(ИндексСтроки);
		Если ДанныеСтроки[ДополнительныеПараметры.РеквизитИмя] <> Результат Тогда
			ДанныеСтроки[ДополнительныеПараметры.РеквизитИмя] = Результат;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПересчетСуммыНДСВСтрокеТЧ()

	СтруктураЗаполненияЦены = Новый Структура;
	СтруктураЗаполненияЦены.Вставить("ЦенаВключаетНДС", Истина);
	
	Возврат СтруктураЗаполненияЦены;

КонецФункции

&НаСервере
Процедура УстановитьПравилоОтбораПолученныхАвансов()
	
	// Получим значение из учетной политики
	НастройкиУчетаНДС= НастройкиНалоговУчетныхПолитик.ДействующиеПараметрыНалоговУчетныхПолитикНаДату("НастройкиУчетаНДС",
			Организация,
			КонецПериода,
			Истина);
	Если НастройкиУчетаНДС = Неопределено Тогда
		ПравилоОтбораАванса = Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеДня;
	Иначе
		ПравилоОтбораАванса = НастройкиУчетаНДС.ПравилоОтбораАвансовДляРегистрацииСчетовФактур;
	КонецЕсли;
	
	// Сформируем список выбора с учетом выбранного периода
	СписокВыборка = Элементы.ПравилаОтборПолученныхАвансов.СписокВыбора;
	СписокВыборка.Очистить();
	
	СписокВыборка.Добавить(Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеДня);
	
	Если НачалоДня(КонецПериода) - НачалоДня(НачалоПериода) >= 5 * 86400 Тогда
		СписокВыборка.Добавить(Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеПятиДней);
	КонецЕсли;
	
	Если КонецДня(КонецПериода) = КонецМесяца(КонецПериода) Тогда
		СписокВыборка.Добавить(Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеМесяца);
	КонецЕсли;
	
	Если КонецДня(КонецПериода) = КонецКвартала(КонецПериода) Тогда
		СписокВыборка.Добавить(Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеКвартала);
	КонецЕсли;
	
	Если СписокВыборка.НайтиПоЗначению(ПравилоОтбораАванса) = Неопределено Тогда
		ПравилоОтбораАванса = Перечисления.ПорядокРегистрацииСчетовФактурНаАванс.КромеЗачтенныхВТечениеДня;
	КонецЕсли;
	
КонецПроцедуры


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

&НаСервере
Процедура УстановитьЗаголовокНеиспользуемыеСчетаФактуры()

	Если НеиспользуемыеСчетаФактуры.Количество() = 0 Тогда
		ТекстЗаголовка = НСтр("ru = 'Неиспользуемые счета-фактуры'");
		Видимость = Ложь;
	Иначе
		ТекстЗаголовка = СтрШаблон(
			НСтр("ru = 'Неиспользуемые счета-фактуры (%1)'"), 
			НеиспользуемыеСчетаФактуры.Количество());
		Видимость = Истина;
	КонецЕсли;
	
	Элементы.ГруппаНеиспользуемыеСчетаФактуры.Заголовок = ТекстЗаголовка;
	Элементы.ГруппаНеиспользуемыеСчетаФактуры.ЦветТекстаЗаголовка = ЦветаСтиля.ПросроченныеДанныеЦвет;
	Элементы.ГруппаНеиспользуемыеСчетаФактуры.Видимость = Видимость;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьКоманд()
	
	ВидимостьКоманд = Ложь;
	
	Если РольДоступна("ДобавлениеИзменениеСчетовФактурВыданныхНаАванс") Или
		 РольДоступна("ПолныеПрава") Тогда
		 	ВидимостьКоманд = Истина;
	КонецЕсли;
	
	Элементы.ЗарегистрироватьСчетаФактурыВсе.Видимость = ВидимостьКоманд;
	Элементы.ПолученныеАвансыУстановитьСтавкуНДС.Видимость = ВидимостьКоманд;
	Элементы.ГруппаУстановитьРеквизиты.Видимость = ВидимостьКоманд;
	Элементы.ПолученныеАвансыВыбрать.Видимость = ВидимостьКоманд;
	Элементы.ПолученныеАвансыИсключить.Видимость = ВидимостьКоманд;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция УстановитьОтборСостояния(ТаблицаПолученныеАвансы, ОтборСостояние)

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

КонецФункции

&НаКлиенте
Процедура ОбновитьОтображениеИнформационнойНадписи()
	
	Элементы.ГруппаИнформация.Видимость = ПоказатьИнформационнуюНадпись;
	
КонецПроцедуры

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

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

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