Счет на оплату клиенту / Форма создания счетов на оплату / Модуль формы

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

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

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

	// ЭлектронноеВзаимодействие.ОбменСКонтрагентами
	ПараметрыПриСозданииНаСервере = ОбменСКонтрагентами.ПараметрыПриСозданииНаСервере_ФормаСписка();
	ПараметрыПриСозданииНаСервере.Форма = ЭтотОбъект;
	ПараметрыПриСозданииНаСервере.МестоРазмещенияКоманд = Элементы.ПодменюЭДО;
	ОбменСКонтрагентами.ПриСозданииНаСервере_ФормаСписка(ПараметрыПриСозданииНаСервере);
	// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// ЭлектронноеВзаимодействие.ОбменСКонтрагентами
	ОбменСКонтрагентамиКлиент.ПриОткрытии(ЭтотОбъект);
	// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Аннулировать(Команда)
	
	Если Не ОбщегоНазначенияУТКлиент.ПроверитьНаличиеВыделенныхВСпискеСтрок(Элементы.Список) Тогда
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = НСтр("ru='Выделенные в списке счетов на оплату будут аннулированы. Продолжить?'");
	Ответ = Неопределено;

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

&НаКлиенте
Процедура АннулироватьЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    Ответ = РезультатВопроса;
    
    Если Ответ = КодВозвратаДиалога.Нет Тогда
        Возврат;
    КонецЕсли;
    
    КоличествоОбработанных = УстановитьПризнакАннулированСервер(Элементы.Список.ВыделенныеСтроки);
    
    Если КоличествоОбработанных > 0 Тогда
        
        Элементы.Список.Обновить();
        
        ТекстСообщения = НСтр("ru='%КоличествоОбработанных% из %КоличествоВсего% выделенных в списке счетов на оплату аннулированы.'");
        ТекстСообщения = СтрЗаменить(ТекстСообщения,"%КоличествоОбработанных%", КоличествоОбработанных);
        ТекстСообщения = СтрЗаменить(ТекстСообщения,"%КоличествоВсего%",        Элементы.Список.ВыделенныеСтроки.Количество());
        ПоказатьОповещениеПользователя(НСтр("ru='Счета на оплату аннулированы'"),, ТекстСообщения, БиблиотекаКартинок.Информация32);
        
    Иначе
        
        ТекстСообщения = НСтр("ru='Не аннулирован ни один счет на оплату.'");
        ПоказатьОповещениеПользователя(НСтр("ru='Счета на оплату не аннулированы'"),, ТекстСообщения, БиблиотекаКартинок.Информация32);
        
    КонецЕсли;

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

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

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

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

// ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

&НаКлиенте
Процедура Подключаемый_ОбработчикОжиданияЭДО()
	
	ОбменСКонтрагентамиКлиент.ОбработчикОжиданияЭДО(ЭтотОбъект);
	
КонецПроцедуры

// Конец ЭлектронноеВзаимодействие.ОбменСКонтрагентами

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

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

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

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

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

	//

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

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаЭтапов.ДатаПлатежа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.MediumGray);

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаЭтаповВыбран.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаЭтаповПроцентПлатежа.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<залог за тару>'"));

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаЭтаповПроцентПлатежа.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<сверх заказа>'"));

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

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

&НаСервереБезКонтекста
Функция УстановитьПризнакАннулированСервер (Знач СчетаНаОплату)
	
	Возврат Документы.СчетНаОплатуКлиенту.УстановитьПризнакАннулирован(СчетаНаОплату);
	
КонецФункции

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

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

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

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

&НаСервереБезКонтекста
Функция СформироватьЗаголовокКолонкиСВалютой(ЗаголовокКолонки, Валюта)
	
	 Возврат ЗаголовокКолонки + " (" + Валюта + ")";
	
КонецФункции

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

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

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

&НаКлиенте
Процедура ПроверитьПроведенностьДокументовЗавершение(МассивДокументов, ДополнительныеПараметры) Экспорт
	
	УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
		"Обработка.ПечатьСчетовНаОплату",
		?(ПечатьИнвойсов, "ProformaInvoiceEn", "СчетНаОплату"),
		МассивДокументов,
		Неопределено,
		Новый Структура("Представление", НСтр("ru = 'Счет на оплату'")));
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция ТекстУпорядочить()
	
	Текст = "УПОРЯДОЧИТЬ ПО
	|	ДатаПлатежа,
	|	Порядок
	|;";
	
	Возврат Текст;
	
КонецФункции

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

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

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

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