Имя: Пароль:
1C
 
Как оптимизировать запрос?
↓ (Волшебник 08.07.2025 09:29)
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) А, ты об этом. Да не, вообще не парился. Разумеется, для реальной задачи написал бы по-другому.
14 program345
 
08.07.25
08:32
Всех благодарю за советы, написал такой код:

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


От Итогов уйти не смог, я получаю выборку в группировке - склад, получаю токен апи для этого склада, дальше после обхода детальных записей делаю отправку НомерПоДаннымКлиента по данному складу. С учетом этого без итогов вообще никак.  

(10) Складов больше чем 10.
15 Волшебник
 
08.07.25
08:43
(14) ТЧ Товаров зачем?
16 program345
 
08.07.25
08:50
(15) там ссылка на заказ, если в чеке заказ есть - он оплачен
17 Волшебник
 
08.07.25
09:04
(16) Ну так делай запрос к основной таблице Документ.ЧекККМ
18 Волшебник
 
08.07.25
09:28
а, понял. Заказ в таб.части
19 program345
 
08.07.25
13:29
(18) да
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.