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