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

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 57 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 57 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 57 13.08.20 10:34 Сейчас в теме
(33) у меня код из консоли. я думал вы понимаете в этом :) замените "987" на ""987""
37. Medveedka 13.08.20 10:53 Сейчас в теме
(36) Спасибо большое :3
но ругается теперь, что неверное имя колонки в строке
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");


случайно не из-за ДоговорКонтрагентаВалютаВзаиморасчетов? В запросе вроде Вы это убрали, да? и теперь надо как-то по другому колонку назвать или вообще удалить? но вроде как вообще удалить не получится, там вроде дальше это применяется
38. Sergex 57 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 506 12.08.20 22:45 Сейчас в теме
(25) а тут программисты как налетят, как налетят :)
30. Sergex 57 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 57 14.08.20 17:34 Сейчас в теме
(35) Валюту надо брать не максимальную же :) а пересчитывать сумму в рубли в запросе!
28. tango 506 12.08.20 22:40 Сейчас в теме
а СКД у вас в конфигураторе есть?
ОпределитьВсеЛимиты(); 
- это что здесь вообще?

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

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

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

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

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день