Как бы вы упростили этот запрос?

1. tomskiy_proger1c 13 23.01.24 13:15 Сейчас в теме
ВЫБРАТЬ
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента КАК ДоговорКонтрагента,
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец,
	СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга КАК СчетОсновногоДолга,
	ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
	ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
	ХозрасчетныйОстаткиИОбороты.Период КАК Период
ПОМЕСТИТЬ ВТ_Долги
ИЗ
	РегистрСведений.СчетаУчетаРасчетовПоЗаймамИКредитам КАК СчетаУчетаРасчетовПоЗаймамИКредитам
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , День, , , {(&ВидыСубконто)}, {(Субконто1 = &Контрагент), (Субконто2 = &ДоговорКонтрагента)}) КАК ХозрасчетныйОстаткиИОбороты
		ПО СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга = ХозрасчетныйОстаткиИОбороты.Счет
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец = ХозрасчетныйОстаткиИОбороты.Субконто1
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента = ХозрасчетныйОстаткиИОбороты.Субконто2
ГДЕ
	(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт > 0
			ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт > 0)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента КАК ДоговорКонтрагента,
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец,
	СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга КАК СчетОсновногоДолга,
	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
	ХозрасчетныйОстаткиИОбороты.Период КАК Период
ПОМЕСТИТЬ ВТ_Проценты
ИЗ
	РегистрСведений.СчетаУчетаРасчетовПоЗаймамИКредитам КАК СчетаУчетаРасчетовПоЗаймамИКредитам
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , День, , , {(&ВидыСубконто)}, {(Субконто1 = &Контрагент), (Субконто2 = &ДоговорКонтрагента)}) КАК ХозрасчетныйОстаткиИОбороты
		ПО СчетаУчетаРасчетовПоЗаймамИКредитам.СчетУчетаПроцентов = ХозрасчетныйОстаткиИОбороты.Счет
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец = ХозрасчетныйОстаткиИОбороты.Субконто1
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента = ХозрасчетныйОстаткиИОбороты.Субконто2
ГДЕ
	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт > 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Долги.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ВТ_Долги.ДоговорКонтрагентаВладелец КАК ДоговорКонтрагентаВладелец,
	ВТ_Долги.СчетОсновногоДолга КАК СчетОсновногоДолга,
	ВТ_Долги.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
	ВТ_Долги.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
	ВТ_Проценты.СуммаОборотДт КАК СуммаОборотДт,
	ВТ_Проценты.СуммаОборотДт / 2 * 100 КАК Поле1,
	ВТ_Проценты.СуммаОборотДт / 2 * 100 * 365 КАК Поле2,
	ВТ_Долги.Период КАК Период
ПОМЕСТИТЬ ВТ_ИТОГ
ИЗ
	ВТ_Долги КАК ВТ_Долги
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Проценты КАК ВТ_Проценты
		ПО ВТ_Долги.ДоговорКонтрагента = ВТ_Проценты.ДоговорКонтрагента
			И ВТ_Долги.ДоговорКонтрагентаВладелец = ВТ_Проценты.ДоговорКонтрагентаВладелец
			И ВТ_Долги.Период = ВТ_Проценты.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ИТОГ.Период КАК Период,
	ВТ_ИТОГ.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ВТ_ИТОГ.ДоговорКонтрагентаВладелец КАК Контрагент,
	ВТ_ИТОГ.СчетОсновногоДолга КАК Счет,
	ВТ_ИТОГ.СуммаНачальныйОстатокДт КАК СальдоНаНачало,
	ВТ_ИТОГ.СуммаКонечныйОстатокДт КАК СальдоНаКонец,
	ВТ_ИТОГ.СуммаОборотДт КАК НачисленныеПроценты,
	ВТ_ИТОГ.Поле1 КАК ПроцентнаяСтавкаДневная,
	ВТ_ИТОГ.Поле2 КАК ПроцентнаяСтавкаГодовая
ИЗ
	ВТ_ИТОГ КАК ВТ_ИТОГ

УПОРЯДОЧИТЬ ПО
	Контрагент
Показать



отчет формируется долго, как можно оптимизировать,чтобы выполнение было более быстрое?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. SAShikutkin 14 23.01.24 13:35 Сейчас в теме
Смотрите ТЖ и/или Profiler СУБД
4. Vlan 36 23.01.24 14:18 Сейчас в теме
Консоль запросов Вам в помощь. Берете каждый кусок запроса и смотрите, сколько строк он получает. Анализируете те, у которых их много, на предмет оптимизации: чем больше отборов, тем меньше строк. Как-то так.
5. tomskiy_proger1c 13 23.01.24 15:04 Сейчас в теме
(4) а если везде строк много и отборов больше нельзя напихать, тогда что?
6. Fatenm 23.01.24 15:14 Сейчас в теме
Для начала ограничить период формирования отчета
8. tomskiy_proger1c 13 23.01.24 15:43 Сейчас в теме
(6) он ограничивается, через стандартный период когда как отчет, ну или когда через консоль отрабатываю, то ставлю параметры на начало и конец. Так что это не выход
7. soft_wind 23.01.24 15:35 Сейчас в теме
можно попробовать такую оптимизацию
1.сначала из регистра СчетаУчетаРасчетовПоЗаймамИКредитам отберите учетную аналитику (один раз во временную таблицу)
2.ОДИН раз отберите данные из регистра Хозрасчетный.ОстаткиИОбороты установив в параметрах данные из п.1) (поместите в ВТ)
3.на основании этих ВТ (из п. 1 и 2) получите результирующую таблицу
dehro; Sashares; +2 Ответить
9. tomskiy_proger1c 13 23.01.24 18:49 Сейчас в теме
10. Vlan 36 24.01.24 11:02 Сейчас в теме
(9) Внимательно посмотрите на свой запрос. Зачем Вам временная таблица ВТ_Итог? ВТ_Долги и ВТ_Проценты получаются абсолютно одинаковым запросом. Зачем?
Fox-trot; +1 Ответить
11. tomskiy_proger1c 13 24.01.24 11:16 Сейчас в теме
(10) они не абсолютно одинаковые, в первой я получаю "Долги", во второй "Проценты", а в третьей нужные данные из первой и второй.
12. Vlan 36 24.01.24 11:37 Сейчас в теме
(11) А если через ВЫБОР КОГДА?
Если оборот больше нуля - заполняем колонку Проценты, если нач/кон остаток - Долги. Это навскидку, Вам виднее.
13. tomskiy_proger1c 13 24.01.24 11:40 Сейчас в теме
(12)
ВЫБРАТЬ
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента КАК ДоговорКонтрагента,
	СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец,
	СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга КАК СчетОсновногоДолга,
	ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
	ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
	ХозрасчетныйОстаткиИОбороты.Период КАК Период,
	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт / 2 * 100 КАК Поле1,
	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт / 2 * 100 * 365 КАК Поле2
ПОМЕСТИТЬ ВТ_ИТОГ
ИЗ
	РегистрСведений.СчетаУчетаРасчетовПоЗаймамИКредитам КАК СчетаУчетаРасчетовПоЗаймамИКредитам
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , День, , , {(&ВидыСубконто)}, {(Субконто1 = &Контрагент), (Субконто2 = &ДоговорКонтрагента)}) КАК ХозрасчетныйОстаткиИОбороты
		ПО СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга = ХозрасчетныйОстаткиИОбороты.Счет
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец = ХозрасчетныйОстаткиИОбороты.Субконто1
			И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента = ХозрасчетныйОстаткиИОбороты.Субконто2
ГДЕ
	(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт > 0
			ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт > 0)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ИТОГ.Период КАК Период,
	ВТ_ИТОГ.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ВТ_ИТОГ.ДоговорКонтрагентаВладелец КАК Контрагент,
	ВТ_ИТОГ.СчетОсновногоДолга КАК Счет,
	ВТ_ИТОГ.СуммаНачальныйОстатокДт КАК СальдоНаНачало,
	ВТ_ИТОГ.СуммаКонечныйОстатокДт КАК СальдоНаКонец,
	ВТ_ИТОГ.СуммаОборотДт КАК НачисленныеПроценты,
	ВТ_ИТОГ.Поле1 КАК ПроцентнаяСтавкаДневная,
	ВТ_ИТОГ.Поле2 КАК ПроцентнаяСтавкаГодовая
ИЗ
	ВТ_ИТОГ КАК ВТ_ИТОГ

УПОРЯДОЧИТЬ ПО
	Контрагент
Показать


я попробовал так сократить, но расчеты начали считаться не так (Поле1 и 2)
16. Sashares 35 24.01.24 11:51 Сейчас в теме
(13)Добавь в ГДЕ условие на СуммаОборотДт, а не только на остатки.
14. tomskiy_proger1c 13 24.01.24 11:40 Сейчас в теме
(12) а так в принципе, что то похожее на правду
15. user956512 24.01.24 11:48 Сейчас в теме
Поставить в порядке вывода полей и псевдонимы к ним подставить из второго запроса? Ну и сортировку заодно в первый запрос перекинуть, тогда второй и не нужен! Как и создание временной таблицы.
17. tomskiy_proger1c 13 24.01.24 12:31 Сейчас в теме
(15)(16) нет тот вариант, что я скинул совсем не тот, тк пропала логика со СЧЕТАМИ, там в первой и второй таблице определялся счет из рег св и получаются данные из рег бух, а так все рушится и выводится только для долгов без процентов
18. user956512 24.01.24 12:36 Сейчас в теме
(17) Добавить нужно
ГДЕ
    ...
    ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаОборотДт > 0

и условие при делении поставить, чтобы ошибку при 0 не давало.
19. tomskiy_proger1c 13 24.01.24 12:38 Сейчас в теме
(18) я добавил (ГДЕ...), все осталось такое же, причину я описал в (17)
20. user956512 24.01.24 13:11 Сейчас в теме
(19) в ПО
...
И СчетаУчетаРасчетовПоЗаймамИКредитам.СчетУчетаПроцентов = ХозрасчетныйОстаткиИОбороты.Счет
Еще нужно добавить.
21. Vlan 36 24.01.24 13:25 Сейчас в теме
(19) Есть РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты
Из него мы вытягиваем СуммаОборотДт, если она больше 0 и счет равен СчетаУчетаРасчетовПоЗаймамИКредитам.СчетУчетаПроцентов
а также
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт и ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт, если они не 0 и счет равен СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга
Периоды регистров, конечно, должны совпадать.
22. Sashares 35 24.01.24 13:46 Сейчас в теме
(19) Выбрать данные во временные таблицы можно так:
ВЫБРАТЬ
СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента КАК ДоговорКонтрагента,
СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец,
СчетаУчетаРасчетовПоЗаймамИКредитам.СчетОсновногоДолга КАК СчетОсновногоДолга, 
СчетаУчетаРасчетовПоЗаймамИКредитам.СчетУчетаПроцентов КАК СчетУчетаПроцентов 
Поместить ДанныеРС
Из  РегистрСведений.СчетаУчетаРасчетовПоЗаймамИКредитам КАК СчетаУчетаРасчетовПоЗаймамИКредитам
;
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.Период КАК Период

ПОМЕСТИТЬ ДанныеРБ
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , День, , , {(&ВидыСубконто)}, {(Субконто1 = &Контрагент), (Субконто2 = &ДоговорКонтрагента)} (Субконто1, Субконто2) В
					(ВЫБРАТЬ
						ДанныеРС.ДоговорКонтрагентаВладелец КАК ДоговорКонтрагентаВладелец,
						ДанныеРС.ДоговорКонтрагента КАК ДоговорКонтрагента
					ИЗ
						ДанныеРС КАК ДанныеРС)) КАК ХозрасчетныйОстаткиИОбороты
 ГДЕ
    (ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт > 0
            ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаОборотДт > 0
 ИЛИ ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт > 0)
Показать


Осталось их соединить. Отдельно по счету долга, отдельно по счету процентов.
23. BotMan4 15 25.01.24 13:56 Сейчас в теме
Самое простое - это вставить "Выразить()" всякие ХозрасчетныйОстаткиИОбороты.Субконто1 в нужный тип.
24. Sashares 35 25.01.24 15:09 Сейчас в теме
25. BotMan4 15 25.01.24 17:08 Сейчас в теме
(24)
В смысле зачем? чтобы убрать левые соединения, если составные типы.
26. Sashares 35 25.01.24 17:52 Сейчас в теме
(25)Какие левые соединения у полей Субконто1 и Субконто2 в запросе из первого сообщения ТС?
Их даже в выборке нет.
27. Fox-trot 163 25.01.24 20:58 Сейчас в теме
условие :
И СчетаУчетаРасчетовПоЗаймамИКредитам.ДоговорКонтрагента.Владелец = ХозрасчетныйОстаткиИОбороты.Субконто1

вообще можно удалить
Оставьте свое сообщение

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