Помогите с объединением двух строк в одну кодом (очень подробно внутри)

1. Medveedka 12.08.20 09:55 Сейчас в теме
Доброе утро всем.
Конфа УТ10.3, обычные формы.

Есть не типовой отчет который берет данные из не типового РС, в РС же заносится данные из также не типового документа.

Суть доработки: контрагентам прописывается лимит сколько они могут задолжать, и в отчете показываются же насколько они превысили этот лимит.

Так вот. По одному контрагенту поставили лимит в 2млн.руб. Он в отчете разбивается на 2 строки (на скриншоте показано курсивом). Происходит этого из-за того, что он задолжал как по двум договорам. И вот эти две строчки надо объединить в одну, как у других контрагентов. Т.е. банально сложить.

В чем сложности возникли у меня:
сразу оговорю для понимания, что выводить нам надо в Секцию1 (обычный шрифт), сейчас же по данному контрагенту выводится в Секцию2 (курсив), в скриншотах также будет скрин макета с конфигуратора.

Для начала приведу весь код который задействован в выводе данных на макет:

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

	Для Каждого тс из Остатки Цикл
		Если не тс.ВыводитьСтроку Тогда Продолжить; КонецЕсли;
		Лимит = ОпределитьЛимит(тс.Контрагент);
		Если Лимит = 0 Тогда Продолжить; КонецЕсли;
		Если не ЗначениеЗаполнено(тс.ИНН) Тогда
			Лимит = ОпределитьЛимит(тс.Контрагент);
			Если Лимит = 0 Тогда Продолжить; КонецЕсли;
			Секция.Параметры.Контрагент = тс.Контрагент;
			Секция.Параметры.ИНН        = "";
			Секция.Параметры.Сумма1     = тс.Сумма1;
			СуммаВРублях                = тс.Сумма2;
			Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
				СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
			КонецЕсли;
			Секция.Параметры.Сумма2     = СуммаВРублях;
			Лимит = ОпределитьЛимит(тс.Контрагент);
			//++++++++++++++++++++++++++++++++++++++++++++++
			НДС = ОпределитьНДС (тс.Контрагент);
			СтавкаНДС = ОпределитьНДС (тс.Контрагент);
			НДСЧисло = ПереводНДС (тс.Контрагент);
			
						
			
			//______________________________________________
			Секция.Параметры.Лимит      = Лимит;
			Секция.Параметры.Превышение = ?( Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит, 0);
			//++++++++++++++++++++++++++++++++++++
			НДСЧисло = ПереводНДС (тс.Контрагент);
			Секция.Параметры.СтавкаНДС      = НДС;
			Секция.Параметры.ЛимитБезНДС      = Лимит - Лимит* НДСЧисло/100;
			Секция.Параметры.СуммаНДС      = Лимит - Секция.Параметры.ЛимитБезНДС;
			//______________________________________
			
			
			
			
			ТабличныйДокумент.Вывести(Секция);
			ИтогоСумма1 = ИтогоСумма1 + тс.Сумма1;
			ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях; 
			ИтогоПревыш = ИтогоПревыш +  ?(Лимит > 0 и СуммаВРублях - Лимит > 0 , СуммаВРублях - Лимит,0);
	    КонецЕсли;
		Если ЗначениеЗаполнено(тс.ИНН) Тогда
			ИНН_ = Остатки.скопировать(Новый Структура("ИНН",тс.ИНН));
			Если ИНН_.Количество()= 1 Тогда 
				Секция.Параметры.Контрагент = тс.Контрагент;
				Секция.Параметры.ИНН        = тс.ИНН;
				Секция.Параметры.Сумма1     = тс.Сумма1;
				СуммаВРублях                = тс.Сумма2;
				Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
					СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
				Иначе 
					Секция.Параметры.Сумма1 = 0;
					СуммаВРублях            = тс.Сумма1;
					тс.Сумма1               = 0;   
				КонецЕсли;
				Секция.Параметры.Сумма2     = СуммаВРублях;
				Лимит = ОпределитьЛимит(тс.Контрагент);
				НДС = ОпределитьНДС (тс.Контрагент);
				Секция.Параметры.СтавкаНДС      = НДС;

				Секция.Параметры.Лимит      = Лимит;
				Секция.Параметры.Превышение = ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
				НДСЧисло = ПереводНДС (тс.Контрагент);
				Секция.Параметры.СтавкаНДС      = НДС;
				Секция.Параметры.ЛимитБезНДС      = Лимит - Лимит* НДСЧисло/100;
				Секция.Параметры.СуммаНДС      = Лимит - Секция.Параметры.ЛимитБезНДС;


				ТабличныйДокумент.Вывести(Секция);
				ИтогоСумма1 = ИтогоСумма1 + тс.Сумма1; 
				ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях; 
				ИтогоПревыш = ИтогоПревыш +  ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
			Иначе
				Секция1.Параметры.Контрагент = тс.Контрагент;
				Секция1.Параметры.ИНН        = тс.ИНН;
				Секция1.Параметры.Сумма1     = ИНН_.Итог("Сумма1");
				СуммаВРублях                 = ИНН_.Итог("Сумма2");;
				Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
					СуммаВРублях =  ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
				Иначе 
					Секция.Параметры.Сумма1     = 0;
					СуммаВРублях                = ИНН_.Итог("Сумма1");
				КонецЕсли;
				Лимит = ОпределитьЛимит(тс.Контрагент);
				НДС = ОпределитьНДС (тс.Контрагент);
				Секция.Параметры.СтавкаНДС      = НДС;
				НДСЧисло = ПереводНДС (тс.Контрагент);
				Секция.Параметры.СтавкаНДС      = НДС;
				Секция.Параметры.ЛимитБезНДС      = Лимит - Лимит* НДСЧисло/100;
				Секция.Параметры.СуммаНДС      = Лимит - Секция.Параметры.ЛимитБезНДС;


				Секция1.Параметры.Лимит      = Лимит;
				Секция1.Параметры.Превышение = ?(Лимит > 0 и СуммаВРублях - Лимит > 0,СуммаВРублях - Лимит,0);
				ТабличныйДокумент.Вывести(Секция1);
				
				Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
					ИтогоСумма1 = ИтогоСумма1 + ИНН_.Итог("Сумма1"); 
				КонецЕсли;
				ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях; 
				ИтогоПревыш = ИтогоПревыш + ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
				Для Каждого ттс из ИНН_ Цикл
					Если ттс.Сумма1 = 0 и ттс.Сумма2 = 0 Тогда 
						Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
						Для Каждого стр из Стр_Осн Цикл
							стр.ВыводитьСтроку = Ложь;
						КонецЦикла;
						Продолжить; 
					КонецЕсли;
					Секция2.Параметры.Контрагент = ттс.Контрагент;
					Секция2.Параметры.Сумма1     = ттс.Сумма1;
					СуммаВРублях                 = тс.Сумма2;
					Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
						СуммаВРублях  = ттс.Сумма1 * КурсЕвро.Курс;
					Иначе
						Секция.Параметры.Сумма1  = 0;
						СуммаВРублях             = тс.Сумма1;
					КонецЕсли;
					Секция2.Параметры.Сумма2  = СуммаВРублях;
					
					ТабличныйДокумент.Вывести(Секция2);
					Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
					Для Каждого стр из Стр_Осн Цикл
						стр.ВыводитьСтроку = Ложь;
					КонецЦикла;
				КонецЦикла;
			КонецЕсли;
	    КонецЕсли;
	КонецЦикла;
	
	Секция3 = Макет.ПолучитьОбласть("Строка3");
	Секция3.Параметры.Сумма1 = ИтогоСумма1;
	Секция3.Параметры.Сумма2 = ИтогоСумма2;
	Секция3.Параметры.Превыш = ИтогоПревыш;
	ТабличныйДокумент.Вывести(Секция3);
	
	ТабличныйДокумент.ТекущаяОбласть = ТабличныйДокумент.Область(2,3);
       
Показать


Т.е. по коду видим, что сначала выводится секция 1 (куда нам и надо поместить данные), потом секция2, потом секция3 (это итоги), это нас не интересует.

Я смотрела по точкам останова, что идет обход по этому месту:
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
						СуммаВРублях  = ттс.Сумма1 * КурсЕвро.Курс;
					Иначе
						Секция.Параметры.Сумма1  = 0;
						СуммаВРублях             = тс.Сумма1;
					КонецЕсли;
					Секция2.Параметры.Сумма2  = СуммаВРублях;

ТабличныйДокумент.Вывести(Секция2);
Но как мне это сложить и потом уже запихнуть в Секцию1 ума не приложу.

Скрин1: это макет.
Скрин2: как сейчас выглядит отчет.
Если необходимо будет инфы еще дам естественно.

Каким образом можно это вообще сделать? И можно ли?
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
11. Sergex 58 12.08.20 11:21 Сейчас в теме
(1) У вас в запросе есть группировка по валюте договора и по сделке. Только при различиях по этим полям может двоится вывод сальдо по контрагенту, так как контрагент его наименование и ИНН образуют всегда один и только один кортеж Поскольку в выводе есть два договора то надо понять причину дробления. Это либо разные волюты договоров либо разные сделки...

Сделок я в форме вывода не обнаруживаю, более того при сворачивании таблицы с результатом они отбрасываются следовательно эта группировка и в запросе не нужна.

Поправьте запрос так, чтобы он пересчитывал в рубли все договора, тогда вы можете убрать группировку по валютам договоров и получите для каждого контрагента агрегированный долг без учета разделения по договорам...

вот этот фрагмент
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
КонецЕсли;
реализуйте в запросе. Справитесь?
Medveedka; +1 Ответить
12. Medveedka 12.08.20 11:30 Сейчас в теме
(11) попробую справится. скорее всего дробление идет как раз из-за валюты договоров. один в у.е. второй в рублях.
15. starjevschik 12.08.20 13:11 Сейчас в теме
(12) постепенно проглядывают условия задачи, всего-то к двенадцатому ответу, это довольно быстро.
Если договоры в разных валютах, суммы по ним не получится просто сложить. Можно даже не пытаться, получится полная фигня. Надо искать другие пути решения.
Если конвертация в одну валюту в запросе невозможна, то придется добавить обработку данных после запроса - перевести суммы в одну валюту. Потом свернуть данные по контрагенту и только потом переходить к выводу в отчет.
16. Medveedka 12.08.20 13:25 Сейчас в теме
(15) не факт, что разные валюты. сейчас я пытаюсь запрос менять. надо посмотреть хотя бы что получится. если нет, то пробовать Ваш вариант с обработкой после запроса.
17. Medveedka 12.08.20 13:26 Сейчас в теме
(15) может подскажите как можно попробовать поменять запрос на условие из (11)?
18. starjevschik 12.08.20 14:11 Сейчас в теме
(17) я думаю, лучше попробовать обработку после запроса. Это быстрее будет и надежнее.
Всегда быстрее пройти знакомой дорогой, чем правильной...
19. Medveedka 12.08.20 14:16 Сейчас в теме
(18) ну раз никто другой не отвечает давайте попробую по Вашему варианту. Я сейчас попробую что нибудь написать и отпишусь
20. Medveedka 12.08.20 14:41 Сейчас в теме
(18) не подскажите как написать обработку запроса этого? у меня ничего не получается :с
13. Medveedka 12.08.20 11:43 Сейчас в теме
(11) не пойму как прописать условие в запросе чтоб пересчитывало там. в каком именно месте? после ГДЕ надо прописывать?
14. Medveedka 12.08.20 12:41 Сейчас в теме
(11)никак не могу разобраться где прописывать условие. Да и, так понимаю, в запросе данное условие будет выглядеть немного по другому :с
26. Medveedka 12.08.20 17:49 Сейчас в теме
(11) у меня последняя надежда на Вас :с
как можно изменить запрос?
31. Sergex 58 13.08.20 02:39 Сейчас в теме
(26) Вам повезло что у меня нашлась старая база клиента с УПП. Так то я не работаю с клиентами на конфах старше семейства УТ 11

Вот пригодный для вас запрос:

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

СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент

УПОРЯДОЧИТЬ ПО
КонтрагентНаименование

Я перенес из параметров запроса значение перечисления ВидыДоговоровКонтрагентов так как эту константу можно взять через ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
И вам придется добавить в параметры валюту евро
Заменив, в коде после запроса, строку " Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);"
На строку: " Запрос.УстановитьПараметр("Валюта", справочники.валюты.найтипокоду("978")"

Так же я из запроса убрал сделки, ибо тут - Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");

Вы все равно их выкидываете из таблицы с результатом запроса.



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

Но так как у вас в коде без изысков то и я в запросе присоединил таблицу курсов валют тупо на эту дату. По правилам ведения учета курс валюты при конверсии долга из одной валюты в другую должен браться на дату возникновения долга а не на произвольный момент времени.

С реализованным в вашем коде и унаследованным моим примером запроса методом вы получите разные рублевые массы долгов при неизменных показателях оборотов, формируя отчет на разные даты, просто в следствии волатильности евро!

Но переделать запрос так чтобы он конвертировал долг по курсу на дату его возникновения это уже совсем другая история. И тут потребуется измерение регистра ДокументРасчетовСКонтрагентом и несколько другое более сложное соединение с таблицей курсов валют

Впрочем возможно в исходной задаче и требуется оперативная оценка рублевой массы валютного долга по текущему курсу евро, тогда все нормально!
32. Medveedka 13.08.20 09:34 Сейчас в теме
(31) Доброе утро) Спасибо большое за очень подробную информацию, пошла пробовать) Обязательно отпишусь(
33. Medveedka 13.08.20 09:52 Сейчас в теме
(31) к сожалению что-то не то. Пишет ошибку, ссылаясь на строку
|КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
, а именно на число "978". Ну на скрине видно. Сам текст выглядит так:

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

|СГРУППИРОВАТЬ ПО
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент

|УПОРЯДОЧИТЬ ПО
|КонтрагентНаименование";

	Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза));
	//Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
	Запрос.УстановитьПараметр("Валюта", справочники.валюты.найтипокоду "978");
	
	Остатки = Запрос.Выполнить().Выгрузить();
Показать
Прикрепленные файлы:
36. Sergex 58 13.08.20 10:34 Сейчас в теме
(33) у меня код из консоли. я думал вы понимаете в этом :) замените "987" на ""987""
37. Medveedka 13.08.20 10:53 Сейчас в теме
(36) Спасибо большое :3
но ругается теперь, что неверное имя колонки в строке
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");


случайно не из-за ДоговорКонтрагентаВалютаВзаиморасчетов? В запросе вроде Вы это убрали, да? и теперь надо как-то по другому колонку назвать или вообще удалить? но вроде как вообще удалить не получится, там вроде дальше это применяется
38. Sergex 58 13.08.20 10:57 Сейчас в теме
(37) Ваш ход рассуждений верен. Удаляйте колонку из первого параметра метода Свернуть.
Должно остаться "Контрагент, ИНН, КонтрагентНаименование, ВыводитьСтроку"

И дальше везде удаляйте, оно там применяется у вас для конвертации в рубли в коде - закомментируйте теперь у вас в запросе уже все в рублях

Вот этот блок
                Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
                    СуммаВРублях =  ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
                Иначе 
                    Секция.Параметры.Сумма1     = 0;
                    СуммаВРублях                = ИНН_.Итог("Сумма1");
                КонецЕсли;

Должен выглядеть так
[1C-CODE]
//                Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
//                    СуммаВРублях =  ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
//                Иначе 
                    Секция.Параметры.Сумма1     = 0;
                    СуммаВРублях                = ИНН_.Итог("Сумма1");
//                КонецЕсли;
[/1C-CODE]

И вообще переделайте код вывода исходя из того что сумма у вас теперь всегда в рублях и обращение к тс.ДоговорКонтрагентаВалютаВзаиморасчетов больше не допустимо.
2. Medveedka 12.08.20 10:10 Сейчас в теме
Может это условие как то перенести перед выводом секции1?
3. user930087 12.08.20 10:16 Сейчас в теме
(2) Секция1.Параметры.Сумма1 = ИНН_.Итог("Сумма1"); сюда плюсовать итог по сумме 2, а весь код с выводом в секцию 2 убрать если не нужно туда выводить
5. Medveedka 12.08.20 10:27 Сейчас в теме +1.14 $m
(3) посмотрела, но пока немного не понимаю как и где именно это записать. Где немного понимаю вроде, но как. Итога по сумме два у меня в секции 2 нет.
4. starjevschik 12.08.20 10:25 Сейчас в теме
Это надо исправлять на этапе сбора данных для отчета, а не вывода.
То есть на этапе вывода тоже можно, конечно, но это удаление гландов через жжжж.
6. Medveedka 12.08.20 10:35 Сейчас в теме
(4) а что Вы имеете ввиду? Если я правильно понимаю, сбор данных идет в запросе который есть в посте. Больше здесь ничего такого нет. Есть конечно пара процедур, но там идет забор данных по лимитам.
7. dka80 20 12.08.20 11:04 Сейчас в теме
(6) данные собираются в запросе: либо запрос переделать, либо результат запроса выгружай в таблицу значений, обходи ее, проставляя итоги в нужные строки
9. starjevschik 12.08.20 11:16 Сейчас в теме
(6) я имею в виду буквально следующее: надо взять запрос, перенести его в консоль запросов, переписать так, чтобы результатом был правильный набор данных, потом этот набор данных выводить в табличный документ.
В процессе исправления ошибки не может быть никаких секций, потому что ошибка раньше, чем появляются секции.


(7) +1 именно так.
10. Medveedka 12.08.20 11:20 Сейчас в теме
(9) спасибо, попробую, правда сомневаюсь, что у меня получится что-то с запросом сделать
8. Medveedka 12.08.20 11:04 Сейчас в теме
Перенесла вот эт вещь перед выводом Секции1:

Для Каждого ттс из ИНН_ Цикл
					Если ттс.Сумма1 = 0 и ттс.Сумма2 = 0 Тогда 
						Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
						Для Каждого стр из Стр_Осн Цикл
							стр.ВыводитьСтроку = Ложь;
						КонецЦикла;
						Продолжить; 
					КонецЕсли;
					Секция1.Параметры.Контрагент = ттс.Контрагент;
					Секция1.Параметры.Сумма1     = ттс.Сумма1;

					СуммаВРублях                 = тс.Сумма2;
					Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда 
						СуммаВРублях  = ттс.Сумма1 * КурсЕвро.Курс;
					Иначе
						Секция.Параметры.Сумма1  = 0;
						СуммаВРублях             = тс.Сумма1;
					КонецЕсли;
					Секция1.Параметры.Сумма2  = СуммаВРублях;

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


Выводить стало куда надо, но из двух значений она выбирает последнее. Т.е. она делает обход, но первую строчку сразу забывает и выводит вторую только. Я так понимаю надо куда-то помещать значение из первого обхода, потом второй обход, потом результаты сложить. Но куда поместить значение из первого обхода?
21. starjevschik 12.08.20 14:46 Сейчас в теме
Выгрузить в таблицу, добавить колонку с суммой в валюте отчета, пройтись по таблице, перевести каждую строчку в валюту отчета. В строке должна быть дата курса.
Потом таблицу свернуть.
Наймите программиста, это не будет дорогая задача. Так намного эффективнее будет.
22. Medveedka 12.08.20 15:19 Сейчас в теме
(21) я правильно понимаю,что строчка
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов
в запросе это и есть колонка с валютой? дальше через Добавить параметр я добавляю колонку с валютой отчета? Или как добавить колонку эту?
Не кидайте пожалуйста, хочу сама :с
23. Medveedka 12.08.20 15:22 Сейчас в теме
(22) ну в смысле хочется без программиста обойтись
24. starjevschik 12.08.20 15:31 Сейчас в теме
(23) ну здесь получается, что "хочу обойтись" = "хочу, чтобы мне сделали бесплатно". По-моему, это не совсем правильно. Это же работа, работа должна быть оплачена. Я думаю, что здесь много людей, которые могут сделать эту работу, но почему они вдруг должны работать за так, не совсем понятно.
Работа не очень большая, я думаю, что за тыщу-полторы вполне реально найти исполнителя.
25. Medveedka 12.08.20 15:38 Сейчас в теме
(24) в целом то с Вами полностью согласна. Но просто на данном форуме уже на раз выручали. Дело в том, что только учусь всему, и после каждой помощи анализирую на будущее что и как можно сделать. С таким типом еще не сталкивалась, потому сюда и обратилась.
29. tango 540 12.08.20 22:45 Сейчас в теме
(25) а тут программисты как налетят, как налетят :)
30. Sergex 58 13.08.20 01:30 Сейчас в теме
(23) Хочешь обойтись без программиста - стань им. Это ж то же самое что: как обойтись без уборщицы? - помыть полы самому!

Щас приведу пример как получить и пересчитать валюту в запросе.
27. bill33 12.08.20 20:40 Сейчас в теме
Предлагаю переделать текст запроса вот так и тогда всегда будет контрагент с одной сделкой и одной валютой:
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
                   |	СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) КАК Сумма1,
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
                   |	ИСТИНА КАК ВыводитьСтроку,
                   |	МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов) КАК ДоговорКонтрагентаВалютаВзаиморасчетов,
                   |	СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) КАК Сумма2,
                   |	МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Сделка) КАК Сделка
                   |ИЗ
                   |	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
                   |ГДЕ
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = &СПокупателем
                   |	И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
                   |
                   |СГРУППИРОВАТЬ ПО
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН,
                   |	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |	ДоговорКонтрагентаВалютаВзаиморасчетов,
                   |	КонтрагентНаименование";
Показать
Тем более Сделка судя по куда вообще нигде не нужна
35. Medveedka 13.08.20 10:13 Сейчас в теме
(27) доброе утро) по вашему запросу у меня почему то сумма1 перенеслась в сумму2, сумма 2 вообще не появилась. Хотя сумма1 показана верная
41. Sergex 58 14.08.20 17:34 Сейчас в теме
(35) Валюту надо брать не максимальную же :) а пересчитывать сумму в рубли в запросе!
28. tango 540 12.08.20 22:40 Сейчас в теме
а СКД у вас в конфигураторе есть?
ОпределитьВсеЛимиты(); 
- это что здесь вообще?

у вас один такой контрагент с двумя договорами в разной валюте?
34. Medveedka 13.08.20 09:57 Сейчас в теме
(28) определить все лимиты это функция отсюда же)

скд есть, но отчет построен не на нем

такой контрагент один
39. tango 540 13.08.20 17:03 Сейчас в теме
Я бы заюзал СКД, табличку можно использовать ту же для макета, никто и не догадается.
В запросе использовать исключение именно и только для этого контрагента.
Здесь важна функция ИспользоватьЛимиты, ее тоже надо в СКД
40. 1cmailru 4 14.08.20 10:40 Сейчас в теме
Есть ощущение что код рабочий.
Вот эта строчка
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");

по идее, должна решать, и раздвоение может быть или при наличии договоров с разной валютой или двух контрагентов с одинаковым ИНН.

Не может быть в справочнике два контрагента с одинаковым ИНН ?
42. starik-2005 3036 21.08.20 13:50 Сейчас в теме
"Крофь ис глас патикла" (с)

Нафига группировать в запросе по полям (особенно по вложенным), потом все еще раз сворачивать? Нафига валюту проверять на код ЕВРО? Ну и прочее "нафига". Примитивное унылое г-но, решающееся тремя строчками на СКД, выкатили на всеобщее обозрение... Я в акуе...
Оставьте свое сообщение

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