Таблица значений

1. Qwert_23 26.08.19 21:13 Сейчас в теме
Добрый вечер. В ТЗ_СПлатежками из-за циклов получается много одинаковых записей. Как это исправить?

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

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

создайте ТЗ на основе результата 1-го запроса
в качестве параметров укажите только даты. все остальное можно отобрать через заполнение структуры и передаче ее в ТЗ.НайтиСтроки(Структура)
выполняться будет в разы быстрее

"Документ.ПереоценкаВалютныхСредств" - обратитесь к движениям документа



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

что дает дата переоценки?

*****************
Показать

по хорошему можно все в запросе сделать

левым соединением соедините таблицу курсов и валюту договора
а потом уже получайте сконвертированную сумму
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот