Имя: Пароль:
1C
1С v8
Тест запроса
0 happysan
 
28.06.22
10:54
Всем привет!
У кого есть возможность давайте совместно протестируем запрос:
Прокомментируйте запрос, всё что вы увидите: рабочий или в нем есть ошибка, оптимален или нет, какой будет результат и т.д.?

Примечание: В конфигурации описан регистр накопления ТоварыНаСкладах, для которого по умолчанию определен индекс по периоду и всем измерениям в том порядке, в котором они перечислены в конфигураторе.

ВЫБРАТЬ

                ТоварыНаСкладахОбороты.Регистратор КАК Регистратор,

                ТоварыНаСкладахОбороты.Регистратор.Номер КАК НомерРегистратора,

                ТоварыНаСкладахОбороты.Регистратор.Дата КАК ДатаРегистратора,

                ТоварыНаСкладахОбороты.Регистратор.Ответственный КАК Ответственный,

                ТоварыНаСкладахОбороты.Склад КАК Склад,

                ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,

                ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.СерияНоменклатуры КАК Справочник.СерииНоменклатуры) КАК СерияНоменклатуры,

                ТоварыНаСкладахОбороты.КоличествоПриход,

                ТоварыНаСкладахОбороты.КоличествоРасход,

                ЦеныНоменклатуры.Цена

ИЗ

                РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Регистратор) КАК ТоварыНаСкладахОбороты

                               ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

                               ПО ТоварыНаСкладахОбороты.Номенклатура = ЦеныНоменклатуры.Номенклатура

                                               И (ЦеныНоменклатуры.Период В

                                                               (ВЫБРАТЬ

                                                                              МАКСИМУМ(ЦеныПрошлогоМесяца.Период)

                                                               ИЗ

                                                                              РегистрСведений.ЦеныНоменклатуры КАК ЦеныПрошлогоМесяца

                                                               ГДЕ

                                                                              ЦеныПрошлогоМесяца.Период > НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, МЕСЯЦ)))

ГДЕ

                (ТоварыНаСкладахОбороты.Номенклатура.Артикул = "249560"

                                               ИЛИ ТоварыНаСкладахОбороты.Номенклатура.Артикул = "D-0362")

УПОРЯДОЧИТЬ ПО

                Регистратор,

                Склад,

                Номенклатура
1 Said_We
 
28.06.22
10:56
(0) Выкинь этот запрос.
2 happysan
 
28.06.22
10:56
Я лично вижу следующее:
1. Первые 4 поля запроса выбирают поля составного типа и ещё через две точки. Нужно применить Выбор .... Когда...Тогда...Конец и ВЫРАЗИТЬ().
2. Вместо подзапроса использовать временную таблицу.
Сейчас ещё допишу.
3 asady
 
28.06.22
10:56
(0)  (ТоварыНаСкладахОбороты.Номенклатура.Артикул = "249560"

                                               ИЛИ ТоварыНаСкладахОбороты.Номенклатура.Артикул = "D-0362")
заменить на В (&МассивАртикулов)

а лучше массив номенклатуры тогда и в таблице оборотов и цен отбор включай
4 happysan
 
28.06.22
10:57
(1) Это тестовая задачка, не по работе.
5 happysan
 
28.06.22
10:58
(3) Да, тоже думал об этом.
6 happysan
 
28.06.22
10:59
Не забывайте ещё про вопросы: какой будет результат и рабочий ли вообще запрос.
7 Said_We
 
28.06.22
10:59
(5) В этом запросе вообще не думал. Совсем его выброси и забудь.
Цену только для тех номенклатур у которых на максимальную дату движение получать будешь?
Не надо это разбирать - нет условия задачи нет разбора.
8 happysan
 
28.06.22
11:07
(2) Продолжаю: 3. Излишнее индексирование полей.
9 happysan
 
28.06.22
11:07
(8) Нужно в запрос включить ИНДЕКСИРОВАТЬ ПО
10 Said_We
 
28.06.22
11:08
(9) Нет временной таблицы в запросе - куда собрался индексирование включать и зачем?
Условие задачи сначала озвучь.
11 Kassern
 
28.06.22
11:12
(0) какая "красота" ТоварыНаСкладахОбороты.Регистратор.Номер КАК НомерРегистратора - надеюсь вы понимаете что сделает 1ска, чтобы получить этот номер)
12 happysan
 
28.06.22
11:13
(10) ВТ уже прокомментирована в (2). Условия задачи в (4).
13 happysan
 
28.06.22
11:13
(11) Я же прокомментировал это в (2).
14 Kassern
 
28.06.22
11:17
(13) а вы понимаете, зачем нужно что-то выражать и как поведет себя 1с, если этого не сделать? Если есть такое желание получать через точку, то нужно уже задумываться об архитектуре, либо обращаться напрямую к таблице.
Так же еще:
ГДЕ

                (ТоварыНаСкладахОбороты.Номенклатура.Артикул = "249560"

                                               ИЛИ ТоварыНаСкладахОбороты.Номенклатура.Артикул = "D-0362")
Лучше указать условие в виртуальной таблице, а не в ГДЕ, так как в этом случае, строчки срежутся еще до связи с другими таблицами, а не после. И лучше не ИЛИ через точку, а ТоварыНаСкладахОбороты.Номенклатура В (&МассивТоваров)
15 happysan
 
28.06.22
11:20
(14) Это уже обсуждалось выше.
16 happysan
 
28.06.22
11:22
(2) Продолжаю: 4. Соединение с виртуальной таблицей может вызвать замедление запроса, лучше поместить его во ВТ.
17 Йохохо
 
28.06.22
11:23
(16) вам уже писали про полную хрень в условиях ПО, (7)
18 happysan
 
28.06.22
11:24
(17) Всё учтено.
19 Said_We
 
28.06.22
12:00
(17) Он сам с собой разговаривает - пусть продолжает. :-)
Его ответы не интересуют. Не нужно ему мешать. :-)
20 happysan
 
28.06.22
12:06
(19) Я вам помогаю)
Ошибка? Это не ошибка, это системная функция.