Имя: Пароль:
1C
 
Как оптимизировать запрос?
0 program345
 
04.07.25
10:44
Привет,

получаю логин пароль из рег.Сведений, получаю токен соответствующего склада, запросом в цикле ищу оплаченные заказы, и отправляю по ним данные по api. Как уйти от запроса в цикле? Насколько знаю по стандартам 1с это моветон.


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

		ЗапросВыкупленные = Новый Запрос;
		ЗапросВыкупленные.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ЗаказКлиента.НомерПоДаннымКлиента КАК НомерПоДаннымКлиента,
		|	ЗаказКлиента.Ссылка КАК Ссылка,
		|	ЗаказКлиента.Склад КАК Склад,
		|	ЧекККМТовары.Ссылка КАК ЧекККМСсылка
		|ИЗ
		|	Документ.ЗаказКлиента КАК ЗаказКлиента
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ.Товары КАК ЧекККМТовары
		|		ПО ЗаказКлиента.Ссылка = ЧекККМТовары.ЗаказКлиента
		|			И (ЧекККМТовары.Ссылка.Проведен)
		|ГДЕ
		|	ЗаказКлиента.ДополнительныеРеквизиты.Свойство = &Свойство
		|	И ЗаказКлиента.ДополнительныеРеквизиты.Значение = &Значение
		|	И ЗаказКлиента.Проведен
		|	И ЗаказКлиента.КаналПродаж = &КаналПродаж
		|	И ЗаказКлиента.Склад = &Склад";  
		
		
		ЗапросВыкупленные.УстановитьПараметр("Свойство",СвойствоСтатусЗазаза); 
		ЗапросВыкупленные.УстановитьПараметр("Значение",ЗначениеУведомлениеОПоступленииЗаказаПередано);  
		ЗапросВыкупленные.УстановитьПараметр("КаналПродаж", КаналыПродаж);  
		ЗапросВыкупленные.УстановитьПараметр("Склад",ВыборкаСклад.Склад);  
		
		РезультатЗапроса = ЗапросВыкупленные.Выполнить();    
		
	КонецЦикла;
1 vicof
 
04.07.25
10:27
СОЕДИНЕНИЯ спасут мир
2 lEvGl
 
гуру
04.07.25
10:36
а где тут вложенный запрос
в цикле что ле

вот это что то стремное

ГДЕ
		|	ЗаказКлиента.Проведен
		|	И ЗаказКлиента.ДополнительныеРеквизиты.Свойство = &Свойство
		|	И ЗаказКлиента.ДополнительныеРеквизиты.Значение = &Значение


надо брать из ТЧ ДопРеквизиты документа с внутренней связкой к регистру АПИ и еще одной внутренней связкой К НЕМУ же с ТЧ документа Чек
три таблицы, две связи - между 1й и 2й, между 2й и 3й
3 Garykom
 
гуру
04.07.25
10:30
Объедини два запроса в один, запрос в цикле не требуется
4 Волшебник
 
04.07.25
10:35
(0) Очередной бред
5 LoneMan
 
04.07.25
10:42
Ну хотя бы так навскидку
ВЫБРАТЬ
    ДокументЗаказКлиента.Ссылка КАК ЗаказКлиента,
    ДокументЗаказКлиента.Склад КАК Склад,
    ДокументЗаказКлиента.КаналПродаж КАК КаналПродаж,
    МАКСИМУМ(ДокументЧекККМ.Ссылка) КАК ЧекККМ
ПОМЕСТИТЬ ОплаченныеЗаказыКлиентов
ИЗ
    Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ДокументЗаказКлиента
        ПО (ЗаказКлиентаДополнительныеРеквизиты.Ссылка = ДокументЗаказКлиента.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ.Товары КАК ЧекККМТовары
        ПО (ДокументЗаказКлиента.Ссылка = ЧекККМТовары.ЗаказКлиента)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ДокументЧекККМ
        ПО (ЧекККМТовары.Ссылка = ДокументЧекККМ.Ссылка)
ГДЕ
    ЗаказКлиентаДополнительныеРеквизиты.Свойство = &Свойство
    И ЗаказКлиентаДополнительныеРеквизиты.Значение = &Значение
    И ДокументЧекККМ.Проведен

СГРУППИРОВАТЬ ПО
    ДокументЗаказКлиента.Ссылка,
    ДокументЗаказКлиента.Склад,
    ДокументЗаказКлиента.КаналПродаж
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОплаченныеЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента,
    ОплаченныеЗаказыКлиентов.Склад КАК Склад,
    ОплаченныеЗаказыКлиентов.КаналПродаж КАК КаналПродаж,
    ОплаченныеЗаказыКлиентов.ЧекККМ КАК ЧекККМ,
    API.Логин КАК Логин,
    API.Пароль КАК Пароль
ИЗ
    ОплаченныеЗаказыКлиентов КАК ОплаченныеЗаказыКлиентов
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.API КАК API
        ПО ОплаченныеЗаказыКлиентов.Склад = API.Склад
            И ОплаченныеЗаказыКлиентов.КаналПродаж = API.КаналПродаж
6 lEvGl
 
гуру
04.07.25
10:46
(5) как то соединений многовато, условия где ненужны, ну и  работать, если так навскидку - не будет
да и вт наверно лишняя
7 Волшебник
 
04.07.25
10:46
(5) Забыли период
8 Garykom
 
гуру
04.07.25
11:04
(6) ВТ есть смысл сделать для Склад|Логин|Пароль
но совсем не обязательно
и да в (5) очередная глупость да еще с группировкой
9 LoneMan
 
04.07.25
11:12
Нормальный запрос. Все таблицы и соединения будут использованы в итоговом запросе на стороне СУБД.
В контекст и оптимизацию не вникал, учитывая, что в исходном запросе вообще непонятно, что происходит.
10 Мультук
 
гуру
04.07.25
11:13
(0)

если складов в районе 10 штук, то лучше оставить текущий говнокод и не писать новый.
12 Garykom
 
гуру
04.07.25
11:46
(9) Ты кучу записей кладешь в ВТ а затем из нее снова забираешь
Зачем?

Записей по складам с логин/пароль явно меньше, если и класть в ВТ то их
Да еще универсальная ВТ (с запросом) для аналогичных других выгрузок по складам

Но имхо одним запросом без ВТ (и без группировок) все прекрасно делается

У тебя же чатгопотный идиотизм с
МАКСИМУМ(ДокументЧекККМ.Ссылка) КАК ЧекККМ
и
СГРУППИРОВАТЬ ПО
13 LoneMan
 
04.07.25
11:53
(12) А, ты об этом. Да не, вообще не парился. Разумеется, для реальной задачи написал бы по-другому.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан