#Область РаспределениеОвернайтов

Функция ВыполнитьЭтапРаспределенияВФоновомЗадании(Параметры, АдресВременногоХранилищаДляВозврата) экспорт

	Результат = ВыполнитьЭтапРаспределения(Параметры);
	ПоместитьВоВременноеХранилище(Результат, АдресВременногоХранилищаДляВозврата);

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

Функция ВыполнитьЭтапРаспределения(Параметры) экспорт

	Результат = Новый Структура("Отказ", Ложь);

	// Параметры функции
	РаспределятьРаннийКлиринг = Параметры.РаспределятьРаннийКлиринг;
	ДатаРасчета               = Параметры.ДатаРасчета;
	Заемщики                  = Параметры.Заемщики;
	УчитыватьНабранныеЗаймы   = Параметры.УчитыватьНабранныеЗаймы;
	Переменные                = Параметры.Переменные;
	Источник				  = Параметры.Источник;

	ТаблицаРаспределения = ПолучитьКолонкиДереваРаспределения();

	ПолучитьВремяКлирингов(ДатаРасчета, РаспределятьРаннийКлиринг, Переменные);

	ИнициироватьДатуВозврата(РаспределятьРаннийКлиринг, Заемщики, ДатаРасчета);

	ПараметрыЗаймов = ЗагрузитьИзРегистра(ДатаРасчета, РаспределятьРаннийКлиринг, Заемщики, Переменные, УчитыватьНабранныеЗаймы, Ложь, Источник);

	Если ПараметрыЗаймов <> Неопределено Тогда
		ЗаполнитьДеревоРаспределенияПараметрамиЗаймов(ТаблицаРаспределения, ПараметрыЗаймов, РаспределятьРаннийКлиринг);
	КонецЕсли;

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

		ЗаполнитьЗначенияСвойств(ПараметрыРаспределения, Параметры);

		ПараметрыРаспределения.Вставить("ТаблицаРаспределения", ТаблицаРаспределения);

		Результат = РаспределитьПоОстаткам(ПараметрыРаспределения);
	КонецЕсли;

	возврат Результат;

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

Процедура ПолучитьВремяКлирингов(пДатаРасчета, РаспределятьРаннийКлиринг, Переменные) Экспорт

	ВремяРаннегоКлиринга	= глДатьПсевдоКонстанту("ВремяРаннегоКлиринга", ?(ЭтоПустоеЗначение(пДатаРасчета), ТекущаяДата(), пДатаРасчета));

	// Если нам попалась вместе с временем установленная дата, тогда нам нужно выделить время из даты
	ВремяРаннегоКлиринга    = ?(Год(ВремяРаннегоКлиринга) <> 1, Дата(1,1,1, Час(ВремяРаннегоКлиринга), Минута(ВремяРаннегоКлиринга), Секунда(ВремяРаннегоКлиринга)) , ВремяРаннегоКлиринга);
	ВремяВечернегоКлиринга	= ПолучитьВремяВечернегоКлиринга_ДляДепозитария(, пДатаРасчета);

	Если ВремяРаннегоКлиринга = Неопределено
	  ИЛИ ВремяРаннегоКлиринга >= КонецДня(пДатаРасчета)
	  ИЛИ ВремяРаннегоКлиринга = НачалоДня(ВремяРаннегоКлиринга) Тогда
		Переменные.Вставить("ВремяРаннегоКлиринга",		Неопределено);
		Переменные.Вставить("ВремяВечернегоКлиринга",	Неопределено);
	Иначе
		Переменные.Вставить("ВремяРаннегоКлиринга",		НачалоДня(пДатаРасчета) + (ВремяРаннегоКлиринга		- НачалоДня(ВремяРаннегоКлиринга)));
		Переменные.Вставить("ВремяВечернегоКлиринга",	НачалоДня(пДатаРасчета) + (ВремяВечернегоКлиринга	- НачалоДня(ВремяВечернегоКлиринга)));
	КонецЕсли;

	// Ранний клиринг
	Если РаспределятьРаннийКлиринг И Переменные.Свойство("ВремяРаннегоКлиринга") И Переменные.ВремяРаннегоКлиринга <> Неопределено Тогда
		Переменные.ВремяЗайма		= '00010101' + ((Переменные.ВремяРаннегоКлиринга - НачалоДня(Переменные.ВремяРаннегоКлиринга)) - 1);
		Переменные.ВремяВозврата	= '00010101' + ((Переменные.ВремяРаннегоКлиринга - НачалоДня(Переменные.ВремяРаннегоКлиринга)) + 1);

	// Вечерний клиринг
	Иначе
		Переменные.ВремяЗайма		= ВремяВечернегоКлиринга;
		Переменные.ВремяВозврата	= ПолучитьВремяКлирингаПриВозвратеЗайма(пДатаРасчета);
	КонецЕсли;

	Переменные.Вставить("ДатаРасчета", пДатаРасчета);

	ВремяНабораОстатковРаннийКлиринг = глДатьПсевдоКонстантуПоУмолчанию("ВремяНабораОстатковРаннийКлиринг", ?(ЭтоПустоеЗначение(пДатаРасчета),ТекущаяДата(),пДатаРасчета), Дата(1,1,1,17,30,0));
	Переменные.ВремяНабораОстатковРаннийКлиринг = НачалоДня(пДатаРасчета) + (ВремяНабораОстатковРаннийКлиринг - НачалоДня(ВремяНабораОстатковРаннийКлиринг));

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

Функция ПолучитьВремяКлирингаПриВозвратеЗайма(ДатаРасчета, Знач СдвинутьНаКолСекунд = 0) Экспорт

	ДатаПолученияПсевдоКонстанты   = ?(ЗначениеЗаполнено(ДатаРасчета), ДатаРасчета, Неопределено);
	СдвинутьНаКоличествоСекунд = ?(ТипЗнч(СдвинутьНаКолСекунд) = Тип("Число"), СдвинутьНаКолСекунд, 0);
	ПсевдоКонстанта = глДатьПсевдоКонстанту("ВремяИсполненияОтложенныхСделок", ДатаПолученияПсевдоКонстанты, Неопределено);
	ПсевдоКонстанта = ?(ЗначениеЗаполнено(ПсевдоКонстанта) , (ПсевдоКонстанта - 3600), Дата(1,1,1, 8, 30, 0));
	Если СдвинутьНаКоличествоСекунд > 0 Тогда
		ПсевдоКонстанта = ПсевдоКонстанта + СдвинутьНаКоличествоСекунд;
	КонецЕсли;

	Возврат ПсевдоКонстанта;

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

Функция ЗагрузитьИзРегистра(ДатаРасчета, РаспределятьРаннийКлиринг, Заемщики, Переменные, УчитыватьНабранныеЗаймы, ДляПечатиЗаймов, пИсточник) Экспорт

	Результат = Неопределено;

	Если НЕ ЗначениеЗаполнено(ДатаРасчета) Тогда
		СообщитьЛог("Загрузка Параметров займов овернайт ЦБ - не указана дата расчета!", СтатусСообщения.Внимание, , пИсточник);
		Возврат Результат;
	КонецЕсли;

	ДанныеВремениИзменились = ДанныеВремениЗаймаИзменились(Переменные, ДатаРасчета);
	Если ДанныеВремениИзменились Тогда
		ПолучитьВремяКлирингов(ДатаРасчета, РаспределятьРаннийКлиринг, Переменные);
	КонецЕсли;

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

	Запрос = Новый Запрос;

	#Область ТекстЗапроса

	Если НЕ УчитыватьНабранныеЗаймы и НЕ ДляПечатиЗаймов Тогда

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

	Иначе

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

	КонецЕсли;

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

	Запрос.УстановитьПараметр("ДатаЗайма", ДатаРасчета + (Переменные.ВремяЗайма - НачалоДня(Переменные.ВремяЗайма)));
	Запрос.УстановитьПараметр("ПечатьЗаймов", ДляПечатиЗаймов);

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

		Если НеУстановленоВремяКлиринга Тогда
			Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИЛИ Запись.Период = НАЧАЛОПЕРИОДА(&Дата2, ЧАС)", "ИЛИ Запись.Период = &Дата2");
		КонецЕсли;
	КонецЕсли;

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

	ТКСБ_НаЗападномРынке = Справочники.ТорговоКлиринговыеСчетаБрокера.НайтиПоКоду("S0-USA              ");

	Для каждого стрТЧ из Заемщики Цикл

		Если РаспределятьРаннийКлиринг И стрТЧ.ТКСБ = ТКСБ_НаЗападномРынке Тогда
			//#Если Клиент Тогда
			//	Сообщить("На Западном рынке нет раннего клиринга.");
			//#КонецЕсли
			Продолжить;
		КонецЕсли;

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

	КонецЦикла;

	Запрос.УстановитьПараметр("ПриоритетыЗаемщиков",	табПриоритетов);
	Запрос.УстановитьПараметр("естьТЧзаемщики",			табПриоритетов.Количество() > 0);

	РезультатЗапроса = Запрос.Выполнить();

	Если НЕ ДляПечатиЗаймов Тогда

		Если РезультатЗапроса.Пустой() Тогда
			СообщитьЛог("Загрузка Параметров займов овернайт ЦБ - Отсутствуют Параметры займов овернайт ЦБ на " + Формат(Запрос.Параметры.Дата2, "ДЛФ=DT") + "!", СтатусСообщения.Внимание,, пИсточник);
		Иначе
			Результат = РезультатЗапроса.Выгрузить();
			СообщитьЛог("Загрузка Параметров займов овернайт ЦБ - Загружено " + Результат.Количество() + " записей за " + Формат(Запрос.Параметры.Дата2, "ДЛФ=DT") + "!", СтатусСообщения.Обычное,, пИсточник);
		КонецЕсли;
	Иначе

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

	КонецЕсли;

	возврат Результат;

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

Функция РаспределитьПоОстаткам(Параметры) Экспорт

	Результат = Новый Структура("Отказ", Ложь);

	ТаблицаРаспределения      = Параметры.ТаблицаРаспределения;
	ДатаРасчета               = Параметры.ДатаРасчета;
	РаспределятьРаннийКлиринг = Параметры.РаспределятьРаннийКлиринг;
	ПриоритетыСоглашений      = Параметры.ПриоритетыСоглашений;
	СоглашенияДляРасчета      = Параметры.СоглашенияДляРасчета;
	СоглашенияИсключения      = Параметры.СоглашенияИсключения;
	СущностиДляИсключения     = Параметры.СущностиДляИсключения;
	Заемщики                  = Параметры.Заемщики;
	БазоваяВалюта             = Параметры.БазоваяВалюта;
	Переменные                = Параметры.Переменные;
	ПорогАктивов              = Параметры.ПорогАктивов;
	ИнтерактивныйЗапуск       = Параметры.ИнтерактивныйЗапуск;
	МаксимальныйПриоритет     = Параметры.МаксимальныйПриоритет;
	СоглашениеЗаемщика        = Параметры.СоглашениеЗаемщика;
	УчитыватьНабранныеЗаймы   = Параметры.УчитыватьНабранныеЗаймы;
	ТипыБлокировокДляИсключения           = Параметры.ТипыБлокировокДляИсключения;
	МаксимальноеКоличествоСделокСКлиентом = Параметры.МаксимальноеКоличествоСделокСКлиентом;
	ИсключатьСоглашенияСВыводомПодОстаток = Параметры.ИсключатьСоглашенияСВыводомПодОстаток;

	Источник = СтрШаблон("%1.Распределение.%2", Параметры.Источник, ?(РаспределятьРаннийКлиринг, "РаннийКлиринг", "ВечернийКлиринг"));

	#Область Проверки

	Если НЕ ЗначениеЗаполнено(ДатаРасчета) Тогда
		СообщитьЛог("Распределение по остаткам - не указана дата расчета!", СтатусСообщения.Внимание, , Источник);
		Результат.Отказ = Истина;
		возврат Результат;
	КонецЕсли;

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

	ДанныеВремениИзменились = ДанныеВремениЗаймаИзменились(Переменные, ДатаРасчета);
	Если ДанныеВремениИзменились Тогда
		ПолучитьВремяКлирингов(ДатаРасчета, РаспределятьРаннийКлиринг, Переменные);
	КонецЕсли;

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

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

	#Область Подготовка

	КэшПроцентов = Новый Соответствие;
	КэшБирж = Неопределено;
	ЦветПодсветкиМинимума	= Новый Цвет(228, 255, 187);
	ЦветПодсветкиПоАктивам	= Новый Цвет(255, 222, 205);

	СообщитьЛог("Расчет овернайтов ЦБ - Начало Распределения по остаткам", СтатусСообщения.Информация, , Источник);

	Если ТаблицаРаспределения.Строки.Количество() = 0 Тогда
		СообщитьЛог("Распределение по остаткам - Таблица распределения не заполнена!", СтатусСообщения.Внимание, , Источник);
		//СтатистикаОкончаниеСобытия(ЭтотОбъект,"Распределить");
		Результат.Отказ = Истина;
		возврат Результат;
		//Возврат Ложь;
	КонецЕсли;

	Если ПриоритетыСоглашений.Количество() = 0 Тогда
		ПриоритетыСоглашений = ПолучитьПриоритетыИзРегистраСведений(ДатаРасчета, Источник);
		//ПриоритетыСоглашений.Загрузить(ПолучитьПриоритетыИзРегистраСведений(ДатаРасчета, Источник));
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

	РезультатПередачи = ПередатьТаблицыНаСервер(Запрос, ТаблицаРаспределения, ПриоритетыСоглашений);

	Если НЕ РезультатПередачи Тогда
		Результат.Отказ = Истина;
		возврат Результат;
	КонецЕсли;

	Если НЕ ЗначениеЗаполнено(БазоваяВалюта) Тогда
		СообщитьЛог("Распределение по остаткам - в системе не задана базовая валюта!", СтатусСообщения.Внимание, , Источник);
		Результат.Отказ = Истина;
		возврат Результат;
	КонецЕсли;

	КэшПроцентов.Очистить();

	// Хранилище всяких нужных переменных, чтобы кучу переменных модуля не держать
	ПараметрыОбработкиБуфера = Новый Структура;

	ПодготовитьОтчет(ПараметрыОбработкиБуфера, ТаблицаРаспределения, РаспределятьРаннийКлиринг, Переменные, Заемщики, СоглашениеЗаемщика, ДатаРасчета);

	Запрос.УстановитьПараметр("Период",					ДатаРасчета);
	Запрос.УстановитьПараметр("Период1",				орДобавитьРабочихДней(ДатаРасчета, 1));
	Запрос.УстановитьПараметр("ПериодКонецДня",			КонецДня(ДатаРасчета));
	Запрос.УстановитьПараметр("ПериодОстатков",			?(РаспределятьРаннийКлиринг, Новый Граница(Переменные.ВремяНабораОстатковРаннийКлиринг), Новый Граница(КонецДня(ДатаРасчета)))); // nskd_779747
	Запрос.УстановитьПараметр("МаксимальныйПриоритет",	МаксимальныйПриоритет);
	Запрос.УстановитьПараметр("БазоваяВалюта",			БазоваяВалюта);
	Запрос.УстановитьПараметр("Дата",					?(РаспределятьРаннийКлиринг, орДобавитьРабочихДней(ДатаРасчета, -1), ДатаРасчета));

	ПодготовитьБлокированныеСоглашения(Запрос, ТипыБлокировокДляИсключения);

	//добавим возможность исключать соглашения, у которых за период с ДатаРасчета по текущую дату был вывод под остаток
	ПодготовитьСоглашенияСВыводамиПодОстаток(Запрос, ДатаРасчета);

	// В распределении будут участвовать только те соглашения, которые подключены к услуге Займ овернайт ЦБ
	// Также у соглашений, которые подключены по субсчетам, есть особенность - что забираем только с этих субсчетов
	// Поэтому знать, в целом по соглашению подключена услуга или с точностью до субсчетов - надо.
	// За это будет отвечать флаг ПоСоглашению

	ДопУсловия = "ИСТИНА";

	Если ИсключатьСоглашенияСВыводомПодОстаток Тогда
		ДопУсловия = ДопУсловия + "
		|И ПредоставляемыеУслугиСрезПоследних.Соглашение не В (выбрать соглашение из СоглашенияСВыводамиПодОстаток)";
	КонецЕсли;

	Если СоглашенияДляРасчета.Количество() > 0 Тогда

		ДопУсловия = ДопУсловия + "
		|И ПредоставляемыеУслугиСрезПоследних.Соглашение В(&СоглашенияДляРасчета)";

		Запрос.УстановитьПараметр("СоглашенияДляРасчета", СоглашенияДляРасчета.ВыгрузитьКолонку("Соглашение"));

	КонецЕсли;

	Если СоглашенияИсключения.Количество() > 0 Тогда

		ДопУсловия = ДопУсловия + "
		|И НЕ(ПредоставляемыеУслугиСрезПоследних.Соглашение В(&СоглашенияИсключения))";

		Запрос.УстановитьПараметр("СоглашенияИсключения", СоглашенияИсключения.ВыгрузитьКолонку("Соглашение"));

	КонецЕсли;

	// Довольно хитрый отбор по исключениям.

	МасСущнКл	= Новый Массив;
	МасВидыСогл = Новый Массив;

	Для каждого СтрСущности Из СущностиДляИсключения Цикл

		Если НЕ СтрСущности.Исключать Тогда
			Продолжить;
		КонецЕсли;

		Если СтрСущности.Сущность.Родитель = Справочники.Сущности.Клиенты Тогда
			МасСущнКл.Добавить(СтрСущности.Сущность);
		КонецЕсли;

		Если СтрСущности.Сущность.Родитель = Справочники.Сущности.БрокерскоеОбслуживание Тогда
			МасВидыСогл.Добавить(СтрСущности.Сущность);
		КонецЕсли;

		Если СтрСущности.Сущность = Справочники.ВидыДеятельности.ДоверительноеУправление Тогда
			ДопУсловия = ДопУсловия + "
			|И НЕ Соглашения.ВРамкахВидаДеятельностиСубъекта В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.ВидыДеятельности.ДоверительноеУправление))";
		КонецЕсли;

		Если СтрСущности.Сущность = Справочники.ВидыДеятельности.КлиентУК Тогда
			ДопУсловия = ДопУсловия + "
			|И НЕ Соглашения.ВРамкахВидаДеятельностиСубъекта В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.ВидыДеятельности.КлиентУК))";
		КонецЕсли;

		Если СтрСущности.Сущность = Справочники.ВидыДеятельности.ДУГруппа Тогда
			ДопУсловия = ДопУсловия + "
			|И НЕ Соглашения.ВРамкахВидаДеятельностиСубъекта В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.ВидыДеятельности.ДУГруппа))";
		КонецЕсли;

		Если СтрСущности.Сущность = Справочники.ВидыДеятельности.Субброкер Тогда
			ДопУсловия = ДопУсловия + "
			|И НЕ Соглашения.ВРамкахВидаДеятельностиСубъекта В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.ВидыДеятельности.Субброкер))";
		КонецЕсли;

	КонецЦикла;

	Если МасСущнКл.Количество() > 0 Тогда
		ДопУсловия = ДопУсловия + "
		|И НЕ(Соглашения.Субъект.Сущность В (&СущностиСубъекта))";
		Запрос.УстановитьПараметр("СущностиСубъекта", МасСущнКл);
	КонецЕсли;

	Если МасВидыСогл.Количество() > 0 Тогда
		ДопУсловия = ДопУсловия + "
		|И НЕ(Соглашения.Сущность в (&СущностиСоглашений))";
		Запрос.УстановитьПараметр("СущностиСоглашений", МасВидыСогл);
	КонецЕсли;

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

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

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

	Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ДопУсловия", ДопУсловия);

	//#Если Клиент Тогда
	//	Состояние("Получение соглашений, подключенных к услуге...");
	//#КонецЕсли
	СообщитьЛог("Получение соглашений, подключенных к услуге...", , , Источник);
	Запрос.Выполнить();

	// Получим общий список клиентов: у кого подключена по соглашению в целом, будет идти субсчет основной
	// (с него же и будем забирать ЦБ, даже если фактически ЦБ на другом субсчете),
	// а для тех, у кого по субсчетам - только эти субсчета в явном виде.

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

	//#Если Клиент Тогда
	//	Состояние("Получение соглашений, подключенных к услуге по субсчетам...");
	//#КонецЕсли
	СообщитьЛог("Получение соглашений, подключенных к услуге по субсчетам...", , , Источник);
	Запрос.Выполнить();

	// У каждого соглашения, подключенного к услуге, может быть задан особый список ТКСБ, с которых
	// у соглашения можно забирать ЦБ. Если он не задан, то нужно использовать список ТКСБ по умолчанию.
	// В первом запросе составляем ВТ соглашений с явным заданием ТКСБ.
	// Во втором запросе собираем общий список: к соглашеним с явным заданием ТКСБ добавляем остальные соглашения
	// со списком ТКСБ по умолчанию.

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ЗаписиСоглашения.ТКСБ,
	|	ЗаписиСоглашения.Соглашение КАК Соглашение
	|ПОМЕСТИТЬ ЯвныеТКСБСоглашений
	|ИЗ
	|	РегистрСведений.ТКСБДляЗаймовОвернайтЦБКлиентов.СрезПоследних(&Период, ) КАК ЗаписиСоглашения
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Соглашения КАК Соглашения
	|		ПО ЗаписиСоглашения.Соглашение = Соглашения.Соглашение
	|ГДЕ
	|	ЗаписиСоглашения.Использовать
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЯвныеТКСБСоглашений.Соглашение КАК Соглашение,
	|	ЯвныеТКСБСоглашений.ТКСБ
	|ПОМЕСТИТЬ ТКСБСоглашений
	|ИЗ
	|	ЯвныеТКСБСоглашений КАК ЯвныеТКСБСоглашений
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Соглашения.Соглашение,
	|	ЗаписиПоУмолчанию.ТКСБ
	|ИЗ
	|	Соглашения КАК Соглашения,
	|	РегистрСведений.ТКСБДляЗаймовОвернайтЦБ.СрезПоследних(&Период, ) КАК ЗаписиПоУмолчанию
	|ГДЕ
	|	ЗаписиПоУмолчанию.Использовать
	|	И (НЕ Соглашения.Соглашение В
	|				(ВЫБРАТЬ
	|					ЯвныеТКСБСоглашений.Соглашение
	|				ИЗ
	|					ЯвныеТКСБСоглашений КАК ЯвныеТКСБСоглашений))
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ЯвныеТКСБСоглашений";

	//#Если Клиент Тогда
	//	Состояние("Получение ТКСБ соглашений...");
	//#КонецЕсли
	СообщитьЛог("Получение ТКСБ соглашений...", , , Источник);
	Запрос.Выполнить();

	// Получим общие точные остатки ЦБ у соглашений без более хитрых ограничений.
	// Эта табличка пригодится нам для подсчета общего числа ЦБ у соглашения,
	// и плюс для итоговой временной таблицы со всеми данными, с которой будем подкачивать строки для распределения

	ПодготовитьКлиентовПрайма(Запрос);

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

	|ВЫБРАТЬ
	//|		"""",//УчетЦБЗабалансовыйОстатки.Инструмент КАК Инструмент,
	|		ВЫБОР
	|		КОГДА УчетЦБЗабалансовыйОстатки.ЦБ ССЫЛКА Справочник.Акции
	|			ТОГДА Акции.Инструмент
	|		КОГДА УчетЦБЗабалансовыйОстатки.ЦБ ССЫЛКА Справочник.Облигации
	|			ТОГДА Облигации.Инструмент
	|		КОГДА УчетЦБЗабалансовыйОстатки.ЦБ ССЫЛКА Справочник.Паи
	|			ТОГДА Паи.Инструмент
	|		КОНЕЦ  КАК Инструмент,

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

	//#Если Клиент Тогда
	//	Состояние("Получение точных остатков ЦБ у соглашений...");
	//#КонецЕсли
	СообщитьЛог("Получение точных остатков ЦБ у соглашений...", , , Источник);
	Запрос.Выполнить();

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВТ_ОстаткиТочные.Инструмент,
	|	ВТ_ОстаткиТочные.Соглашение КАК Соглашение,
	|	ВТ_ОстаткиТочные.Счет,
	|	ВТ_ОстаткиТочные.Прайм,
	|	ВТ_ОстаткиТочные.ЦБ,
	|	ВТ_ОстаткиТочные.Депозитарий,
	|	ВТ_ОстаткиТочные.ТорговоКлиринговыйСчет,
	|	ВТ_ОстаткиТочные.ТраекторияХранения,
	|	ВТ_ОстаткиТочные.ТипРазделаСчетаДепо,
	|	ВТ_ОстаткиТочные.СчетДепо,
	|	ВТ_ОстаткиТочные.Количество
	|ПОМЕСТИТЬ ОстаткиТочныеФильтрованные
	|ИЗ
	|	ОстаткиТочные КАК ВТ_ОстаткиТочные
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ КРаспределению КАК КРаспределению
	|		ПО ВТ_ОстаткиТочные.ЦБ = КРаспределению.ЦБ
	|			И ВТ_ОстаткиТочные.ТорговоКлиринговыйСчет = КРаспределению.ТКСБ
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение";

	//#Если Клиент Тогда
	//	Состояние("Фильтруем точные остатки...");
	//#КонецЕсли
	СообщитьЛог("Фильтруем точные остатки...", , , Источник);
	Запрос.Выполнить();

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВТ_ОстаткиТочные.Инструмент,
	|	ВТ_ОстаткиТочные.Соглашение КАК Соглашение,
	|	ВТ_ОстаткиТочные.Счет,
	|	ВТ_ОстаткиТочные.Прайм,
	|	ВТ_ОстаткиТочные.ЦБ,
	|	ВТ_ОстаткиТочные.Депозитарий,
	|	ВТ_ОстаткиТочные.ТорговоКлиринговыйСчет,
	|	ВТ_ОстаткиТочные.ТраекторияХранения,
	|	ВТ_ОстаткиТочные.ТипРазделаСчетаДепо,
	|	ВТ_ОстаткиТочные.СчетДепо,
	|	ВТ_ОстаткиТочные.Количество
	|ПОМЕСТИТЬ ОстаткиТочныеФильтрованныеИтог
	|ИЗ
	|	ОстаткиТочныеФильтрованные КАК ВТ_ОстаткиТочные
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТКСБСоглашений КАК ТКСБСоглашений
	|		ПО ВТ_ОстаткиТочные.Соглашение = ТКСБСоглашений.Соглашение
	|			И ВТ_ОстаткиТочные.ТорговоКлиринговыйСчет = ТКСБСоглашений.ТКСБ
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение";

	//#Если Клиент Тогда
	//	Состояние("Фильтруем точные остатки итог...");
	//#КонецЕсли
	СообщитьЛог("Фильтруем точные остатки итог...", , , Источник);
	Запрос.Выполнить();

	// Общие остатки ЦБ у соглашений сворачиваем

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

	//#Если Клиент Тогда
	//	Состояние("Свертка остатков ЦБ по соглашениям в целом...");
	//#КонецЕсли
	СообщитьЛог("Свертка остатков ЦБ по соглашениям в целом...", , , Источник);
	Запрос.Выполнить();

	// Итоговая ВТ для подкачки
	// 1. Во вложенном запросе джойним с таблицей Тарифы, чтобы, во-первых, свернуть остатки по СубсчетОсновной,
	// так как именно с него будем забирать ЦБ, а у тех, у кого по субсчетам - чтоб отобрать именно по этим субсчетам.
	// 2. Точный отбор: по комбинации ЦБ + ТКСБ (КРаспределению)
	// 3. Точный отбор: по комбинации Соглашение + ТКСБ (ТКСБСоглашений)
	// 4. Добавляем справочное поле ОстатокУСоглашения - оно будет использоваться только 1 раз,
	//		как только встретится первый раз по ЦБ и Соглашению (по нему будем отслеживать динамически, чтоб остаток
	//		ЦБ у соглашения не убежал в 0)
	// 5. Добавляем приоритеты для сортировки по оным
	// 6. Из тарифного плана клиента по инструменту вытаскиваем тариф

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

	//#Если Клиент Тогда
	//	Состояние("Получение остатков к распределению с учетом всех ограничений...");
	//#КонецЕсли
	СообщитьЛог("Получение остатков к распределению с учетом всех ограничений...", , , Источник);
	Запрос.Выполнить();

	СообщитьЛог("Оценка ЦБ по Временной таблице", , , Источник);
	орОценитьЦБПоВремТаблице(?(РаспределятьРаннийКлиринг, орДобавитьРабочихДней(ДатаРасчета, -1), ДатаРасчета), Справочники.ВариантыОценкиАктивов.РасчетПОКлиентов, Запрос.МенеджерВременныхТаблиц); // nsk_284072 Ранний клиринг на ММВБ

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

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

	Активы.Свернуть("Соглашение", "СуммаОстаток");
	СообщитьЛог("Запомним активы соглашений.", , , Источник);
	// Запомним активы этих соглашений, чтоб использовать их в следующий раз
	Для каждого СтрокаАктивов Из Активы Цикл
		ПараметрыОбработкиБуфера.АктивыСоглашений[СтрокаАктивов.Соглашение] = СтрокаАктивов.СуммаОстаток;
	КонецЦикла;

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

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

	#Область Распределение

	// В этой табличке будем отслеживать плавное убывание ЦБ у соглашения при использовании его ЦБ (по субсчетам
	// и прочим измерениям)

	ОстаткиУСоглашений = Новый ТаблицаЗначений;
	ОстаткиУСоглашений.Колонки.Добавить("Соглашение",	Новый ОписаниеТипов("СправочникСсылка.Соглашения"));
	ОстаткиУСоглашений.Колонки.Добавить("ЦБ",			Новый ОписаниеТипов("СправочникСсылка.Акции, СправочникСсылка.Облигации, СправочникСсылка.Паи"));
	ОстаткиУСоглашений.Колонки.Добавить("Количество",	Новый ОписаниеТипов("Число"));

	ОстаткиУСоглашений.Индексы.Добавить("Соглашение, ЦБ");

	Буфер = Неопределено;

	//СоглашенияБезАктивов		= Новый Соответствие; // Складываем соглашения, у которых еще не посчитали активы
	//СтрокиБезАктивов		= Новый Массив; // Складываем строки, у которых еще не не посчитали активы

	//ПараметрыОбработкиБуфера.Вставить("СоглашенияБезАктивов",	СоглашенияБезАктивов);
	ПараметрыОбработкиБуфера.Вставить("ОстаткиУСоглашений",		ОстаткиУСоглашений);
	//ПараметрыОбработкиБуфера.Вставить("ЧастьГода",				?(РаспределятьРаннийКлиринг, 0, ОпределитьЧастьГода(ДатаРасчета, орДобавитьРабочихДней(ДатаРасчета, 1)))); // nsk_284072 Ранний клиринг на ММВБ

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

		Если НЕ СтрокаКРаспределению.Исп или СтрокаКРаспределению.Количество = 0 Тогда
			Продолжить;
		КонецЕсли;
		пБиржа = ДатьБиржуСпрКэш(СтрокаКРаспределению.ТКСБ, КэшБирж);

		Если тмпДатаВозврата <> СтрокаКРаспределению.Датавозврата Тогда
			ПараметрыОбработкиБуфера.Вставить("ЧастьГода",				?(РаспределятьРаннийКлиринг, 0, ОпределитьЧастьГода(ДатаРасчета, СтрокаКРаспределению.Датавозврата))); // nsk_284072 Ранний клиринг на ММВБ
			тмпДатаВозврата = СтрокаКРаспределению.Датавозврата
		КонецЕсли;
		// 365 843
		равенствоКлючу = Истина;
		Для каждого ключИЗначение из ключи Цикл
			Если НЕ СтрокаКРаспределению[ключИЗначение.Ключ] = ключИЗначение.Значение Тогда
				равенствоКлючу = Ложь;
				прервать;
			КонецЕсли;
		КонецЦикла;
		Если равенствоКлючу = Ложь Тогда
			ЗаполнитьЗначенияСвойств(ключи, СтрокаКРаспределению);
		КонецЕсли;

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

		Если НЕ равенствоКлючу Тогда
			СтруктураПределРЕПО = РегистрыСведений.ПараметрыЦБ.ПолучитьПоследнее(ДатаРасчета, Новый Структура("Биржа, ЦБ, Параметр", пБиржа, СтрокаКРаспределению.ЦБ, ПланыВидовХарактеристик.ПараметрыЦБ.ПределРЕПО));

			ПределРЕПО = СтруктураПределРЕПО.Значение;

			Если НЕ ЗначениеЗаполнено(ПределРЕПО) Тогда
				ПределРЕПО = 0;
			КонецЕсли;
		КонецЕсли;

		// Режим "Безлимит": количество не указано, значит, набираем по-максимуму
		// без проверки активов
		Безлимит = (СтрокаКРаспределению.Количество = 0);
		ПараметрыОбработкиБуфера.Вставить("Безлимит", Безлимит);

		ПараметрыОбработкиБуфера.Вставить("ПределРЕПО", ПределРЕПО);

		//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
		//Если ФормироватьОтчетПоРаспределению Тогда

			ВысотаНачала = ПараметрыОбработкиБуфера.Отчет.ВысотаТаблицы;

			ПараметрыОбработкиБуфера.ОбластьШапка.Параметры.Заполнить(СтрокаКРаспределению);

			Если Безлимит Тогда
				ПараметрыОбработкиБуфера.ОбластьШапка.Параметры.Количество = "Максимум";
			КонецЕсли;

			ПараметрыОбработкиБуфера.ОбластьШапка.Параметры.ПределРЕПО = ПределРЕПО;

			ПараметрыОбработкиБуфера.Отчет.Вывести(ПараметрыОбработкиБуфера.ОбластьШапка, 1);

		//КонецЕсли;
		//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

		СтрокаКРаспределению.Строки.Очистить();

		ПараметрыОбработкиБуфера.Вставить("ЦБ", СтрокаКРаспределению.ЦБ);

		ПараметрыОбработкиБуфера.Вставить("СтрокаДерева", СтрокаКРаспределению);

		Запрос.УстановитьПараметр("ЦБ",		СтрокаКРаспределению.ЦБ);
		Запрос.УстановитьПараметр("ТКСБ",	СтрокаКРаспределению.ТКСБ);

		ПараметрыОбработкиБуфера.Вставить("Остаток", СтрокаКРаспределению.Количество);

		// 365 843
		Если НЕ равенствоКлючу Тогда
			Остатки = Запрос.Выполнить().Выгрузить();
			Остатки.Индексы.Добавить("Соглашение, Субсчет, Прайм, ТраекторияХранения, ТипРазделаСчетаДепо, СчетДепо");
			ПараметрыОбработкиБуфера.Вставить("Остатки",	Остатки);
		КонецЕсли;

		Если Буфер = Неопределено Тогда
			Буфер = Остатки.СкопироватьКолонки();
			ПараметрыОбработкиБуфера.Вставить("Буфер", Буфер);
		КонецЕсли;

		// Проходим и по-разному обрабатываем строки.
		// Вначале идут строки с приоритетом. У этих не смотрим

		СПриоритетом	= Истина;
		БезПриоритета	= Ложь;

		ПараметрыОбработкиБуфера.Вставить("Закрыли", Ложь);
		// 365 843
		ПараметрыОбработкиБуфера.Вставить("МассивКУ", Новый Массив());

		Для каждого СтрокаОстатков Из Остатки Цикл

			Если текЗаемщик = СтрокаОстатков.Соглашение Тогда
				Продолжить;
			КонецЕсли;

			Если СПриоритетом Тогда

				Если СтрокаОстатков.Приоритет = МаксимальныйПриоритет Тогда

					// Строки с приоритетом закончились, отрабатываем этот буфер

					ОбработатьБуфер(ПараметрыОбработкиБуфера, СПриоритетом, МаксимальноеКоличествоСделокСКлиентом, ЦветПодсветкиМинимума, ЦветПодсветкиПоАктивам, ПорогАктивов, РаспределятьРаннийКлиринг, МаксимальныйПриоритет, КэшПроцентов, ДатаРасчета, Источник);

					Если ПараметрыОбработкиБуфера.Закрыли Тогда
						Прервать;
					КонецЕсли;

					СПриоритетом	= Ложь;
					БезПриоритета	= Истина;

					//СоглашенияБезАктивов.Очистить();

				КонецЕсли;

			КонецЕсли;

			ДобавленнаяСтрока = Буфер.Добавить();

			ЗаполнитьЗначенияСвойств(ДобавленнаяСтрока, СтрокаОстатков);

			Если БезПриоритета И НЕ Безлимит Тогда

				АктивыСоглашения = АктивыСоглашений[СтрокаОстатков.Соглашение];

				//Если АктивыСоглашения = Неопределено Тогда

					//СоглашенияБезАктивов[СтрокаОстатков.Соглашение] = Истина;

					//Если СоглашенияБезАктивов.Количество() = РазмерПакетаПолученияОстатков Тогда
					//
					//	ОбработатьБуфер(ПараметрыОбработкиБуфера, СПриоритетом);
					//
					//	Если ПараметрыОбработкиБуфера.Закрыли Тогда
					//		Прервать;
					//	КонецЕсли;
					//
					//КонецЕсли;

				//КонецЕсли;

			КонецЕсли;

		КонецЦикла;

		ОбработатьБуфер(ПараметрыОбработкиБуфера, СПриоритетом, МаксимальноеКоличествоСделокСКлиентом, ЦветПодсветкиМинимума, ЦветПодсветкиПоАктивам, ПорогАктивов, РаспределятьРаннийКлиринг, МаксимальныйПриоритет, КэшПроцентов, ДатаРасчета, Источник);

		// 365 843
		Для Каждого стрКУ из ПараметрыОбработкиБуфера.МассивКУ Цикл
			ПараметрыОбработкиБуфера.Остатки.Удалить(стрКУ);
		КонецЦикла;

		СтрокаКРаспределению.НезакрытыйОстаток = ПараметрыОбработкиБуфера.Остаток;

		//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
		//Если ФормироватьОтчетПоРаспределению Тогда

			Распределено = СтрокаКРаспределению.Строки.Итог("Количество");

			ПараметрыОбработкиБуфера.Отчет.Область(ВысотаНачала + 6, 2, ВысотаНачала + 6, 2).Текст = Распределено;
			ПараметрыОбработкиБуфера.Отчет.Область(ВысотаНачала + 7, 2, ВысотаНачала + 7, 2).Текст = ПараметрыОбработкиБуфера.Остаток;

		//КонецЕсли;
		//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

	КонецЦикла;

	Запрос.МенеджерВременныхТаблиц.Закрыть();

	Если ИнтерактивныйЗапуск Тогда
		//СформированныеОтчеты = Новый Массив;
		СформированныеОтчеты = Новый ТаблицаЗначений;
		СформированныеОтчеты.Колонки.Добавить("ТабличныйДокумент");
		СформированныеОтчеты.Колонки.Добавить("Заемщик");
	КонецЕсли;

	Для каждого ключИЗначение из ПараметрыОбработкиБуфера.СоответствиеОтчетов Цикл

		Если НЕ ключИЗначение.Значение.естьДанные Тогда
			Продолжить;
		КонецЕсли;

		ключИЗначение.Значение.Отчет.ЗакончитьАвтогруппировкуСтрок();
		Если ИнтерактивныйЗапуск Тогда
			//ключИЗначение.Значение.Отчет.Показать("Расчет овернайтов ЦБ " + Формат(ДатаРасчета, "ДФ=dd.MM.yy") + " по заемщику: " + СокрЛП(ключИЗначение.Ключ));
			//СформированныеОтчеты.Добавить(ключИЗначение.Значение.Отчет);
			СтрокаОтчетов = СформированныеОтчеты.Добавить();
			СтрокаОтчетов.ТабличныйДокумент = ключИЗначение.Значение.Отчет;
			СтрокаОтчетов.Заемщик           = ключИЗначение.Ключ;
		КонецЕсли;

		КаталогПротоколов = Константы.ИмяКаталогаПротокола.Получить();
		Если ПустаяСтрока(КаталогПротоколов) Тогда
			КаталогПротоколов = КаталогВременныхФайлов();
		КонецЕсли;
		ПутьКФайлу = ОпределитьКаталог(КаталогПротоколов, Параметры.Источник + "\" + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd")) + "Распределение " + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd.hh-mm-ss") + " " + получитьИмяЗаемщикаДляЗаписи(ключИЗначение.Ключ) + ?(РаспределятьРаннийКлиринг, "-early", "") + ".mxl";
		ключИЗначение.Значение.Отчет.Записать(ПутьКФайлу);

	КонецЦикла;

	СообщитьЛог("Расчет овернайтов ЦБ - Окончание Распределения по остаткам", СтатусСообщения.Информация, , Источник);

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

	Результат.Вставить("хзТаблицаРаспределения", ХранилищеЗначения(ТаблицаРаспределения));  // помещаем в хз чтобы возвращать из фонового задания в упакованном виде

	Если ИнтерактивныйЗапуск Тогда
		Результат.Вставить("СформированныеОтчеты", СформированныеОтчеты);
	КонецЕсли;

	возврат Результат;

КонецФункции // РаспределитьПоОстаткам

Функция ХранилищеЗначения(Значение)

	Возврат Новый ХранилищеЗначения(Значение, Новый СжатиеДанных(9));

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

Функция ПолучитьПриоритетыИзРегистраСведений(пДатаРасчета, пИсточник) Экспорт

	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ПриоритетСоглашений.Соглашение КАК Соглашение,
	|	ПриоритетСоглашений.Приоритет КАК Приоритет
	|ИЗ
	|	(ВЫБРАТЬ
	|		МАКСИМУМ(ПриоритетСоглашенийДляЗаймовОвернайт.ДатаУстановки) КАК ДатаУстановки
	|	ИЗ
	|		РегистрСведений.ПриоритетСоглашенийДляЗаймовОвернайт КАК ПриоритетСоглашенийДляЗаймовОвернайт
	|	ГДЕ
	|		ПриоритетСоглашенийДляЗаймовОвернайт.ДатаУстановки <= &ДатаРасчета) КАК ВложенныйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетСоглашенийДляЗаймовОвернайт КАК ПриоритетСоглашений
	|		ПО ВложенныйЗапрос.ДатаУстановки = ПриоритетСоглашений.ДатаУстановки
	|
	|УПОРЯДОЧИТЬ ПО
	|	Приоритет");

	Запрос.УстановитьПараметр("ДатаРасчета", пДатаРасчета);

	Результат = Запрос.Выполнить().Выгрузить();
	Если Результат.Количество() = 0 Тогда
		СообщитьЛог("Получение приоритетов соглашений из регистра сведений - Отсутствуют Приоритеты соглашений для займов овернайт на " + Формат(пДатаРасчета, "ДФ=dd.MM.yyyy") + "!", СтатусСообщения.Внимание,, пИсточник);
	Иначе
		СообщитьЛог("Получение приоритетов соглашений из регистра сведений - Загружено " + Результат.Количество() + " записей по состоянию на " + Формат(пДатаРасчета, "ДФ=dd.MM.yyyy") + "!", СтатусСообщения.Обычное, , пИсточник);
	КонецЕсли;

	Возврат Результат;

КонецФункции // ПолучитьПриоритетыИзРегистраСведений

// Передает таблицы с приоритетами соглашений и количествами к распределению на сервер
// (в менеджер временных таблиц)
//
Функция ПередатьТаблицыНаСервер(Запрос, ТаблицаРаспределения, ПриоритетыСоглашений)

	ТаблицаОтмеченных = Новый ТаблицаЗначений;

	ТаблицаОтмеченных.Колонки.Добавить("ЦБ",			Новый ОписаниеТипов("СправочникСсылка.Акции, СправочникСсылка.Облигации, СправочникСсылка.Паи"));
	ТаблицаОтмеченных.Колонки.Добавить("ТКСБ",			Новый ОписаниеТипов("СправочникСсылка.ТорговоКлиринговыеСчетаБрокера"));
	ТаблицаОтмеченных.Колонки.Добавить("Количество",	Новый ОписаниеТипов("Число"));
	// 365 843
	ТаблицаОтмеченных.Индексы.Добавить("ЦБ, ТКСБ");

	Для каждого СтрокаРаспределения Из ТаблицаРаспределения.Строки Цикл

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

	КонецЦикла;

	Если ТаблицаОтмеченных.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;

	// Приоритеты нужны, чтоб сортировать строки: те соглашения, у которых есть приоритет,
	// будут идти впереди остальных

	Запрос.Текст =
	"ВЫБРАТЬ
	|	*
	|ПОМЕСТИТЬ
	|	Приоритеты
	|ИЗ &Приоритеты КАК Приоритеты";

	Запрос.УстановитьПараметр("Приоритеты", ПриоритетыСоглашений);

	//#Если Клиент Тогда
	//	Состояние("Передача приоритетов соглашений...");
	//#КонецЕсли

	Запрос.Выполнить();

	// Также должны знать, какие ЦБ на каких ТКСБ распределять.
	// Таблица ЦБ - чтобы иметь общий список ЦБ без учета ТКСБ (это надо для получения общего остатка ЦБ у соглашения)

	Запрос.Текст =
	"ВЫБРАТЬ
	|	КРаспределению.ЦБ КАК ЦБ,
	|	КРаспределению.ТКСБ КАК ТКСБ,
	|	КРаспределению.Количество КАК Количество
	|ПОМЕСТИТЬ КРаспределению
	|ИЗ
	|	&КРаспределению КАК КРаспределению
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	ЦБ,
	|	ТКСБ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	КРаспределению.ЦБ КАК ЦБ
	|ПОМЕСТИТЬ ЦБ
	|ИЗ
	|	КРаспределению КАК КРаспределению
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	ЦБ";

	Запрос.УстановитьПараметр("КРаспределению", ТаблицаОтмеченных);

	//#Если Клиент Тогда
	//	Состояние("Передача таблицы к распределению...");
	//#КонецЕсли

	Запрос.Выполнить();

	Возврат Истина;

КонецФункции // ПередатьТаблицыНаСервер

Процедура ПодготовитьОтчет(Параметры, деревоРаспределения = Неопределено, РаспределятьРаннийКлиринг, Переменные, Заемщики, СоглашениеЗаемщика, ДатаРасчета)

	Макет = Обработки.РасчетКредитовОвернайтЦБ.ПолучитьМакет("Распределение");

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

	соответствиеОтчетов = Новый Соответствие();

	Для каждого текЗаемщик из массивЗаемщиков Цикл

		Отчет = Новый ТабличныйДокумент;

		Отчет.ОтображатьСетку		= Ложь;
		Отчет.ОтображатьЗаголовки	= Ложь;

		ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

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

		ОбластьЗаголовок.Параметры.Время		= ТекущаяДата();
		ОбластьЗаголовок.Параметры.Автор	= ПараметрыСеанса.Пользователь;
		ОбластьЗаголовок.Параметры.Заемщик = текЗаемщик;

		Отчет.Вывести(ОбластьЗаголовок);
		Отчет.НачатьАвтогруппировкуСтрок();

		соответствиеОтчетов[текЗаемщик] = Новый Структура("Отчет, естьДанные", Отчет, Ложь);

	КонецЦикла;

	Параметры.Вставить("СоответствиеОтчетов", соответствиеОтчетов);

	Параметры.Вставить("ОбластьШапка",	Макет.ПолучитьОбласть("Шапка"));
	Параметры.Вставить("ОбластьСтрока", Макет.ПолучитьОбласть("Строка"));

КонецПроцедуры // ПодготовитьОтчет

Процедура ПодготовитьСоглашенияСВыводамиПодОстаток(Запрос, ДатаРасчета)

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДвижениеДС.Соглашение КАК Соглашение
	|ПОМЕСТИТЬ СоглашенияСВыводамиПодОстаток
	|ИЗ
	|	Документ.ДвижениеДС КАК ДвижениеДС
	|ГДЕ
	|	ДвижениеДС.Проведен
	|	И ДвижениеДС.Классификатор = ЗНАЧЕНИЕ(Справочник.Классификатор.РасходДС)
	|	И (ДвижениеДС.ТипВывода = ЗНАЧЕНИЕ(Справочник.Классификатор.ПодОстаток) ИЛИ ДвижениеДС.ТипВывода = ЗНАЧЕНИЕ(Справочник.Классификатор.ПодОстатокЕБС))
	|	И ДвижениеДС.Дата МЕЖДУ &ДатаРасчета И &ТекДата
	|	И ДвижениеДС.ТипДокумента = ЗНАЧЕНИЕ(Справочник.Сущности.ПоручениеИДвижениеДС)
	|	И ДвижениеДС.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ОперацииДС.СредстваКлиента)
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	Поручение.Соглашение
	|ИЗ
	|	Документ.ПоручениеНаВыводДС КАК Поручение
	|ГДЕ
	|	Поручение.Проведен
	|	И Поручение.ТипВывода В (ЗНАЧЕНИЕ(Справочник.Классификатор.ПодОстаток), ЗНАЧЕНИЕ(Справочник.Классификатор.ПодОстатокЕБС))
	|	И Поручение.Дата МЕЖДУ &ДатаРасчета И &ТекДата
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение";

	Запрос.УстановитьПараметр("ДатаРасчета", НачалоДня(ДатаРасчета));
	Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());

	//#Если Клиент Тогда
	//	Состояние("Поиск соглашений с выводами под остаток...");
	//#КонецЕсли

	Запрос.Выполнить();

	//#Если Клиент Тогда
	//	Состояние();
	//#КонецЕсли

КонецПроцедуры // ПодготовитьСоглашенияСВыводамиПодОстаток

Процедура ПодготовитьКлиентовПрайма(Запрос)

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

	//#Если Клиент Тогда
	//	Состояние("Получение списка клиентов прайма...");
	//#КонецЕсли

	Запрос.Выполнить();

КонецПроцедуры // ПодготовитьКлиентовПрайма

Функция получитьИмяЗаемщикаДляЗаписи(ссСоглашение)

	стрРез = СокрЛП(ссСоглашение);
	стрРез = СтрЗаменить(стрРез, "\", "_");
	стрРез = СтрЗаменить(стрРез, "/", "_");
	стрРез = СтрЗаменить(стрРез, "*", "_");
	стрРез = СтрЗаменить(стрРез, ";", "_");
	стрРез = СтрЗаменить(стрРез, ":", "_");
	стрРез = СтрЗаменить(стрРез, """", "_");
	стрРез = СтрЗаменить(стрРез, "'", "_");

	Возврат стрРез;

КонецФункции // получитьИмяЗаемщикаДляЗаписи()

Процедура ОбработатьБуфер(Параметры, СПриоритетом, МаксимальноеКоличествоСделокСКлиентом, ЦветПодсветкиМинимума, ЦветПодсветкиПоАктивам, ПорогАктивов, РаспределятьРаннийКлиринг, МаксимальныйПриоритет, КэшПроцентов, ДатаРасчета, Источник)

	//ИмяОбработки = "РасчетКредитовОвернайтЦБ";

	Если Параметры.Буфер.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	// Должны сперва обработать соглашения без посчитанных ранее активов
	// Если режим Безлимит, то внутрь не попадем, так как СоглашенияБезАктивов пустой
	//Если НЕ СПриоритетом
	//	И Параметры.СоглашенияБезАктивов.Количество() > 0 Тогда
	//
		//МассивСоглашений = Новый Массив;
		//
		//Для каждого КлючИЗначение Из Параметры.СоглашенияБезАктивов Цикл
		//	МассивСоглашений.Добавить(КлючИЗначение.Ключ);
		//КонецЦикла;

		// Считаем активы у этих соглашений

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

	//КонецЕсли;

	// Проходим и закрываем

	СтруктураПоиска = Новый Структура("Соглашение, ЦБ", , Параметры.ЦБ);

	//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
	//Если ФормироватьОтчетПоРаспределению Тогда
		ПараметрыОбласти = Параметры.ОбластьСтрока.Параметры;
	//КонецЕсли;
	//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

	МассивПодсветкиМинимумов = Новый Массив(3);

	// 365 843
	структураПоискаОстатков = Новый Структура("Соглашение, Субсчет, Прайм, ТраекторияХранения, ТипРазделаСчетаДепо, СчетДепо");

	Для каждого СтрокаБуфера Из Параметры.Буфер Цикл

		Если НЕ ЗначениеЗаполнено(СтрокаБуфера.Цена) Тогда
			СообщитьЛог("Распределение по остаткам - нет цены для " + СокрП(Параметры.ЦБ) + " на "
			+ СокрП(Параметры.СтрокаДерева.ТКСБ) + ", " + СтрокаБуфера.ТраекторияХранения
			+ ", " + СтрокаБуфера.ТипРазделаСчетаДепо + "!", СтатусСообщения.Внимание, , Источник);
			Продолжить;

		КонецЕсли;

		Если СПриоритетом ИЛИ Параметры.Безлимит Тогда
			Активы = 0;
		Иначе
			Активы = Параметры.АктивыСоглашений[СтрокаБуфера.Соглашение];
		КонецЕсли;

		// Ищем остаток у соглашения

		СтруктураПоиска.Соглашение = СтрокаБуфера.Соглашение;

		СтрокиСОстатком = Параметры.ОстаткиУСоглашений.НайтиСтроки(СтруктураПоиска);

		Если СтрокиСОстатком.Количество() = 0 Тогда
			СтрокаСОстаткомУСоглашения = Параметры.ОстаткиУСоглашений.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаСОстаткомУСоглашения, СтруктураПоиска);
			СтрокаСОстаткомУСоглашения.Количество = СтрокаБуфера.ОстатокУСоглашения;
		Иначе
			СтрокаСОстаткомУСоглашения = СтрокиСОстатком[0];
		КонецЕсли;

		РаботатьСТекущейСтрокойБуфера = Истина;

		// Отслеживаем количество сделок с клиентом по одной и той же позиции
		// (имеет смысл, если у ЦБ есть предел РЕПО, который ограничивает количество
		// в одной сделке и приходится забирать у клиента несколькими сделками)
		// Есть у нас доп. параметр - максимальное количество сделок с клиентом -
		// это типа предохранительный клапан, чтобы из-за ошибочного задания ПределРЕПО у ЦБ
		// в результате не нагенерился триллион сделок

		ТекущееКоличествоСделок = 0;

		Пока РаботатьСТекущейСтрокойБуфера Цикл

			//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
			//Если ФормироватьОтчетПоРаспределению Тогда

				Если СтрокаБуфера.Приоритет = МаксимальныйПриоритет Тогда
					СтрокаБуфера.Приоритет = 0;
				КонецЕсли;

				ПараметрыОбласти.Заполнить(СтрокаБуфера);

				ПараметрыОбласти.Количество	= 0;
				ПараметрыОбласти.Активы		= Активы;
				ПараметрыОбласти.Незакрытый	= Параметры.Остаток;
				ПараметрыОбласти.Остаток	= СтрокаБуфера.Количество;
				ПараметрыОбласти.УСоглашения	= СтрокаСОстаткомУСоглашения.Количество;

			//КонецЕсли;
			//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

			СработалПределРЕПО = Ложь;

			Если Параметры.Безлимит Тогда

				КЗакрытию = Макс(0, Мин(СтрокаБуфера.Количество, СтрокаСОстаткомУСоглашения.Количество));

			Иначе

				КЗакрытию = Макс(0, Мин(Параметры.Остаток, СтрокаБуфера.Количество, СтрокаСОстаткомУСоглашения.Количество));

				Если ЗначениеЗаполнено(Параметры.ПределРЕПО) И КЗакрытию > Параметры.ПределРЕПО Тогда
					КЗакрытию = Параметры.ПределРЕПО;
					СработалПределРЕПО = Истина;
				КонецЕсли;

			КонецЕсли;

			МассивПодсветкиМинимумов[0] = (КЗакрытию = Параметры.Остаток);
			МассивПодсветкиМинимумов[1] = (КЗакрытию = СтрокаБуфера.Количество);
			МассивПодсветкиМинимумов[2] = (КЗакрытию = СтрокаСОстаткомУСоглашения.Количество);

			Если НЕ СПриоритетом И Активы < ПорогАктивов И НЕ Параметры.Безлимит
				ИЛИ КЗакрытию = 0
				Тогда

				//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
				//Если ФормироватьОтчетПоРаспределению Тогда

					Параметры.Отчет.Вывести(Параметры.ОбластьСтрока, 2);

					Если Активы < ПорогАктивов Тогда
						Параметры.Отчет.Область(Параметры.Отчет.ВысотаТаблицы, 8, Параметры.Отчет.ВысотаТаблицы, 8).ЦветФона = ЦветПодсветкиПоАктивам;
					Иначе
						ПодсветитьМинимумы(МассивПодсветкиМинимумов, Параметры, ЦветПодсветкиМинимума);
					КонецЕсли;

				//КонецЕсли;
				//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

				Прервать;

			КонецЕсли;

			ТекущееКоличествоСделок = ТекущееКоличествоСделок + 1;

			// Добавляем строчечку

			СтрокаДерева = Параметры.СтрокаДерева.Строки.Добавить();

			// Скопируем значения колонок родительской строки
			// 2017.11.22 ПичугинаКН - учтем уже набранные займы {
			ЗаполнитьЗначенияСвойств(СтрокаДерева, Параметры.СтрокаДерева,,"КоличествоВРегистре, КоличествоВЗаймах");
			// } 2017.11.22 ПичугинаКН - учтем уже набранные займы

			ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаБуфера);

			// nsk_284072 Ранний клиринг на ММВБ
			// Ткаченко А. А. 2014.05.16 {
			СтрокаДерева.ЭтоРаннийКлиринг			= РаспределятьРаннийКлиринг;
			Параметры.СтрокаДерева.ЭтораннийКлиринг	= РаспределятьРаннийКлиринг;
			// }
			//СтрокаДерева.ДатаВозврата =

			Если Параметры.Безлимит Тогда
				СтрокаДерева.Исп = Ложь;
			КонецЕсли;

			СтрокаДерева.Количество	= КЗакрытию;
			СтрокаДерева.Сумма		= КЗакрытию * СтрокаДерева.Цена;

			Если ЗначениеЗаполнено(СтрокаДерева.Тариф) Тогда

				СтрокаДерева.Ставка = ПолучитьПроцент(СтрокаДерева.Тариф, КэшПроцентов, ДатаРасчета);

				СтрокаДерева.СуммаПроцента = Параметры.ЧастьГода * СтрокаДерева.Сумма * СтрокаДерева.Ставка / 100;

				Если НЕ ЗначениеЗаполнено(СтрокаДерева.СуммаПроцента) И НЕ РаспределятьРаннийКлиринг Тогда // nsk_284072 Ранний клиринг на ММВБ
					СтрокаДерева.СуммаПроцента = 0.01;
				КонецЕсли;

			КонецЕсли;

			Если НЕ Параметры.Безлимит Тогда
				Параметры.Остаток = Параметры.Остаток - КЗакрытию;
			КонецЕсли;

			СтрокаБуфера.Количество = СтрокаБуфера.Количество - КЗакрытию;

			СтрокаСОстаткомУСоглашения.Количество = СтрокаСОстаткомУСоглашения.Количество - КЗакрытию;

			СтрокаДерева.НезакрытыйОстаток = Параметры.Остаток;

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

			//-->> Василевский Д.В. = 2014.07.09 = BUGIC-1180
			//Если ФормироватьОтчетПоРаспределению Тогда

				ПараметрыОбласти.Количество	= КЗакрытию;
				Параметры.Отчет.Вывести(Параметры.ОбластьСтрока, 2);

				ПодсветитьМинимумы(МассивПодсветкиМинимумов, Параметры, ЦветПодсветкиМинимума);

				Если СработалПределРЕПО Тогда
					Параметры.Отчет.Область(Параметры.Отчет.ВысотаТаблицы, 12, Параметры.Отчет.ВысотаТаблицы, 12).ЦветТекста = WebЦвета.Синий;
				КонецЕсли;

			//КонецЕсли;
			//<<-- Василевский Д.В. = 2014.07.09 = BUGIC-1180

			Если НЕ Параметры.Безлимит И Параметры.Остаток = 0 Тогда
				Параметры.Закрыли = Истина;
				Прервать;
			КонецЕсли;

			Если НЕ СработалПределРЕПО
				ИЛИ НЕ ЗначениеЗаполнено(СтрокаБуфера.Количество)
				ИЛИ ТекущееКоличествоСделок = МаксимальноеКоличествоСделокСКлиентом Тогда
				РаботатьСТекущейСтрокойБуфера = Ложь;
			КонецЕсли;

		КонецЦикла;

		Если Параметры.Закрыли Тогда
			Прервать;
		КонецЕсли;

	КонецЦикла;

	Параметры.Буфер.Очистить();

КонецПроцедуры // ОбработатьБуфер

// Возвращает готовый процент с учетом длительности займа по тарифу. Для повышения скорости используется кэш
Функция ПолучитьПроцент(Тариф, КэшПроцентов, ДатаРасчета)

	Результат = КэшПроцентов[Тариф];

	Если Результат = Неопределено Тогда

		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ПРЕДСТАВЛЕНИЕ(ЗначенияПоказателейТарифовСрезПоследних.Показатель) КАК Показатель,
		|	ЗначенияПоказателейТарифовСрезПоследних.Значение
		|ИЗ
		|	РегистрСведений.ЗначенияПоказателейТарифов.СрезПоследних(&Дата, Тариф = &Тариф) КАК ЗначенияПоказателейТарифовСрезПоследних";

		Запрос.УстановитьПараметр("Дата",			ДатаРасчета);
		Запрос.УстановитьПараметр("Тариф", 			Тариф);

		Выборка = Запрос.Выполнить().Выбрать();

		Пока Выборка.Следующий() Цикл

			Если Выборка.Показатель = "ГодовойПроцент" Тогда
				Результат = Выборка.Значение;
				Прервать;
			КонецЕсли;

		КонецЦикла;

		КэшПроцентов[Тариф] = Результат;

	КонецЕсли;

	Возврат Результат;

КонецФункции // ПолучитьПроцент

Процедура ПодсветитьМинимумы(МассивПодсветкиМинимумов, Параметры, ЦветПодсветкиМинимума)

	Для й = 0 По 2 Цикл

		Если МассивПодсветкиМинимумов[й] Тогда
			Параметры.Отчет.Область(Параметры.Отчет.ВысотаТаблицы, 9 + й, Параметры.Отчет.ВысотаТаблицы, 9 + й).ЦветФона = ЦветПодсветкиМинимума;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры // ПодсветитьМинимумы

Функция ДатьБиржуСпрКэш(пТКСБ, Кэш = Неопределено)

	Если Кэш = Неопределено Тогда
		Кэш = Новый Соответствие();
	КонецЕсли;

	значениеИзКэша = Кэш[пТКСБ];
	Если значениеИзКэша = Неопределено Тогда
		значениеИзКэша = пТКСБ.Биржа;
		Кэш[пТКСБ] = значениеИзКэша
	КонецЕсли;

	Возврат значениеИзКэша;

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

Процедура ПодготовитьБлокированныеСоглашения(Запрос, ТипыБлокировокДляИсключения)

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВЫРАЗИТЬ(СостоянияОбъектаСрезПоследних.Объект КАК Справочник.Соглашения) КАК Соглашение
	|ПОМЕСТИТЬ БлокированныеСоглашения
	|ИЗ
	|	РегистрСведений.СостоянияОбъекта.СрезПоследних(&Период, Объект ССЫЛКА Справочник.Соглашения) КАК СостоянияОбъектаСрезПоследних
	|ГДЕ
	|	СостоянияОбъектаСрезПоследних.Состояние = ЗНАЧЕНИЕ(Перечисление.СостояниеПО.Отключено)
	|	И СостоянияОбъектаСрезПоследних.ТипБлокировки В(&ТипыБлокировок)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Соглашения.Ссылка
	|ИЗ
	|	РегистрСведений.СостоянияОбъекта.СрезПоследних(&Период, Объект ССЫЛКА Справочник.Субъекты) КАК СостоянияСубъекта
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Соглашения КАК Соглашения
	|		ПО СостоянияСубъекта.Объект = Соглашения.Субъект
	|ГДЕ
	|	СостоянияСубъекта.Состояние = ЗНАЧЕНИЕ(Перечисление.СостояниеПО.Отключено)
	|	И СостоянияСубъекта.ТипБлокировки В(&ТипыБлокировок)
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Соглашение";

	Запрос.УстановитьПараметр("ТипыБлокировок", ТипыБлокировокДляИсключения.ВыгрузитьКолонку("ТипБлокировки"));

	//#Если Клиент Тогда
	//	Состояние("Поиск блокированных соглашений...");
	//#КонецЕсли

	Запрос.Выполнить();

	//#Если Клиент Тогда
	//	Состояние();
	//#КонецЕсли

КонецПроцедуры // ПодготовитьБлокированныеСоглашения

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

	ДатаПолученияПсевдоКонстанты   = ?(ЗначениеЗаполнено(ДатаРасчета), ДатаРасчета, Неопределено);
	СдвинутьНаКолСекунд = ?(ТипЗнч(СдвинутьВремяНаКолСекунд) = Тип("Число"), СдвинутьВремяНаКолСекунд, 0);

	Возврат глДатьПсевдоКонстанту("ВремяВК_ЦБ_ДляДепозитария", ДатаПолученияПсевдоКонстанты, Дата(1,1,1, 19, 30, 59)) - СдвинутьНаКолСекунд;

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

Процедура ИнициироватьДатуВозврата(РаспределятьРаннийКлиринг, Заемщики, ДатаРасчета) Экспорт

	Для Каждого стрЗаемщики из Заемщики Цикл

		Если РаспределятьРаннийКлиринг Тогда
			стрЗаемщики.ДатаВозврата = ДатаРасчета;
			стрЗаемщики.КоличествоДней = 0;
		Иначе
			стрЗаемщики.ДатаВозврата = ПолучитьРабочийДеньБиржиЧерезТКСБ(ДатаРасчета, стрЗаемщики.ТКСБ);
			стрЗаемщики.КоличествоДней = (стрЗаемщики.ДатаВозврата - ДатаРасчета) / 86400;
		КонецЕсли;

	КонецЦикла;

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

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

Функция ПолучитьКолонкиДереваРаспределения() экспорт

	ДЗ = Новый ДеревоЗначений;

	ДЗ.Колонки.Добавить("Заемщик", Новый ОписаниеТипов("СправочникСсылка.Соглашения"));
	ДЗ.Колонки.Добавить("ТКСБ", Новый ОписаниеТипов("СправочникСсылка.ТорговоКлиринговыеСчетаБрокера"));
	ДЗ.Колонки.Добавить("ЦБ", Новый ОписаниеТипов("СправочникСсылка.Акции, СправочникСсылка.Облигации, СправочникСсылка.Паи"));
	ДЗ.Колонки.Добавить("КоличествоВРегистре", ПолучитьОписаниеТиповЧисла(26, 7));
	ДЗ.Колонки.Добавить("КоличествоВЗаймах",   ПолучитьОписаниеТиповЧисла(26, 7));
	ДЗ.Колонки.Добавить("Количество",          ПолучитьОписаниеТиповЧисла(26, 7));
	ДЗ.Колонки.Добавить("НезакрытыйОстаток",   ПолучитьОписаниеТиповЧисла(27, 6));
	ДЗ.Колонки.Добавить("Исп", Новый ОписаниеТипов("Булево"));
	ДЗ.Колонки.Добавить("Соглашение", Новый ОписаниеТипов("СправочникСсылка.Соглашения"));
	ДЗ.Колонки.Добавить("ДокументЗайма", Новый ОписаниеТипов("ДокументСсылка.ЗаймПодОперации"));
	ДЗ.Колонки.Добавить("Субсчет", Новый ОписаниеТипов("СправочникСсылка.Субсчета"));
	ДЗ.Колонки.Добавить("Прайм", Новый ОписаниеТипов("Булево"));
	ДЗ.Колонки.Добавить("ТраекторияХранения", Новый ОписаниеТипов("СправочникСсылка.ТраекторииХранения"));
	ДЗ.Колонки.Добавить("ТипРазделаСчетаДепо", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыРазделовСчетовДепо"));
	ДЗ.Колонки.Добавить("СчетДепо", Новый ОписаниеТипов("СправочникСсылка.СчетаДепо"));
	ДЗ.Колонки.Добавить("Тариф", Новый ОписаниеТипов("СправочникСсылка.Тарифы"));
	ДЗ.Колонки.Добавить("Ставка",        ПолучитьОписаниеТиповЧисла(16, 6));
	ДЗ.Колонки.Добавить("Цена",          ПолучитьОписаниеТиповЧисла(26, 7));
	ДЗ.Колонки.Добавить("Сумма",         ПолучитьОписаниеТиповЧисла(15, 2));
	ДЗ.Колонки.Добавить("СуммаПроцента", ПолучитьОписаниеТиповЧисла(15, 2));
	ДЗ.Колонки.Добавить("Инструмент", Новый ОписаниеТипов("СправочникСсылка.Сущности"));
	ДЗ.Колонки.Добавить("Филиал", Новый ОписаниеТипов("СправочникСсылка.Фирмы"));
	ДЗ.Колонки.Добавить("ЭтоРаннийКлиринг", Новый ОписаниеТипов("Булево"));
	ДЗ.Колонки.Добавить("ПриоритетЗаемщика", ПолучитьОписаниеТиповЧисла(5, 0));
	ДЗ.Колонки.Добавить("ДатаВозврата", ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата));
	ДЗ.Колонки.Добавить("ФормироватьРЕПО", Новый ОписаниеТипов("Булево"));

	возврат ДЗ;

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

Функция ДанныеВремениЗаймаИзменились(Переменные, ДатаРасчета) Экспорт

	Возврат НЕ (Переменные.Свойство("ДатаРасчета")
		И Переменные.Свойство("ВремяРаннегоКлиринга")
		И Переменные.Свойство("ВремяВечернегоКлиринга")
		И Переменные.Свойство("ВремяЗайма")
		И Переменные.Свойство("ВремяВозврата")
		И Переменные.ДатаРасчета = ДатаРасчета)

		ИЛИ Переменные.ВремяРаннегоКлиринга = Неопределено
		ИЛИ Переменные.ВремяЗайма = Неопределено
		ИЛИ Переменные.ВремяВозврата = Неопределено;

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

Процедура ЗаполнитьДеревоРаспределенияПараметрамиЗаймов(ДеревоРаспределения, ПараметрыЗаймов, РаспределятьРаннийКлиринг) экспорт

	ДеревоРаспределения.Строки.Очистить();

	Для каждого СтрокаПараметров Из ПараметрыЗаймов Цикл
		СтрокаРаспределения = ДеревоРаспределения.Строки.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаРаспределения, СтрокаПараметров);
		СтрокаРаспределения.ЭтоРаннийКлиринг = РаспределятьРаннийКлиринг;
	КонецЦикла;

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

// Копирование строк из одного дерева в другое рекурсивно
Процедура СкопироватьСтрокиДерева(СТРОКИПриемника, СТРОКИИсточника) экспорт

	Для каждого СтрокаИсточник Из СТРОКИИсточника Цикл
		СтрокаПриемник = СТРОКИПриемника.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);

		СкопироватьСтрокиДерева(СтрокаПриемник.Строки, СтрокаИсточник.Строки);
	КонецЦикла;

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

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

#Область ПечатьДереваЗаймов

// Печать дерева займов
//
// Параметры:
//	пДеревоРаспределения - ХранилищеЗначения - ХЗ с деревом значения
//	пТаблицаВыдачиЗаймов - ХранилищеЗначения - ХЗ с таблицей значения
//	пРаспределятьРаннийКлиринг - Булево
//	пИмяОбработкиРасчетаЗаймов - Строка
Функция ПечатьДереваЗаймов(пДеревоРаспределения, пТаблицаВыдачиЗаймов, пРаспределятьРаннийКлиринг, пИмяОбработкиРасчетаЗаймов) экспорт

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

	СообщитьЛог(СтрШаблон("Печать Дерева займов начата. %1", СообщениеОВыполненииВФоновомЗадании),,, пИмяОбработкиРасчетаЗаймов);

	ДеревоРаспределения = пДеревоРаспределения.Получить();  // доработать?  С целью успешного прохождения регрессионного тестирования, т.е. для стабильного результата, перед выполнением обхода таблицы и дерева желательно сделать сортировку обеих структур по всем полям, причем первой в сортировке должна быть колонка ЦБ. Хотя метод НайтиСтроки, в теории может дать непредсказуемый порядок результата.
	ТаблицаВыдачиЗаймов = пТаблицаВыдачиЗаймов.Получить();  //              Это может понадобится, если после доработки (например оптимизации) может измениться порядок строк в дереве и таблице.

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

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

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

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

	КаталогПротоколов = Константы.ИмяКаталогаПротокола.Получить();
	Если ПустаяСтрока(КаталогПротоколов) Тогда
		КаталогПротоколов = КаталогВременныхФайлов();
	КонецЕсли;

	ПутьКФайлу = ОпределитьКаталог(КаталогПротоколов, пИмяОбработкиРасчетаЗаймов + "\" + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd")) + "Сохранение " + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd.hh-mm-ss") + ?(пРаспределятьРаннийКлиринг,"РК","") + ".mxl"; // nsk_284072 Ранний клиринг на ММВБ

	ДеревоЗаймовСПредставлениями = ПреобразоватьСсылкиВПредставленияВДереве(ДеревоЗаймов);

	Попытка
		ПечатьТЗ(ДеревоЗаймовСПредставлениями, ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL); // BUG? Общие итоги здесь считаются некорректно т.к. в подсчитываюся суммы со всех уровней дерева, а не только с нижнего
	Исключение
		СообщитьЛог(СтрШаблон("Ошибка записи файла протокола %1. %2 Причина %3", ПутьКФайлу, СообщениеОВыполненииВФоновомЗадании, ОписаниеОшибки()), СтатусСообщения.Внимание,, пИмяОбработкиРасчетаЗаймов);
	КонецПопытки;

	СообщитьЛог(СтрШаблон("Печать Дерева займов завершена. %1", СообщениеОВыполненииВФоновомЗадании),,, пИмяОбработкиРасчетаЗаймов);

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

// Функция позволяет оптимально разово получить все представления дерева перед вызовом ПечатьТЗ
// Т.к. ПечатьТЗ получает представления неоптимально для каждой ссылки.
//
Функция ПреобразоватьСсылкиВПредставленияВДереве(ДЗ)
// ДЗ -> ТЗ -> ТЗ с предст -> ДЗ с предст

	ТЗ = ПреобразоватьДеревоВТаблицу(ДЗ);
	ТЗСПредставлениями = ПреобразоватьСсылкиВПредставленияВТаблице(ТЗ, 50000);
	ДЗСПредставлениями = ПреобразоватьТаблицуВДерево(ТЗСПредставлениями);

	Возврат ДЗСПредставлениями;

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

Функция ПолучитьСсылочныеКолонкиТЗ(КОЛОНКИ)

	Результат = Новый Массив;

	Для каждого Колонка Из КОЛОНКИ Цикл

		Для каждого Тип Из Колонка.ТипЗначения.Типы() Цикл
			Если ЭтоСсылочныйТип(Тип) Тогда
				Результат.Добавить(Колонка);
				Прервать;
			КонецЕсли;
		КонецЦикла;

	КонецЦикла;

	Возврат Результат;

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

Функция ЭтоСсылочныйТип(Тип)

	Возврат Справочники.ТипВсеСсылки().СодержитТип(Тип) или
	  Документы.ТипВсеСсылки().СодержитТип(Тип) или
	  ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) или
	  ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) или
	  ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) или
	  БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) или
	  Задачи.ТипВсеСсылки().СодержитТип(Тип) или
	  ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип);

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

Функция ПреобразоватьДеревоВТаблицу(Дерево)

	Таблица = Новый ТаблицаЗначений;
	СкопироватьКолонки(Таблица, Дерево);

	Таблица.Колонки.Добавить("ИДРодителя", Новый ОписаниеТипов("Число")); // сохранение информации об иерархии
	Таблица.Колонки.Добавить("ИД",         Новый ОписаниеТипов("Число")); //

	ПреобразоватьДеревоВТаблицуРекурсивно(Дерево, Таблица);

	возврат Таблица;

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

// ПреобразоватьДеревоВТаблицуРекурсивно
//
// Параметры:
//	ИД - Число - обеспечивает сквозную нумерацию всех строк в том же порядке как в дереве
//  ИДРодителя - Число - сохраняет иерархию
Функция ПреобразоватьДеревоВТаблицуРекурсивно(Дерево, Таблица, ИД=0, ИДРодителя=0)

	Для Каждого Строка Из Дерево.Строки Цикл

		ИД = ИД + 1;

		нСтр = Таблица.Добавить();
		ЗаполнитьЗначенияСвойств(нСтр, Строка);
		нСтр.ИДРодителя = ИДРодителя;
		нСтр.ИД         = ИД;

		Если Строка.Строки.Количество() > 0 Тогда
			ПреобразоватьДеревоВТаблицуРекурсивно(Строка, Таблица, ИД, нСтр.ИД);
		КонецЕсли;

	КонецЦикла;

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

Функция ПреобразоватьТаблицуВДерево(Таблица, СортироватьПоИД=Истина)

	Дерево = Новый ДеревоЗначений;
	СкопироватьКолонки(Дерево, Таблица);

	Таблица.Индексы.Добавить("ИДРодителя");
	ПреобразоватьТаблицуВДеревоРекурсивно(Дерево, Таблица);

	// Сортировка позволяет восстановить порядок, если таблица была получена из дерева и ИД содержит порядковый номер строки
	Если СортироватьПоИД Тогда
		Дерево.Строки.Сортировать("ИД", Истина);
	КонецЕсли;

	// в дереве эта информация уже не нужна
	Дерево.Колонки.Удалить("ИД");
	Дерево.Колонки.Удалить("ИДРодителя");

	возврат Дерево;

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

Функция ПреобразоватьТаблицуВДеревоРекурсивно(Дерево, Таблица, ИД=0)

	СтруктураПоиска = Новый Структура("ИДРодителя", ИД);
	МассивСтрокТЗ = Таблица.НайтиСтроки(СтруктураПоиска);

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

		ПреобразоватьТаблицуВДеревоРекурсивно(СтрокаДерева, Таблица, СтрокаТЗ.ИД);
	КонецЦикла;

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

// Возвращает ТЗ полученную из ТЗ-параметра, в которой вместо ссылок их представления
//
// Параметры:
//	РазмерПорции - Число - если ноль то одним запросом
Функция ПреобразоватьСсылкиВПредставленияВТаблице(ТаблицаИсходная, РазмерПорции=0);

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

	// Одним запросом
	Если РазмерПорции = 0 ИЛИ ТаблицаИсходная.Количество() <= РазмерПорции Тогда
		Запрос.УстановитьПараметр("Таблица", ТаблицаИсходная);
		ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
		возврат ТаблицаРезультата; // ВОЗВРАТ
	КонецЕсли;

	// Делаем выборку порциями чтобы исключить падение запросов при большом размере таблицы значений - запрос к БД может быть очень ресурсоемким т.к. в нем будут соединения для получения представлений. https://its.1c.ru/db/v8std/content/725/hdoc/_top
	НомерСтроки = 0;
	МассивСтрок = Новый Массив;
	Для каждого строка Из ТаблицаИсходная Цикл
		НомерСтроки = НомерСтроки + 1;
		МассивСтрок.Добавить(строка);

		Если НЕ (НомерСтроки % РазмерПорции = 0 ИЛИ НомерСтроки = ТаблицаИсходная.Количество()) Тогда
			Продолжить;
		КонецЕсли;

		Запрос.УстановитьПараметр("Таблица", ТаблицаИсходная.Скопировать(МассивСтрок));

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

		МассивСтрок.Очистить();
	КонецЦикла;

	Возврат ТаблицаРезультата;

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

// Формируется текст запроса для получения представлений ссылочных колонок ТЗ
Функция СформироватьТекстЗапросаПолученияПредставленийСсылокТЗ(КолонкиТЗ)

	СсылочныеКолонки = ПолучитьСсылочныеКолонкиТЗ(КолонкиТЗ);

	ПоляИсходные = "";
	ПоляРезультата = "";

	Для каждого Колонка Из КолонкиТЗ Цикл
		ПоляИсходные = ПоляИсходные + Колонка.Имя +", ";
		Если СсылочныеКолонки.Найти(Колонка) = Неопределено Тогда
			ПоляРезультата = ПоляРезультата + Колонка.Имя +", ";
		Иначе
			ПоляРезультата = ПоляРезультата + СтрШаблон("ПРЕДСТАВЛЕНИЕ(%1) КАК %1, ", Колонка.Имя);
		КонецЕсли;
	КонецЦикла;

	ПоляИсходные = Лев(ПоляИсходные, СтрДлина(ПоляИсходные)-2);
	ПоляРезультата = Лев(ПоляРезультата, СтрДлина(ПоляРезультата)-2);

	ТекстЗапроса = СтрШаблон(
	"ВЫБРАТЬ
	|    %1
	|ПОМЕСТИТЬ Таблица
	|ИЗ
	|    &Таблица как т
	|;
	|
	|ВЫБРАТЬ
	|    %2
	|ИЗ
	|    Таблица", ПоляИсходные, ПоляРезультата);

	возврат ТекстЗапроса;

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

Функция СкопироватьКолонки(Приемник, Источник)
// Параметры
//		Источник - таблица значений ИЛИ дерево значений
//		Приемник - таблица значений ИЛИ дерево значений

	Для каждого Колонка Из Источник.Колонки Цикл
		Приемник.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок);
	КонецЦикла;

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

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