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

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

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

	Параметры.Свойство("Основание", Заявка);
	Параметры.Свойство("БанковскийСчет", БанковскийСчет);
	
	Организация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Заявка, "Организация");
	
	ИнициализироватьКомпоновщик();
	УстановитьУсловноеОформление();
	УправлениеЭлементамиФормы();

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	СформироватьДеревоЗаявокКОплате(Неопределено);

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

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

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

&НаКлиенте
Процедура РежимФормированияСписанияПриИзменении(Элемент)

	ОчиститьСообщения();
	СформироватьДеревоЗаявокКОплате(Неопределено);

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

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

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

&НаКлиенте
Процедура ЛицевыеСчетаФизическихЛицНаОплатуОтметкаПриИзменении(Элемент)

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьФлажки(Команда)

	УстановитьЗначениеПодчиненнымСтрокам(ЛицевыеСчетаФизическихЛицНаОплату.ПолучитьЭлементы(), "Отметка", Истина);

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

&НаКлиенте
Процедура СнятьФлажки(Команда)

	УстановитьЗначениеПодчиненнымСтрокам(ЛицевыеСчетаФизическихЛицНаОплату.ПолучитьЭлементы(), "Отметка", Ложь);

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

&НаКлиенте
Процедура СоздатьДокументы(Команда)

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

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

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

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

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

&НаСервере
Процедура ИнициализироватьКомпоновщик()

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

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

&НаСервереБезКонтекста
Функция МакетДокументаСписания(ИмяМакета)

	Возврат Документы.СписаниеБезналичныхДенежныхСредств.ПолучитьМакет(ИмяМакета);

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

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

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

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

&НаКлиенте
Процедура СформироватьДеревоЗаявокКОплате(Результат, ДополнительныеПараметры = Неопределено) Экспорт

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

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

&НаСервере
Процедура ВывестиЗаявкиКОплате()

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

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

&НаСервере
Функция ПолучитьЛицевыеСчетаПоЗаявкам()

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

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

&НаКлиенте
Процедура РаскрытьУровниДерева()

	ЭлементыДерева = ЛицевыеСчетаФизическихЛицНаОплату.ПолучитьЭлементы();
	
	Для Каждого ЭлементДерева Из ЭлементыДерева Цикл
		Элементы.ЛицевыеСчетаФизическихЛицНаОплату.Развернуть(ЭлементДерева.ПолучитьИдентификатор());
	КонецЦикла;

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

&НаКлиенте
Процедура УстановитьЗначениеПодчиненнымСтрокам(ЭлементыДерева, Колонка, Значение)

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

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

&НаСервере
Процедура ПроверитьВыбранныеСтроки(Ошибка)

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

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

&НаСервере
Функция СозданиеДокументовНаСервере()

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

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

&НаСервереБезКонтекста
Функция ВыбранныеСтроки(ДеревоЗначений, МассивСтрок)

	Таблица = Новый ТаблицаЗначений;
	
	Для Каждого КолонкаДерева Из ДеревоЗначений.Колонки Цикл
		Таблица.Колонки.Добавить(КолонкаДерева.Имя, КолонкаДерева.ТипЗначения);
	КонецЦикла;
	
	Для Каждого СтрокаМассива Из МассивСтрок Цикл
		
		Если ЗначениеЗаполнено(СтрокаМассива.ФизическоеЛицо) Тогда
			НоваяСтрока = Таблица.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаМассива);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Таблица;

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

&НаСервереБезКонтекста
Функция ЗаполнениеДанныхПлатежныхДокументов(РежимФормированияСписания, ТаблицаДанных)

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

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

&НаСервереБезКонтекста
Функция ДанныеДляСозданияДокументов(Режим, ИсходныеДанные)

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

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

&НаСервереБезКонтекста
Функция ЗапускСозданияДокументов(МассивДокументов)

	ПараметрыЭкспортнойПроцедуры = Новый Структура("ДокументыКСозданию", МассивДокументов);
	ПараметрыЗадания = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
	
	НазваниеПроцедуры = "ДенежныеСредстваСервер.СоздатьПлатежи";
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(НазваниеПроцедуры, ПараметрыЭкспортнойПроцедуры, ПараметрыЗадания);
	
	Возврат ФоновоеЗадание;

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

&НаСервереБезКонтекста
Процедура ДозаполнитьСтрокиДерева(Дерево)

	Дерево.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("УникальныйИдентификатор"));
	Дерево.Колонки.Добавить("ПредставлениеБанкБанковскийСчет",
							Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250)));
	Дерево.Колонки.Добавить("ПредставлениеФизЛицоЛицевойСчет",
							Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(500)));
	
	ДополнитьСтрокуДерева(Дерево.Строки);

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

&НаСервереБезКонтекста
Процедура ДополнитьСтрокуДерева(СтрокиДерева)

	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		
		СтрокаДерева.ИдентификаторСтроки = Новый УникальныйИдентификатор;
		СтрокаДерева.ПредставлениеБанкБанковскийСчет = ПредставлениеРеестра(СтрокаДерева.Банк, СтрокаДерева.БанковскийСчет);
		СтрокаДерева.ПредставлениеФизЛицоЛицевойСчет = ПредставлениеСотрудника(СтрокаДерева.ФизическоеЛицо,
																				СтрокаДерева.ЛицевойСчет);
		
		ДополнитьСтрокуДерева(СтрокаДерева.Строки);
		
	КонецЦикла;

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

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеестра(Банк, БанковскийСчет)

	СтрокаСчета = ?(БанковскийСчет = ПредопределенноеЗначение("Справочник.БанковскиеСчетаКонтрагентов.ПустаяСсылка"),
					"<...>",
					БанковскийСчет);
	Возврат СтрШаблон("%1 / %2", Банк, СтрокаСчета);

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

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеСотрудника(ФизЛицо, ЛицевойСчет)

	Возврат СтрШаблон("%1 (%2)", ФизЛицо, ЛицевойСчет);

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

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

	СтрокиНаУдаление = ТаблицаДанных.НайтиСтроки(Отбор);
	
	Для Каждого ТекущаяСтрока Из СтрокиНаУдаление Цикл
		ТаблицаДанных.Удалить(ТекущаяСтрока);
	КонецЦикла;

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

&НаСервере
Процедура УправлениеЭлементамиФормы()

	ВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
	ВДополнительномПодменю = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
	
	Элементы.ЛицевыеСчетаФизическихЛицНаОплатуУстановитьФлажки.ПоложениеВКоманднойПанели = ВКоманднойПанели;
	Элементы.ЛицевыеСчетаФизическихЛицНаОплатуСнятьФлажки.ПоложениеВКоманднойПанели = ВКоманднойПанели;
	Элементы.ЛицевыеСчетаФизическихЛицНаОплатуОбновитьДерево.ПоложениеВКоманднойПанели = ВДополнительномПодменю;

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

&НаКлиенте
Процедура НастроитьОтображениеЭлементовФормы()
	
	Элементы.ЛицевыеСчетаФизическихЛицНаОплату.ЧередованиеЦветовСтрок = НЕ (РежимФормированияСписания = 1);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеФормированияДокументов(Результат, ДополнительныеПараметры) Экспорт

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

&НаКлиенте
Процедура РаспределитьСуммуСписания(СтрокаДерева)
	
	ПодчиненныеСтроки = СтрокаДерева.ПолучитьЭлементы();
	
	Если ПодчиненныеСтроки.Количество() = 0 Тогда
		
		Родитель = СтрокаДерева.ПолучитьРодителя();
		
		Если Родитель <> Неопределено Тогда
			
			Родитель.Сумма = СуммаСписанияПодчиненныхСтрок(Родитель.ПолучитьЭлементы());
			Родитель.Отметка = Истина;
			
		КонецЕсли;
		
	Иначе
		
		Распределить = СтрокаДерева.Сумма;
		
		Для Каждого ПодчиненнаяСтрока Из ПодчиненныеСтроки Цикл
			
			ПодчиненнаяСтрока.Сумма = Мин(ПодчиненнаяСтрока.СуммаОстаток, Распределить);
			
			Если ПодчиненнаяСтрока.Сумма > 0 Тогда
				ПодчиненнаяСтрока.Отметка = Истина;
			Иначе
				ПодчиненнаяСтрока.Отметка = Ложь;
			КонецЕсли;
			
			Распределить = Распределить - ПодчиненнаяСтрока.Сумма;
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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