Это Док Приход Денег .
можно же просто конструктором сделать проводку и структурой получить курс на дату
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Проводки.Записывать = Истина;
Движения.Проводки.Записать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Проводки");
ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Покупатели);
ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Контрагент, Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПроводкиОстатки.Субконто1 КАК Контрагент,
| ПроводкиОстатки.Субконто2 КАК Договор,
| &СуммаНадоСписать КАК СуммаНадоСписать,
| ПроводкиОстатки.СуммаВалютыОстаток * ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК СуммаЗадолженности,
| ПроводкиОстатки.СуммаВалютыОстаток КАК СуммаВалютыОстаток,
| ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс,
| ПроводкиОстатки.Субконто2.ВалютаВзаиморасчетов КАК Валюта
|ИЗ
| РегистрБухгалтерии.Проводки.Остатки(&ТекущийМомент, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), , Субконто1 = &Контрагент) КАК ПроводкиОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних
| ПО ПроводкиОстатки.Субконто2.ВалютаВзаиморасчетов = КурсыВалютСрезПоследних.Валюта
|
|УПОРЯДОЧИТЬ ПО
| СуммаЗадолженности УБЫВ
|ИТОГИ
| МАКСИМУМ(СуммаНадоСписать),
| СУММА(СуммаЗадолженности),
| СУММА(СуммаВалютыОстаток)
|ПО
| Контрагент";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("ТекущийМомент", МоментВремени());
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("СуммаНадоСписать", СуммаВРублях);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаКонтрагент.Следующий() Цикл
Если ВыборкаКонтрагент.СуммаНадоСписать > ВыборкаКонтрагент.СуммаЗадолженности Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "По контрагенту " + ВыборкаКонтрагент.Контрагент + " максимальная сумма распределения " + ВыборкаКонтрагент.СуммаЗадолженности +" руб.";
Сообщение.Сообщить();
КонецЕсли;
Если НЕ Отказ Тогда
СуммаНадоСписать = ВыборкаКонтрагент.СуммаНадоСписать;
ВыборкаДетальныеЗаписи = ВыборкаКонтрагент.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Движение = Движения.Проводки.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Касса;
Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели;
Движение.Период = Дата;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = ВыборкаДетальныеЗаписи.Контрагент;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = ВыборкаДетальныеЗаписи.Договор;
Если СуммаНадоСписать >= ВыборкаДетальныеЗаписи.СуммаЗадолженности Тогда
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаЗадолженности;
Движение.СуммаВалютыКт = ВыборкаДетальныеЗаписи.СуммаВалютыОстаток;
СуммаНадоСписать = СуммаНадоСписать - ВыборкаДетальныеЗаписи.СуммаЗадолженности;
Иначе
Движение.Сумма = СуммаНадоСписать;
Движение.СуммаВалютыКт = СуммаНадоСписать / ВыборкаДетальныеЗаписи.Курс;
СуммаНадоСписать = 0;
КонецЕсли;
Если СуммаНадоСписать = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры