|
Что не так с запросом? | ☑ | ||
---|---|---|---|---|
0
Alex174
16.11.22
✎
14:05
|
Доброго времени суток! Есть задача - взять контрагентов по которым были обороты вообще, взять контрагентов по которым были обороты только за последний год, и методом вычитания получить таблицу с контрагентами у которых не было оборотов более года. Сделал запрос. В консоли запросов все ок. Показывает верные данные. Запихиваю его в обработку, она в выборке проходится по всем контрагентам.. как будто секции ГДЕ не существует... Делал через временные таблицы, делал через вложенный запрос, че только не делал.. Обработка фигачит всех подряд, как будто не происходит вычитания строке где есть NULL... Хелпми плиз...
ВЫБРАТЬ РАЗЛИЧНЫЕ ВзаиморасчетыСКонтрагентами.Контрагент ПОМЕСТИТЬ КонтрагентыСДвижениямиКогдаЛибо ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Черновик И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Недействительный И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.ПометкаУдаления ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ВзаиморасчетыСКонтрагентами.Контрагент ПОМЕСТИТЬ КонтрагентыСОборотамиЗаПоследнийГод ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &НачалоПериода И &КонецПериода И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Черновик И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Недействительный И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.ПометкаУдаления ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КонтрагентыСДвижениямиКогдаЛибо.Контрагент КАК КонтрагентКогдаЛибо, КонтрагентыСОборотамиЗаПоследнийГод.Контрагент ИЗ КонтрагентыСОборотамиЗаПоследнийГод КАК КонтрагентыСОборотамиЗаПоследнийГод ПОЛНОЕ СОЕДИНЕНИЕ КонтрагентыСДвижениямиКогдаЛибо КАК КонтрагентыСДвижениямиКогдаЛибо ПО КонтрагентыСОборотамиЗаПоследнийГод.Контрагент = КонтрагентыСДвижениямиКогдаЛибо.Контрагент ГДЕ КонтрагентыСОборотамиЗаПоследнийГод.Контрагент ЕСТЬ NULL УПОРЯДОЧИТЬ ПО КонтрагентКогдаЛибо АВТОУПОРЯДОЧИВАНИЕ |
|||
1
Said_We
16.11.22
✎
14:08
|
(0) Можно и без соединения. Источник одна и та же таблица.
|
|||
2
1Снеговик
гуру
16.11.22
✎
14:09
|
(0) условия необходимо писать в условиях виртуальной таблицы "Обороты", а не в "ГДЕ".
С таким запросом ни в одну компанию бы тебя не взяли, сразу спрашивают на собеседовании) |
|||
3
1Снеговик
гуру
16.11.22
✎
14:11
|
Вот прям берешь целиком весь регистр и через ГДЕ ставишь условие? Очень неоптимально, прям жуть.
|
|||
4
Said_We
16.11.22
✎
14:11
|
(1) Зачем тут виртуальные таблицы?
|
|||
5
Spieluhr
16.11.22
✎
14:13
|
во второй таблице у вас обороты за последний год, а не ТОЛЬКО за последний год
исходная задача не будет решена правильно |
|||
6
Spieluhr
16.11.22
✎
14:16
|
(0) почему соединение ПОЛНОЕ, а не КонтрагентыСДвижениямиКогдаЛибо ЛЕВОЕ с КонтрагентыСОборотамиЗаПоследнийГод?
|
|||
7
Said_We
16.11.22
✎
14:21
|
ВЫБРАТЬ
т.Контрагент ИЗ (ВЫБРАТЬ т.Контрагент МАКС(Выбор Когда т.Период МЕЖДУ &НачалоГода И &КонецГода Тогда Истина Иначе NULL Конец) Как ЕстьДвижениеВГоду ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК т ГДЕ НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Черновик И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Недействительный И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.ПометкаУдаления Сгруппировать по т.Контрагент ) как т Где т.ЕстьДвижениеВГоду есть NULL |
|||
8
Said_We
16.11.22
✎
14:24
|
На коленке писал - не проверял синтаксис и не проверял работоспособность....
|
|||
9
1Снеговик
гуру
16.11.22
✎
14:41
|
(7) жесть
|
|||
10
Said_We
16.11.22
✎
14:42
|
(9) Что не так?
|
|||
11
Said_We
16.11.22
✎
14:45
|
(9) Первый же запрос в (0) по факту сразу сгруппировать по контрагенту.
ВЫБРАТЬ РАЗЛИЧНЫЕ ВзаиморасчетыСКонтрагентами.Контрагент Что по факту совпадает с (7). Далее никаких соединений прочего мусора. |
|||
12
Конструктор1С
16.11.22
✎
14:46
|
(10) всё не так
|
|||
13
Said_We
16.11.22
✎
14:48
|
(0) Работоспособность в (7) проверь.... Замерь скорость. Потом с левым соединением и скорость замерь.
|
|||
14
Said_We
16.11.22
✎
15:32
|
(0) "МАКС" нарисуй как "МАКСИМУМ". Писал на английский манер. :-)
|
|||
15
1Снеговик
гуру
16.11.22
✎
15:40
|
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Контрагенты.Ссылка КАК Контрагент ПОМЕСТИТЬ ВТ_Контрагенты ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ Контрагенты.Черновик И НЕ Контрагенты.Недействительный И НЕ Контрагенты.ПометкаУдаления ИНДЕКСИРОВАТЬ ПО Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВзаиморасчетыСКонтрагентамиОбороты.Контрагент КАК Контрагент ПОМЕСТИТЬ КонтрагентыСДвижениямиКогдаЛибо ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , , ) КАК ВзаиморасчетыСКонтрагентамиОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты ПО ВзаиморасчетыСКонтрагентамиОбороты.Контрагент = ВТ_Контрагенты.Контрагент ИНДЕКСИРОВАТЬ ПО Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВзаиморасчетыСКонтрагентамиОбороты.Контрагент КАК Контрагент ПОМЕСТИТЬ КонтрагентыСОборотамиЗаПоследнийГод ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Период, ГОД, -1), ДЕНЬ), КОНЕЦПЕРИОДА(&Период, ДЕНЬ), , ) КАК ВзаиморасчетыСКонтрагентамиОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты ПО ВзаиморасчетыСКонтрагентамиОбороты.Контрагент = ВТ_Контрагенты.Контрагент ИНДЕКСИРОВАТЬ ПО Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ КонтрагентыСДвижениямиКогдаЛибо.Контрагент КАК КонтрагентНеБылоОборотовБолееГода ИЗ КонтрагентыСДвижениямиКогдаЛибо КАК КонтрагентыСДвижениямиКогдаЛибо ЛЕВОЕ СОЕДИНЕНИЕ КонтрагентыСОборотамиЗаПоследнийГод КАК КонтрагентыСОборотамиЗаПоследнийГод ПО КонтрагентыСДвижениямиКогдаЛибо.Контрагент = КонтрагентыСОборотамиЗаПоследнийГод.Контрагент ГДЕ КонтрагентыСОборотамиЗаПоследнийГод.Контрагент ЕСТЬ NULL УПОРЯДОЧИТЬ ПО КонтрагентНеБылоОборотовБолееГода АВТОУПОРЯДОЧИВАНИЕ |
|||
16
1Снеговик
гуру
16.11.22
✎
15:41
|
(10) не по условию задачи, и не оптимально
|
|||
17
Said_We
16.11.22
✎
15:45
|
(16) В смысле не по условию задачи?
Необходимо найти контрагентов по которым были движения по взаиморасчетам, но не было движений за последний год. Торговли под рукой сейчас нет. Но есть ЗиУП на несколько тысяч сотрудников за период лет 15. Подобный запрос на прямую к регистру (не используя виртуальные) выдал результат за 0 секунд. В чем не оптимальность? В том что не создаю лишних внутренних таблиц и не использую тормозное соединение? |
|||
18
Said_We
16.11.22
✎
15:48
|
Да ЗиУП база относительно не большая. Всего чуть более 250 000 записей в регистре расчетов. Но результат менее секунды. Средствами 1С замерить производительность сложновато-то.
|
|||
19
Said_We
16.11.22
✎
15:55
|
(15) "ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты
ПО ВзаиморасчетыСКонтрагентамиОбороты.Контрагент = ВТ_Контрагенты.Контрагент" Это зачем тут? Тогда уже при вызове виртуальной таблицы это делай: Контрагент в (выбрать т.Контрагент из ВТ_Контрагенты как т) Но подумай сколько раз накладывается условие на контрагента. Сколько раз выбирается из одной и той же таблицы данные с разными фильтрами и сколько раз результат группируется. Сколько в памяти раз создается внутренняя таблица. А ещё всё это друг с другом соединяется. |
|||
20
Said_We
16.11.22
✎
16:01
|
(16) Может Вам просто не понятно решение в (7)?
|
|||
21
Said_We
16.11.22
✎
16:03
|
(15) Раз уж написали свой вариант, то озвучьте пожалуйста за сколько он выполняется и на каком объеме данных?
|
|||
22
Жан Пердежон
16.11.22
✎
16:04
|
(2) (3) ты где ты в (0) вирт.таблицы увидел?
(20) там ясно что УГ |
|||
23
Жан Пердежон
16.11.22
✎
16:06
|
(15) + отучайся уже "РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ" во все запросы пакета пихать
|
|||
24
Said_We
16.11.22
✎
16:08
|
(22) Мне не понятно что такое "УГ"? :-)
|
|||
25
Said_We
16.11.22
✎
16:12
|
ИЗ не оптимального в (7) это обращение к нескольким полям через две точки.
ГДЕ НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Черновик И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.Недействительный И НЕ ВзаиморасчетыСКонтрагентами.Контрагент.ПометкаУдаления Но, если честно, то уже лень было по другому рисовать. И вопросы опять же появятся лишние. А тут главный вопрос в том, что если источник данных одна единственная таблица, то с огромной вероятностью, никаких соединений делать не нужно. |
|||
26
1Снеговик
гуру
16.11.22
✎
16:19
|
(19) прочитай рекомендации от 1С и удивишься. Что за условие В в виртуальной таблице??
|
|||
27
1Снеговик
гуру
16.11.22
✎
16:20
|
(17) читай внимательно условие:
"Есть задача - взять контрагентов по которым были обороты вообще, взять контрагентов по которым были обороты только за последний год, и методом вычитания получить таблицу с контрагентами у которых не было оборотов более года." Там не только в результате дело. Но я понимаю, что вы привыкли делать не по ТЗ, а как вздумается. |
|||
28
1Снеговик
гуру
16.11.22
✎
16:21
|
(23) на каком основании отучаться? Аргументы будут? РАЗЛИЧНЫЕ да, можно опустить в последнем запросе.
|
|||
29
1Снеговик
гуру
16.11.22
✎
16:24
|
(25) соединения прописаны в условиях задачи.
Давай решим эту задачу на собеседовании, и посмотрим кого из нас возьмут. Это азы. |
|||
30
Said_We
16.11.22
✎
16:41
|
(29) Замеряем производительность. Посмотрим на результата и придем к выводу что условие составлено так, что задача имеет другое и более оптимальное решение.
Если работодатель будет отрицать действительность, то я сам к такому работодателю не пойду. Работать будет не возможно. Собеседование это не только просмотр кандидата, но и просмотр работодателя. Как-то так мне это представляется. |
|||
31
Said_We
16.11.22
✎
16:55
|
(29) У вас по скорости сколько получилось?
|
|||
32
1Снеговик
гуру
16.11.22
✎
17:02
|
(31) 2,497 сек на таблице из ~ 1 100 000 записей с отрисовкой результата
|
|||
33
Said_We
16.11.22
✎
17:03
|
(32) А запрос аналогичный в (7)?
|
|||
34
zalexey
16.11.22
✎
17:32
|
А зачем вы отдельно получаете обороты по году и отдельно за весь период? Возьмите обороты за весь период и получите дату последней продажи и по ней уже фильтруйте. Хоть год назад, хоть месяц назад
ВЫБРАТЬ ВложенныйЗапрос.Контрагент КАК Контрагент, ВложенныйЗапрос.ДатаПоследнейПродажи КАК ДатаПоследнейПродажи ИЗ (ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОбороты.Контрагент КАК Контрагент, МАКСИМУМ(ВзаиморасчетыСКонтрагентамиОбороты.Период) КАК ДатаПоследнейПродажи ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , День, НЕ Контрагент.ПометкаУдаления И НЕ КОНТРАГЕНТ.Недействительный и НЕ Контрагент.Черновик) КАК ВзаиморасчетыСКонтрагентамиОбороты СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентамиОбороты.Контрагент) КАК ВложенныйЗапрос ГДЕ ВложенныйЗапрос.ДатаПоследнейПродажи < &ДатаПоследнейПродажи УПОРЯДОЧИТЬ ПО ДатаПоследнейПродажи, Контрагент АВТОУПОРЯДОЧИВАНИЕ P.s. могу готовый отчет продать :))) https://v8pro.ru/shop/lost-clients-ut-10-3 |
|||
35
Said_We
16.11.22
✎
17:36
|
(34) Некоторые пришли к выводу, что это тестовое задание для (0). Хотя он об этом не писал и вообще исчез.
|
|||
36
Said_We
17.11.22
✎
01:03
|
(34) "А зачем вы отдельно получаете обороты по году и отдельно за весь период" - Это был первый вопрос пост ветке :-)
|
|||
37
Alex174
17.11.22
✎
06:55
|
Емае.. Вот это я накинул запрос на вентилятор... Все ломанулись обсуждать какой я кривой запрос сделал, и не один не прочитал вопрос до конца. Я знаю что запрос не оптимальный, я знаю что что можно сделать по другому, но скорость выполнения этого зароса 0.5 сек на моей базе. В регистре больше 2млн записей. Что тут оптимизировать? Делал на виртуальных таблицах, 0.9 сек. Но дело то даже не в этом. Вопрос не про оптимальность запроса, а про то, что при обходе результата запроса через выборку, результат запроса получается без условия ГДЕ. Т.е. этот запрос в консоли показывает все правильно, а при выполнении в обработке, добавляет к результату контрагентов с оборотами за последний год! Как такое возможно я не понимаю...
|
|||
38
Мимохожий Однако
17.11.22
✎
07:08
|
(37) У тебя консоль запросов или консоль СКД? Промежуточные таблицы есть возможность посмотреть?
|
|||
39
Alex174
17.11.22
✎
07:18
|
(38) Консоль запросов.
Парни я понял свою ошибку. У меня параметры разные в консоли и в обработке. Даты начала и окончания... *фэйспалм_невероятныхмасштабов* Всем спасибо. Да и на счет оптимизирования и виртуальных таблиц, если мне нужны реквизиты и измерения, без расчетов ресурсов, что мешает брать данные из реальной таблицы? Виртуальные же нужны для быстрого расчета итогов, ресурсов, а в моем запросе их нет. Да и работает быстрее чем виртуальная таблица. |
|||
40
1Снеговик
гуру
17.11.22
✎
09:55
|
(34) бл... Да потому что условие задачи такое!
Вот такие работнички у кого-то. Ему говоришь возьми две таблицы и делай между ними операции над множествами, а он свое что-то выдумывает и спорит, что так тоже можно. Да еще не понимает с третьего раза. |
|||
41
1Снеговик
гуру
17.11.22
✎
09:58
|
(39) ты не прав, виртуальные тебе нужны для отбора по датам, как минимум.
Понятно, что тебе не нужно что-то в запросе оптимизировать, но пойди попробуй объяснить это экзаменатору. Как научились неправильно запросы писать, так и продолжаете. А люди тут смотрят и учатся. |
|||
42
Said_We
17.11.22
✎
10:15
|
(41) Не нужны тут виртуальные таблицы.
Виртуальная таблица - это тоже подзапрос со своими условиями и группировками, часто к той же физической таблице. Если результат этого запроса и группировки не нужны, то зачем использовать виртуальную таблицу? За сколько выполнился запрос в (7)? |
|||
43
Alex174
17.11.22
✎
10:31
|
(41) с виртуальными таблицами этот запрос выполняется дольше чем с реальными. Да и время выполнения в 0.5 сек думаю вполне себе нормально.
Из ИТС "Для построения отчетов и анализа данных в большинстве случаев используются виртуальные таблицы. Эти таблицы не хранятся в информационной базе и создаются системой при обращении к ним. По своей сути это вложенные запросы. Запросы выполняются системой к физическим таблицам регистра бухгалтерии, о которых мы расскажем ниже." Вот и какой смысл в этой запросе городить еще подзапросы? |
|||
44
Vakhrin
17.11.22
✎
10:47
|
"Есть задача - взять контрагентов по которым были обороты вообще, взять контрагентов по которым были обороты только за последний год, и методом вычитания получить таблицу с контрагентами у которых не было оборотов более года." - я б такому составителю задач не доверил бы внедрение...
|
|||
45
Said_We
17.11.22
✎
10:55
|
(40) "бл... Да потому что условие задачи такое! " - именно бл... Если условие Бл... то необходимо сначала задачу переформулировать попытаться или уточнить в чем причина такой формулировки.
Самый простой пример тут на форуме. 90% вопросов задается примерно так: У меня тут вот это-то не получается, хочу так так и так. Нормальный уточняющий вопрос для чего необходимо и что вообще делать хочешь. И как итог почти всегда - изначально что сделать не получается вообще делать не нужно. Задача решается иначе и часто даже писать ничего не нужно. От дурной головы - ноги устают бегать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |