Запрос для динамического списка

1. user1671936 1 01.02.23 17:05 Сейчас в теме
Здравствуйте. Справочник номенклатура, в форму списка нужно подтянуть некоторые данные из последней реализации, в которой есть номенклатура. Составил запрос, но при открытии формы списка все зависает из за большого количества данных. Подскажите, пожалуйста, как можно оптимизировать запрос?
ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Артикул КАК Артикул,
	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
	СпрНоменклатура.Родитель,
	ВЫБОР
		КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
			ТОГДА 4 + ВЫБОР
					КОГДА СпрНоменклатура.ПометкаУдаления
						ТОГДА 1
					ИНАЧЕ 0
				КОНЕЦ + ВЫБОР
					КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
						ТОГДА 0
					ИНАЧЕ 2
				КОНЕЦ
		ИНАЧЕ ВЫБОР
				КОГДА СпрНоменклатура.ПометкаУдаления
					ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ + ВЫБОР
				КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
					ТОГДА 0
				ИНАЧЕ 2
			КОНЕЦ
	КОНЕЦ КАК ИндексКартинки,
	РеализацияТоваровУслугТовары.НомерУпаковки КАК НомерУпаковки 
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		ПО (РеализацияТоваровУслугТовары.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа
	{ГДЕ
	(СпрНоменклатура.Ссылка В
			(ВЫБРАТЬ
				Сегменты.Номенклатура
			ИЗ
				РегистрСведений.НоменклатураСегмента КАК Сегменты
			ГДЕ
				Сегменты.Сегмент = &СегментНоменклатуры))}
	И РеализацияТоваровУслугТовары.НомерУпаковки В
			(ВЫБРАТЬ ПЕРВЫЕ 1
				РеализацияТоваровУслугТовары.НомерУпаковки 
			ИЗ
				Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
			УПОРЯДОЧИТЬ ПО
				РеализацияТоваровУслугТовары.Ссылка.Дата УБЫВ)
				
Показать
По теме из базы знаний
Найденные решения
30. user1671936 1 06.02.23 13:25 Сейчас в теме
(29) спасибо. Сделал с левым соединением, добавил условия на дату в запрос и убрал группировку по упаковкам, так как из за них дублирование было. И заработало.
Vitaly1C8; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. independ 1521 01.02.23 17:20 Сейчас в теме
(1) Использовать событие ПриПолученииДанных динамического списка
в примере выводятся цены последней и предпоследней поставки

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПоступлениеТоваровТовары.Номенклатура.Код КАК НоменклатураКод,
	|	ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
	|	ПоступлениеТоваровТовары.Ссылка.Дата КАК Дата,
	|	ПоступлениеТоваровТовары.Цена КАК Цена,
	|	ПоступлениеТоваровТовары.Ссылка.Контрагент КАК Контрагент
	|ИЗ
	|	Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
	|ГДЕ
	|	ПоступлениеТоваровТовары.Ссылка.Проведен
	|	И ПоступлениеТоваровТовары.Номенклатура В (&СписокНоменклатуры)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номенклатура,
	|	Дата УБЫВ
	|ИТОГИ ПО
	|	Номенклатура";
	
	Запрос.УстановитьПараметр("СписокНоменклатуры", Строки.ПолучитьКлючи());
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаНоменклатура.Следующий() Цикл
		ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
		Сч=1;
		СтрокаСписка=Строки[ВыборкаНоменклатура.Номенклатура];
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Если Сч=1 Тогда
				Если СтрокаСписка.Данные.Свойство("ЦенаПоследнейПоставки") Тогда
					СтрокаСписка.Данные.ЦенаПоследнейПоставки=ВыборкаДетальныеЗаписи.Цена;
				КонецЕсли;
			ИначеЕсли Сч=2 Тогда
				Если СтрокаСписка.Данные.Свойство("ЦенаПредПоследнейПоставки") Тогда
					СтрокаСписка.Данные.ЦенаПредПоследнейПоставки=ВыборкаДетальныеЗаписи.Цена;
				КонецЕсли;
			Иначе
				Прервать;
			КонецЕсли;
			Сч=Сч+1;
		КонецЦикла;
		
		Если СтрокаСписка.Данные.Свойство("ЦенаПоследнейПоставки") И 
			СтрокаСписка.Данные.Свойство("Цена") И 
			СтрокаСписка.Данные.Свойство("Процент") Тогда
			
			ЦенаЗакупки=СтрокаСписка.Данные.ЦенаПоследнейПоставки;
			Цена=СтрокаСписка.Данные.Цена;
			Если ЦенаЗакупки<>0 И Цена<>0 Тогда
				СтрокаСписка.Данные.Процент=Окр(Цена/ЦенаЗакупки*100-100,2);
			КонецЕсли;	
			
		КонецЕсли;
		
	КонецЦикла;
КонецПроцедуры 
Показать
Vitaly1C8; Zevzm; user1671936; +3 Ответить
5. user1671936 1 02.02.23 10:04 Сейчас в теме
(2)
Использовать событие ПриПолученииДанных динамического списка
спасибо. Попробовал, создал у табличной части данную процедуру,но отладкой в нее не заходит, проверить не могу как работает. Подскажите, пожалуйста, что не так сделал?
7. independ 1521 02.02.23 10:14 Сейчас в теме
(5)
Прикрепленные файлы:
8. user1671936 1 02.02.23 10:22 Сейчас в теме
(7) именно так сделано у меня
Прикрепленные файлы:
9. independ 1521 02.02.23 10:31 Сейчас в теме
(8) можно попробовать переместиться по списку в начало или в конец, процедура работает пакетно для строк, если строк немного, то вероятно количество вызовов будет минимально, или она не сработает
12. user1671936 1 02.02.23 10:34 Сейчас в теме
(9) попробовал, все равно не заходит
13. independ 1521 02.02.23 10:36 Сейчас в теме
(12) конфигурация 1с? Версия платформы? Режим файл или сервер?
14. user1671936 1 02.02.23 10:42 Сейчас в теме
(13) Управление торговлей, редакция 11.1 (11.1.10.180) (http://v8.1c.ru/trade/)
Copyright © ООО "1C", 2003-2015. Все права защищены
(http://www.1c.ru), 1С:Предприятие 8.3 (8.3.12.1412) , сервер
3. -AI- 01.02.23 17:24 Сейчас в теме
(1)
в форму списка нужно подтянуть некоторые данные из последней реализации
как вариант:
заносить данные в регистр при сохранении реализации,
а потом брать срез последних этого регистра

PS вариант 2, индексацию сделать по Номенклатура в ТЧ товары
user1671936; +1 Ответить
10. Vitaly1C8 02.02.23 10:32 Сейчас в теме
(1) Вот в этом куске - видимо нужно наложить фильтр ГДЕ
(ВЫБРАТЬ ПЕРВЫЕ 1
РеализацияТоваровУслугТовары.НомерУпаковки
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслугТовары.Ссылка.Дата УБЫВ)
11. user1671936 1 02.02.23 10:34 Сейчас в теме
(10) какой параметр передать туда можно? Чтоб не было ошибки "Не указан параметр такой то"
15. Vitaly1C8 02.02.23 10:53 Сейчас в теме
(11) кстати: почему используются { } в тексте запроса ? (Скопировали запрос из отчета ?)
Часть запроса в фигурных скобках игнорируется - поэтому и тормоза !
Отредактируйте текст запроса, (уберите { } ) Попробуйте, затем пробуйте наложить фильтр на выборку (как я писал выше)

P.S. хотя нет - это не поможет; сделайте по рекомендации polax
4. polax 01.02.23 22:53 Сейчас в теме
Никаких соединений с реализацией. Прав в (2) ПриПолученииДанныхНаСервере. В основной запрос добавляешь 0 КАК НомерУпаковки. Все. Больше ничего. Выводишь поле НомерУпаковки в нужное место на форме. В СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
используй Сроки (посмотри в отладчике значение, разберешься) и заполняй нужными значениями поле НомерУпаковки (запрос или любым способом).
Плюсы: Не нагружается динамический список, скорость его вывода не меняется. Заполнение ТОЛЬКО видимых строк номером упаковки почти не тормозит работу
Минусы: По полю Номер упаковки нельзя сделать сортировку, упорядочивание, отбор. Но оно того стоит
Vitaly1C8; user1671936; +2 Ответить
6. user1671936 1 02.02.23 10:06 Сейчас в теме
(4) попробовал как в (2) написали, но отладчик не заходит в процедуру
(4)
(посмотри в отладчике значение, разберешься)
16. user1671936 1 02.02.23 11:02 Сейчас в теме
(15)
Скопировали запрос из отчета ?
вот запрос без моих изменений, что изначально был. Так же фигурные скобки имеются в запросе, при этом без тормозов все работает.
ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Артикул КАК Артикул,
	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
	СпрНоменклатура.Родитель,
	ВЫБОР
		КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
			ТОГДА 4 + ВЫБОР
					КОГДА СпрНоменклатура.ПометкаУдаления
						ТОГДА 1
					ИНАЧЕ 0
				КОНЕЦ + ВЫБОР
					КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
						ТОГДА 0
					ИНАЧЕ 2
				КОНЕЦ
		ИНАЧЕ ВЫБОР
				КОГДА СпрНоменклатура.ПометкаУдаления
					ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ
			+ ВЫБОР
						КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
							ТОГДА 0
						ИНАЧЕ 2
					КОНЕЦ

	КОНЕЦ КАК ИндексКартинки
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа
{ГДЕ
	(СпрНоменклатура.Ссылка В
			(ВЫБРАТЬ
				Сегменты.Номенклатура
			ИЗ
				РегистрСведений.НоменклатураСегмента КАК Сегменты
			ГДЕ
				Сегменты.Сегмент = &СегментНоменклатуры))}
Показать
17. Vitaly1C8 02.02.23 11:10 Сейчас в теме
(16) Уточникте такой момент: Вам нужно РеализацияТоваровУслугТовары.НомерУпаковки из последнего по дате документа (самого свежего) или максимальный номер упаковки в которой была номенклатура ?
18. user1671936 1 02.02.23 11:11 Сейчас в теме
(17)
РеализацияТоваровУслугТовары.НомерУпаковки из последнего по дате документа
из последнего по дате документа
19. Vitaly1C8 02.02.23 11:25 Сейчас в теме
(18) Тогда для соединения потребуется такой запрос
ВЫБРАТЬ _Номенклатура, _НомерУпаковки ИЗ (

ВЫБРАТЬ Номенклатура, НомерУпаковки, МАКСИМУМ(ДатаДок) КАК А
ВЫБРАТЬ Номенклатура, ДатаДок, МАКСИМУМ(НомерУпаковки) КАК Б

ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПО
А.Номенклатура = Б.Номенклатура
А.НомерУпаковки = Б.НомерУпаковки
А.ДатаДок = Б.ДатаДок

)
На сколько это будет быстро нужно проверить :)
20. polax 02.02.23 13:06 Сейчас в теме
(8) Покажи код процедуры под стрелочкой, включая директиву компиляции, имя и параметры. Где-то в этом у тебя ошибка
21. user1671936 1 02.02.23 13:11 Сейчас в теме
(20)
Прикрепленные файлы:
22. polax 02.02.23 13:39 Сейчас в теме
(21) Все вроде правильно. База клиент-сервер? Если ДА, отладка на сервере включена?
23. user1671936 1 02.02.23 13:41 Сейчас в теме
(22) да, включена, в другие процедуры входит (например ПриСозданииНаСервере)
24. polax 02.02.23 13:42 Сейчас в теме
Режим совместимости конфигурации какой стоит?
25. user1671936 1 02.02.23 13:44 Сейчас в теме
(24)
Прикрепленные файлы:
26. polax 02.02.23 13:47 Сейчас в теме
(25) Вот где собака порылась.! ))))
Событие ПриПолученииДанныхНаСервере работает начиная с версии 8.3.10. Платформа-то у тебя соответствует, а вот режим совместимости 8.3.7 ниже требуемого, поэтому и не работает событие. Или меняй режим совместимости или этот способ тебе не подходит
27. user1671936 1 02.02.23 13:49 Сейчас в теме
(26) понял, спасибо большое! =)
28. user1671936 1 03.02.23 10:46 Сейчас в теме
(19) составил запрос, логика по идее как в вашем примере, но ошибка вылезает
ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Артикул КАК Артикул,
	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
	СпрНоменклатура.Родитель,
	ВЫБОР
		КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
			ТОГДА 4 + ВЫБОР
					КОГДА СпрНоменклатура.ПометкаУдаления
						ТОГДА 1
					ИНАЧЕ 0
				КОНЕЦ + ВЫБОР
					КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
						ТОГДА 0
					ИНАЧЕ 2
				КОНЕЦ
		ИНАЧЕ ВЫБОР
				КОГДА СпрНоменклатура.ПометкаУдаления
					ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ + ВЫБОР
				КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
					ТОГДА 0
				ИНАЧЕ 2
			КОНЕЦ
	КОНЕЦ КАК ИндексКартинки,
	РеализацияТоваровУслугТовары.НомерУпаковки
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			РеализацияТоваровУслугТовары.НомерУпаковки КАК НомерУпаковки,
			РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
			МАКСИМУМ(РеализацияТоваровУслугТовары.Ссылка.Дата) КАК ДатаДокумента
		ИЗ
			Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
				ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
					МАКСИМУМ(РеализацияТоваровУслугТовары.НомерУпаковки) КАК НомерУпаковки,
					РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
					РеализацияТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента
				ИЗ
					Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
				
				СГРУППИРОВАТЬ ПО
					РеализацияТоваровУслугТовары.Ссылка.Дата,
					РеализацияТоваровУслугТовары.Номенклатура) КАК РеализацияТоваровТовары
				ПО РеализацияТоваровТовары.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура
					И РеализацияТоваровТовары.ДатаДокумента = РеализацияТоваровУслугТовары.Ссылка.Дата
					И РеализацияТоваровТовары.НомерУпаковки = РеализацияТоваровУслугТовары.НомерУпаковки
		
		СГРУППИРОВАТЬ ПО
			РеализацияТоваровУслугТовары.Номенклатура,
			РеализацияТоваровУслугТовары.НомерУпаковки) КАК РеализацияТоваровУслугТовары
		ПО РеализацияТоваровУслугТовары.Номенклатура = СпрНоменклатура.Ссылка
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа
{ГДЕ
	(СпрНоменклатура.Ссылка В
			(ВЫБРАТЬ
				Сегменты.Номенклатура
			ИЗ
				РегистрСведений.НоменклатураСегмента КАК Сегменты
			ГДЕ
				Сегменты.Сегмент = &СегментНоменклатуры))}
Показать
Прикрепленные файлы:
29. Vitaly1C8 03.02.23 11:27 Сейчас в теме
(28)
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
// тут должно быть ЛЕВОЕ СОЕДИНЕНИЕ иначе в списке останутся только та Номенклатура, которая есть в Реализации


ПО РеализацияТоваровТовары.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура
И РеализацияТоваровТовары.ДатаДокумента = РеализацияТоваровУслугТовары.Ссылка.Дата
И РеализацияТоваровТовары.НомерУпаковки = РеализацияТоваровУслугТовары.НомерУпаковки


Для большего ускорения желательно наложить фильтр ГДЕ на РеализацияТоваровТовары, РеализацияТоваровУслугТовары по дате (выбирать реализации не за всё время а с определенной даты)

Проверьте правильность подзапроса, вставьте его в консоль запросов и выполните; Может ошибка где то еще;
user1671936; +1 Ответить
30. user1671936 1 06.02.23 13:25 Сейчас в теме
(29) спасибо. Сделал с левым соединением, добавил условия на дату в запрос и убрал группировку по упаковкам, так как из за них дублирование было. И заработало.
Vitaly1C8; +1 Ответить
Оставьте свое сообщение

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