Обход результата запроса через запятую

1. user1599296 16.08.21 12:24 Сейчас в теме
Добрый день, помогите пожалуйста . Задача такая есть результат запроса :

№ Договора Контрагент АдресЭП тел
Д1 К1 Адрес1 Т1

Д1 К1 Адрес1 Т2

Д1 К1 Адрес2 Т1

Д1 К1 Адрес2 Т2


Нужно выгрузить данные на форму в виде:
№ Договора Контрагент АдресЭП тел
Д1 К1 АдресЭП1, АдресЭП2 Т1,Т2



Спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ubnkfl 16.08.21 12:31 Сейчас в теме
Если у договора контрагента владелец - контрагент (а скорее всего так и есть), сделайте итоги по договору контрагента и, обходя детальные записи - программно собирайте свою строку. Например, в виде массива, который потом можно превратить строку с помощью СтрСоединить(МассивСлов, ", ").
3. M_A_D 195 16.08.21 12:32 Сейчас в теме
(2)не успел написать))) Обход по группировкам будет лучшим вариантом в данной ситуации, по крайней мере, из тех которые приходят в голову)))
4. user1599296 16.08.21 12:37 Сейчас в теме
Посмотрите пожалуйста код обхода, у меня Итоги по номеру договора и мой код задваивает значения в ячейках.

Запрос = Новый Запрос;
	Запрос.Текст = СокрЛП(Объект.УсловиеКомплекта.Условие);
	Запрос.УстановитьПараметр("Дата", Дата);
	Если ЭтаФорма.Объект.УсловиеКомплекта= Справочники.ЛТ_УсловияКомплектовМакетов.НайтиПоНаименованию("Напоминание_пролонгация") Тогда
		РезультатЗапроса = Запрос.Выполнить();
		ВыборкаДоговорЛизинга = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ДоговорЛизинга"); 	
		Пока ВыборкаДоговорЛизинга.Следующий() Цикл
			НоваяСтрока=Договоры.Добавить();
			НоваяСтрока.ДоговорЛизинга=ВыборкаДоговорЛизинга.ДоговорЛизинга;
			ВыборкаДетали= ВыборкаДоговорЛизинга.Выбрать();
			//Телефон="";
			//АдресЭП="";
			НачалоСтроки=Истина;
			Пока ВыборкаДетали.Следующий() Цикл
				//сч=0;
				//сч=сч+1;
				//Если сч>1 Тогда
				Если НачалоСтроки Тогда
				Телефон = СокрЛП(ВыборкаДетали.Телефон);
				ВсеАдресаЭП =СокрЛП(ВыборкаДетали.АдресЭП);
				НачалоСтроки=Ложь;
				//КонецЕсли;
			Иначе
				ВсеАдресаЭП = ВсеАдресаЭП+", "+СокрЛП(ВыборкаДетали.АдресЭП);
				Телефон= Телефон+","+СокрЛП(ВыборкаДетали.Телефон);
				КонецЕсли;
				АдресЭП =СокрЛП(ВыборкаДетали.АдресЭП);	
				Контрагент=ВыборкаДетали.Контрагент;
				
			КонецЦикла;
			//АдресЭП =СокрЛП(ВыборкаДетали.АдресЭП);
			НоваяСтрока.Контрагент= Контрагент;     
			Новаястрока.ВсеАдресаЭП = Лев(ВсеАдресаЭП,СтрДлина(ВсеАдресаЭП)-2);
			НоваяСтрока.АдресЭП = АдресЭП;
			НоваяСтрока.Телефон = Лев(Телефон,СтрДлина(Телефон)-2);
		КонецЦикла;
Показать
5. ubnkfl 16.08.21 13:15 Сейчас в теме
Как без текста запроса можно что-то понять?
6. FatPanzer 16.08.21 13:16 Сейчас в теме
7. user1599296 16.08.21 13:16 Сейчас в теме
(5) Добавляю текст запроса ))
ВЫБРАТЬ  первые 40
	ИБР_СтатусыДоговоровСрезПоследних.Договоры.Ссылка КАК ДоговорыСсылка,
	ИБР_СтатусыДоговоровСрезПоследних.Статусы КАК Статусы
ПОМЕСТИТЬ СтатусыДоговоров
ИЗ
	РегистрСведений.ИБР_СтатусыДоговоров.СрезПоследних(, ) КАК ИБР_СтатусыДоговоровСрезПоследних
ГДЕ
	ИБР_СтатусыДоговоровСрезПоследних.Статусы = ЗНАЧЕНИЕ(Справочник.ИБР_СтатусыДоговоров.Действует)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЛТ_ГрафикиПлатежейОбороты.ДоговорЛизинга КАК ДоговорЛизинга,
	МАКСИМУМ(ЛТ_ГрафикиПлатежейОбороты.ДатаНачисления) КАК ДатаНачисления
ПОМЕСТИТЬ ДатаОкончанияДЛ
ИЗ
	РегистрНакопления.ЛТ_ГрафикиПлатежей.Обороты КАК ЛТ_ГрафикиПлатежейОбороты
ГДЕ
	ЛТ_ГрафикиПлатежейОбороты.ДатаНачисления > ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 1)

СГРУППИРОВАТЬ ПО
	ЛТ_ГрафикиПлатежейОбороты.ДоговорЛизинга
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДатаОкончанияДЛ.ДоговорЛизинга КАК ДоговорЛизинга,
	ДатаОкончанияДЛ.ДатаНачисления КАК ДатаНачисления
ПОМЕСТИТЬ ДЛ30092021
ИЗ
	СтатусыДоговоров КАК СтатусыДоговоров
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатаОкончанияДЛ КАК ДатаОкончанияДЛ
		ПО (ДатаОкончанияДЛ.ДоговорЛизинга.Ссылка = СтатусыДоговоров.ДоговорыСсылка)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЛТ_ДоговорСтрахованияУсловияСтрахования.ДатаНачала КАК ДатаНачала,
	ЛТ_ДоговорСтрахованияУсловияСтрахования.ДатаОкончания КАК ДатаОкончания,
	ЛТ_ДоговорСтрахованияУсловияСтрахования.Оплачен КАК Оплачен,
	ЛТ_ДоговорСтрахованияУсловияСтрахования.Ссылка.Плательщик КАК Плательщик,
	ЛТ_ДоговорСтрахованияУсловияСтрахования.Ссылка.ТипДоговора КАК ТипДоговора,
	ЛТ_ДоговорСтрахованияУсловияСтрахования.Ссылка.Основание КАК Основание
ПОМЕСТИТЬ ДС
ИЗ
	Документ.ЛТ_ДоговорСтрахования.УсловияСтрахования КАК ЛТ_ДоговорСтрахованияУсловияСтрахования
ГДЕ
	ЛТ_ДоговорСтрахованияУсловияСтрахования.Оплачен = ЛОЖЬ
	И ЛТ_ДоговорСтрахованияУсловияСтрахования.Ссылка.Плательщик ПОДОБНО "Лизингополучатель%"
	И ЛТ_ДоговорСтрахованияУсловияСтрахования.Ссылка.ТипДоговора <> ЗНАЧЕНИЕ(Перечисление.ИБР_ТипыДоговоровСтрахования.Осаго)
	И ЛТ_ДоговорСтрахованияУсловияСтрахования.ДатаНачала МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДС.ДатаНачала КАК ДатаНачала,
	ДС.ДатаОкончания КАК ДатаОкончания,
	ДС.Оплачен КАК Оплачен,
	ДС.Плательщик КАК Плательщик,
	ДС.ТипДоговора КАК ТипДоговора,
	ДЛ30092021.ДоговорЛизинга КАК ДоговорЛизинга,
	ДЛ30092021.ДатаНачисления КАК СрокОкончанияДоговора
ПОМЕСТИТЬ ДС_ДЛ
ИЗ
	ДЛ30092021 КАК ДЛ30092021
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДС КАК ДС
		ПО ДЛ30092021.ДоговорЛизинга.Ссылка = ДС.Основание.Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка,
	КонтрагентыКонтактнаяИнформация.АдресЭП КАК АдресЭП
ПОМЕСТИТЬ Адрес_ЭП
ИЗ
	Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
ГДЕ
	КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)

СГРУППИРОВАТЬ ПО
	КонтрагентыКонтактнаяИнформация.Ссылка,
	КонтрагентыКонтактнаяИнформация.АдресЭП
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КонтрагентыКонтактнаяИнформация.Ссылка КАК Ссылка,
	ПОДСТРОКА(КонтрагентыКонтактнаяИнформация.НомерТелефона, 1, 11) КАК НомерТелефона
ПОМЕСТИТЬ Телефон
ИЗ
	Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
ГДЕ
	КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Адрес_ЭП.Ссылка КАК Ссылка,
	Адрес_ЭП.АдресЭП КАК АдресЭП,
	Телефон.Ссылка КАК Ссылка1,
	Телефон.НомерТелефона КАК НомерТелефона
ПОМЕСТИТЬ Телефон_АдресЭП
ИЗ
	Адрес_ЭП КАК Адрес_ЭП
		ПОЛНОЕ СОЕДИНЕНИЕ Телефон КАК Телефон
		ПО (Адрес_ЭП.Ссылка = Телефон.Ссылка)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДС_ДЛ.ДоговорЛизинга КАК ДоговорЛизинга,
	Телефон_АдресЭП.Ссылка КАК Контрагент,
	Телефон_АдресЭП.АдресЭП КАК АдресЭП,
	Телефон_АдресЭП.НомерТелефона КАК Телефон
ИЗ
	ДС_ДЛ КАК ДС_ДЛ
		ЛЕВОЕ СОЕДИНЕНИЕ Телефон_АдресЭП КАК Телефон_АдресЭП
		ПО (ДС_ДЛ.ДоговорЛизинга.Контрагент.Ссылка = Телефон_АдресЭП.Ссылка.Ссылка)

СГРУППИРОВАТЬ ПО
	Телефон_АдресЭП.АдресЭП,
	Телефон_АдресЭП.НомерТелефона,
	Телефон_АдресЭП.Ссылка,
	ДС_ДЛ.ДоговорЛизинга
ИТОГИ ПО
	ДоговорЛизинга
Показать
8. ubnkfl 16.08.21 13:21 Сейчас в теме
(7) если у контрагента два телефона - то будет две строки. Если три - то три.
Проблема в запросе самом, а не коде вашем.
Но это не точно. Что консоль запросов показывает? Есть дубли?
9. user1599296 16.08.21 13:34 Сейчас в теме
(8)Да согласна у контрагента например может быть две электронки и три телефона. Мне нужна строка: тел1, тел 2, тел. 3
Адрес ЭП1, АдресЭП2.
А у меня получаются дубли, сколько адресов электронной почты столько и дублей.
14. ubnkfl 16.08.21 14:36 Сейчас в теме
(9) сделайте тогда пакетный запрос из двух запросов. В первом - то что у вас сейчас с итогами (т.е. сделать выборку по договору контрагента без контактной информации), уберите итоге и оставьте плоскую выборку. Второй запрос возвращает всю контактную информацию.
Выполняете пакет запросов.
ВыборкаДог = это выборка по договорам
ВыборкаКИ - выборка по конт. инф

Пока ВыборкаДог.Следующий() Цикл
ВыборкаКИ.Сбросить();
ПараметрыОтбора = Новый Структура("Контрагент", ВыборкаДог.Контрагент);
    Пока ВыборкаКИ.НайтиСледующий(ПараметрыОтбора) Цикл
    ...
    КонецЦикла;
 ...
КонецЦикла;

P.S. в (13) вам это уже посоветовали.
15. user1599296 16.08.21 15:07 Сейчас в теме
(14)Т.е я могу выбрать временные таблицы из запроса и работать только с ними:Например ДС_ДЛ, Адрес_ЭП и Телефон и только с этими таблицами работать?
16. ubnkfl 16.08.21 15:20 Сейчас в теме
(15)
Да. У вас будет что-то типа
Запрос.Текст = "ВЫБРАТЬ * ИЗ ДС_ДЛ; ВЫБРАТЬ * ИЗ Адрес_ЭП";
Пакет = Запрос.ВыполнитьПакет();
РазмерПакета = Пакет.Количество();
ВыборкаДок = Пакет[РазмерПакета-2].Выбрать();
ВыборкаКИ = Пакет[РазмерПакета-1].Выбрать();
10. user925427 126 16.08.21 14:06 Сейчас в теме
Используйте пакетный запрос, чтобы не пихать невпихуемое в одну таблицу. В одной таблице запроса связь контрагент - телефон, в другой контрагент - адрес эп. Потом выборками по этим таблицам РезультатЗапроса[i] по одному контрагенту сформируйте нужную строку.
11. FatPanzer 16.08.21 14:14 Сейчас в теме
(10) Зачем? Можно просто сделать итоги по виду контактной информации...
12. user1599296 16.08.21 14:26 Сейчас в теме
(10) Я правильно Вас поняла: первый запрос Договор, контрагент, АдресЭП - обрабатываем запрос.
Второй Запрос : Контрагент и телефон и тоже обрабатываем запрос?
Этот запрос мне нужен для обработки печати по списку .
13. user925427 126 16.08.21 14:33 Сейчас в теме
(12) У Вас уже есть временные таблицы в запросе. Сделайте из них выборку, не соединяя с другими таблицами. Замените Запрос.Выполнить() на Запрос.ВыполнитьПакет(). Под индексами, соответствующими номерам таблиц (с 0), получите таблицы с нужными соответствиями. И обходите так, как вам нужно. Можно и так, как предложено в (11), но этим способом будет понятнее, как мне представляется.
Оставьте свое сообщение

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