Добрый вечер. В ТЗ_СПлатежками из-за циклов получается много одинаковых записей. Как это исправить?
ТЗ_ДляПлатежек=тз.Скопировать();
ТЗ_ДляПлатежек.Свернуть("Организация,Контрагент, ДоговорКонтрагента, датаДок, Документ, дата","Сумма,СуммаРеал,СуммаПлП");
ТЗ_ДляПлатежек.Сортировать("ДатаДок возр");
для каждого стртз из ТЗ_ДляПлатежек цикл
СуммаПл=0;
Отбор = Новый Структура;
Отбор.Вставить("Организация",стртз.Организация);
Отбор.Вставить("Контрагент",стртз.Контрагент);
Отбор.Вставить("ДоговорКонтрагента",стртз.ДоговорКонтрагента);
ТЗ_Рабочая = ТЗ.Скопировать(Отбор);
ТЗ_Рабочая.Сортировать("ДатаДок возр");
Для каждого СтрокаДат из МассивПериодов цикл
ЗапросПлатеж = Новый Запрос;
ЗапросПлатеж.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстаткиИОбороты.Организация,
| ВзаиморасчетыОстаткиИОбороты.Контрагент,
| ВзаиморасчетыОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
| СУММА(ВзаиморасчетыОстаткиИОбороты.СуммаВзаиморасчетовРасход) КАК СуммаПлП
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(
| &НачалоПериода,
| &КонецПериода,
| Регистратор,
| ,
| Организация = &Организация
| И Контрагент = &Контрагент
| И ДоговорКонтрагента = &Договор) КАК ВзаиморасчетыОстаткиИОбороты
|ГДЕ
| ВзаиморасчетыОстаткиИОбороты.ДоговорКонтрагента.ВидДоговора = &ВидДоговора
| И ТИПЗНАЧЕНИЯ(ВзаиморасчетыОстаткиИОбороты.Регистратор) <> ТИП(Документ.ПереоценкаВалютныхСредств)
|
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыОстаткиИОбороты.Организация,
| ВзаиморасчетыОстаткиИОбороты.Контрагент,
| ВзаиморасчетыОстаткиИОбороты.ДоговорКонтрагента";
ЗапросПлатеж.УстановитьПараметр("НачалоПериода",СтрокаДат);
ЗапросПлатеж.УстановитьПараметр("КонецПериода",КонецДня(СтрокаДат));
ЗапросПлатеж.УстановитьПараметр("Организация",стртз.Организация);
ЗапросПлатеж.УстановитьПараметр("Контрагент",стртз.Контрагент);
ЗапросПлатеж.УстановитьПараметр("Договор",стртз.ДоговорКонтрагента);
ЗапросПлатеж.УстановитьПараметр("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
РезПл = ЗапросПлатеж.Выполнить();
ВыборПл = РезПл.Выбрать();
Если не резПл.Пустой() тогда
ВыборПл.Следующий();
//////////////////////////////
Если строка.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код <> "643" Тогда
ЗапросПереоценка = Новый Запрос;
ЗапросПереоценка.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПереоценкаВалютныхСредств.Дата КАК Дата
|ИЗ
| Документ.ПереоценкаВалютныхСредств КАК ПереоценкаВалютныхСредств
|ГДЕ
| ПереоценкаВалютныхСредств.Дата <= &Дата
| И ПереоценкаВалютныхСредств.Проведен = ИСТИНА
| И ПереоценкаВалютныхСредств.ОтражатьВУправленческомУчете = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
ЗапросПереоценка.УстановитьПараметр("Дата",СтрокаДат+1);
РезультатЗапросаПереоценка = ЗапросПереоценка.Выполнить().Выгрузить();
ДатаПереоценки=макс(РезультатЗапросаПереоценка[0].Дата,КонецДня(СтрокаДат));
Отбор = Новый Структура;
Отбор.Вставить("Валюта",строка.ДоговорКонтрагента.ВалютаВзаиморасчетов);
ТекКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(КонецДня(СтрокаДат), Отбор).Курс;
СуммаПлП=ВыборПл.СуммаПлП*ТекКурс;
Иначе
СуммаПлП=ВыборПл.СуммаПлП;
КонецЕсли;
/////////////////////////////
СуммаПл=?(СуммаПлП=null,0,СуммаПлП)+суммаПл;
Иначе
СуммаПл=суммаПл;
КонецЕсли;
//Если СуммаПл<>0 тогда
Для Каждого Стр из ТЗ_Рабочая цикл
НовСтр=ТЗ_СПлатежками.Добавить();
НовСтр.Дата=строкадат;
НовСтр.Организация=Стр.Организация;
НовСтр.Контрагент=Стр.Контрагент;
НовСтр.ДоговорКонтрагента=Стр.ДоговорКонтрагента;
НовСтр.Документ=Стр.Документ;
НовСтр.Дата=Строкадат;
НовСтр.ДатаДок=Стр.датаДок;
СуммаРеал=?(Значениезаполнено(Стр.СуммаРеал),Стр.СуммаРеал,0);
Если Стр.Дата<=СтрокаДат тогда
Если Стр.Сумма<>0 тогда
Если Стр.Сумма>=СуммаПл ТОгда
СуммаСч=Стр.Сумма-СуммаПл;
СуммаПл=0;
стр.СуммаПлП=СуммаСч;
Стр.Сумма=СуммаСч;
иначе
СуммаСч=СуммаПл-Стр.Сумма;
СуммаСч1=Стр.Сумма-СуммаПл;
СуммаПл=СуммаСч;
если СуммаСч1<0 тогда
стр.СуммаПлП=0;
иначе
стр.СуммаПлП=СуммаСч;
Конецесли;
стр.Сумма=стр.СуммаПлП;
КонецЕсли;
НовСтр.СуммаПлП=?(стр.СуммаПлП=null,0,стр.СуммаПлП);
иначе
НовСтр.СуммаПлП=0;
КонецЕсли;
иначе
СуммаПл=СуммаПл;
НовСтр.СуммаПлП=0;
КонецЕсли;
КонецЦикла;
//КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Добрый день.
3 варианта:
1. Свернуть ТЗ после выполнения цикла.
2. При добавлении строки в ТЗ проверять, есть-ли такая строка и не добавлять дубли.
3. Переписать запрос, чтобы в нем не было дублей (например, ВЫБРАТЬ РАЗЛИЧНЫЕ).
3 варианта:
1. Свернуть ТЗ после выполнения цикла.
2. При добавлении строки в ТЗ проверять, есть-ли такая строка и не добавлять дубли.
3. Переписать запрос, чтобы в нем не было дублей (например, ВЫБРАТЬ РАЗЛИЧНЫЕ).
запросы в цикле выполнять не желательно.
создайте ТЗ на основе результата 1-го запроса
в качестве параметров укажите только даты. все остальное можно отобрать через заполнение структуры и передаче ее в ТЗ.НайтиСтроки(Структура)
выполняться будет в разы быстрее
"Документ.ПереоценкаВалютныхСредств" - обратитесь к движениям документа
по хорошему можно все в запросе сделать
левым соединением соедините таблицу курсов и валюту договора
а потом уже получайте сконвертированную сумму
создайте ТЗ на основе результата 1-го запроса
в качестве параметров укажите только даты. все остальное можно отобрать через заполнение структуры и передаче ее в ТЗ.НайтиСтроки(Структура)
выполняться будет в разы быстрее
"Документ.ПереоценкаВалютныхСредств" - обратитесь к движениям документа
**********
ЗапросПереоценка = Новый Запрос;
ЗапросПереоценка.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПереоценкаВалютныхСредств.Дата КАК Дата
|ИЗ
| Документ.ПереоценкаВалютныхСредств КАК ПереоценкаВалютныхСредств
|ГДЕ
| ПереоценкаВалютныхСредств.Дата <= &Дата
| И ПереоценкаВалютныхСредств.Проведен = ИСТИНА
| И ПереоценкаВалютныхСредств.ОтражатьВУправленческомУчете = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
ЗапросПереоценка.УстановитьПараметр("Дата",СтрокаДат+1);
РезультатЗапросаПереоценка = ЗапросПереоценка.Выполнить().Выгрузить();
ДатаПереоценки=макс(РезультатЗапросаПереоценка[0].Дата,КонецДня(СтрокаДат));
что дает дата переоценки?
*****************
Показатьпо хорошему можно все в запросе сделать
левым соединением соедините таблицу курсов и валюту договора
а потом уже получайте сконвертированную сумму
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот