|
Обсудим запрос, оптимизация | ☑ | ||
---|---|---|---|---|
0
Маленький Вопросик
29.08.22
✎
08:29
|
Предложение по оптимизации. Можно переписать другой запрос, главное, чтобы на выходе Да/Нет было
ВЫБРАТЬ | ВЫБОР | КОГДА Номенклатура.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ТОГДА ЛОЖЬ | ИНАЧЕ ИСТИНА | КОНЕЦ КАК Разрешено | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.ЭтоГруппа = ЛОЖЬ | И Номенклатура.Родитель В ИЕРАРХИИ | (ВЫБРАТЬ | Конт1_ОбходБлокировки.Номенклатура КАК Номенклатура | ИЗ | РегистрСведений.Конт1_ОбходБлокировки КАК Конт1_ОбходБлокировки | ГДЕ | Конт1_ОбходБлокировки.Разрешено = ИСТИНА | И Конт1_ОбходБлокировки.Номенклатура.ЭтоГруппа = ИСТИНА) | И Номенклатура.Ссылка = &Ссылка |
|||
1
Ёпрст
29.08.22
✎
08:31
|
(0) всё в топку
|
|||
2
Ёпрст
29.08.22
✎
08:31
|
Феерический п..ц это все условия и в конце И Номенклатура.Ссылка = &Ссылка
|
|||
3
Маленький Вопросик
29.08.22
✎
08:33
|
(2) смысл запроса понял?
|
|||
4
Ненавижу 1С
гуру
29.08.22
✎
08:34
|
"В ИЕРАРХИИ" не умеет так, только с параметрами
|
|||
5
Маленький Вопросик
29.08.22
✎
08:36
|
(4) запрос рабочий 100% - все умеет "в иерархии"
|
|||
6
Vaderonk
29.08.22
✎
08:39
|
(0) доработка регистра добавив информацию об элементе номенклатуры, убери условие "Конт1_ОбходБлокировки.Номенклатура.ЭтоГруппа = ИСТИНА", проверь скорость выполнения.
|
|||
7
Маленький Вопросик
29.08.22
✎
08:42
|
(6) это нельзя убирать - иерархия должна выбирать из групп
|
|||
8
Ёпрст
29.08.22
✎
08:46
|
(5) Да ну ?? Вот эта дурь в case всегда будет Истина, там никогда не будет пустой ссылки
|
|||
9
Ёпрст
29.08.22
✎
08:48
|
Будет или пустая выборка или Истина в разрешено
|
|||
10
Маленький Вопросик
29.08.22
✎
08:48
|
(8) да, запрос возвращает либо истину, либо ничего не возвращает.
ты понял, но не до конца... |
|||
11
Маленький Вопросик
29.08.22
✎
08:48
|
(9) есть идеи как переделать?
|
|||
12
Ёпрст
29.08.22
✎
08:49
|
(10) Да ? Серьезно ? И нахрена там case ?
Про нелепую в иерархии, опустим |
|||
13
Маленький Вопросик
29.08.22
✎
08:50
|
(12) напиши свой вариант, если можешь - 17 лет тут штаны просиживаешь - судя по профилю
|
|||
14
DEVIce
29.08.22
✎
08:50
|
(8) +100500. Там должно быть левое соединение с регистром, а не в блоке ГДЕ.
|
|||
15
Ёпрст
29.08.22
✎
08:56
|
(13) Ну не 17, а побольше.. раньше не зареген был лет 5
|
|||
16
Ненавижу 1С
гуру
29.08.22
✎
08:56
|
(5) да, работает, подзапрос не коррелируемый потому что
|
|||
17
Ёпрст
29.08.22
✎
08:58
|
(13) сама идея хранения групп в РС порочна, ибо при переносе элемента из группы в группу - п...ц котёнку
|
|||
18
Ненавижу 1С
гуру
29.08.22
✎
09:00
|
(17) если подписка на события будет, то работает
|
|||
19
Маленький Вопросик
29.08.22
✎
09:05
|
(17) я не спрашиваю тебя про идею. мне нужно обсудить получение подобного результата исходя из условий.
я вообще по адресу обратился? |
|||
20
Маленький Вопросик
29.08.22
✎
09:08
|
(17) нет, никакого п..ц не будет.
|
|||
21
Ёпрст
29.08.22
✎
09:09
|
(17) ну сделай юнион Ложь + максимум во внешнем запросе, чтоб всегда иметь свою выборку потом с истина\ложь
|
|||
22
Ёпрст
29.08.22
✎
09:09
|
(21) --->(19)
|
|||
23
Маленький Вопросик
29.08.22
✎
09:12
|
(22) зачем юнион, если я могу обернуть запрос в вирт таблицу и уже из нее получить истина/ложь
мне нужна кардинальный подход получения результата другим методом (но в запросе) |
|||
24
Ёпрст
29.08.22
✎
09:12
|
+
Выбрать максимум(табличка.разрешено) из ( выбрать истина как разрешено из справочник.Номенклатура Где .... Объединить все выбрать ложь) как табличка |
|||
25
Ёпрст
29.08.22
✎
09:13
|
(23) дай угадаю, этот запрос еще и в цикле поди, раз ты условие на Номенклатура.ЭтоГруппа = ЛОЖЬ пихаешь в текст запроса ?
|
|||
26
Ёпрст
29.08.22
✎
09:15
|
И да, если твоя номенклатура в корне валяется ( с пустым родителем), то в своём РС ты это учитываешь ?
|
|||
27
Ryzeman
29.08.22
✎
09:16
|
(23) развернуть вложенный запрос во временную таблицу разрешённых групп а потом по ним вязать родителя разве что. Работать это быстрее не будет. Кроме лишнего ВЫБОР у тебя остальное по-другому и не получишь, похоже.
|
|||
28
Маленький Вопросик
29.08.22
✎
09:17
|
(25) понимаешь?
&НаКлиенте Процедура ТабИнвентВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Если Поле.Имя = "ТабИнвентКоличествоФакт" Тогда Если ПоискВРегистреБлокировок(Объект.ТабИнвент[ВыбраннаяСтрока].Номенклатура) Тогда Парам = ПолучимПараметрКалькулятора(Элемент.Имя, ВыбраннаяСтрока); ОткрытьФорму("ВнешняяОбработка.Инвентаризация.Форма.ФормаВводаЦифр",Парам,,,,,Новый ОписаниеОповещения("ПослеЗакрытияФормКоличества",ЭтаФорма,ВыбраннаяСтрока),РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
29
Ryzeman
29.08.22
✎
09:17
|
(26) я так подозреваю что у него разрешённая номенклатура не будет в корне валяться. Типа специально задаётся ряд групп, на которых вешается свойство что там товары можно менять, а остальные нельзя. Очень такое себе, ИМХО, но если так захотели\сделали, то чаще лучше не трогать
|
|||
30
Маленький Вопросик
29.08.22
✎
09:18
|
(29) единственный человек, который догадался. но, и номенклатура в регистре так же может быть. тут проблем нет
|
|||
31
Ryzeman
29.08.22
✎
09:20
|
(30) Да я думаю все всё поняли, (а кто не понял - лень было разбираться), но общую кривость решения не отменяет :-D Если тебе данные надо получать быстро - нужно свойство у самой номенклатуры, которую уже можешь проставлять как угодно. Реализовать тоже можно как угодно - хоть доп реквизитом\сведением хоть нормальным. И работать это будет офигенно что через запрос что через точку в цикле, и интуитивно понятно.
|
|||
32
alarm2020
29.08.22
✎
09:23
|
(23) Можно использовать агрегатную функцию Количество()
|
|||
33
Маленький Вопросик
29.08.22
✎
09:23
|
(31)
1.никто не предложил рабочего варианта 2.про кривость решения - глаз режет, да, иначе бы не создавал тему 3.проставлять доп реквизит у 50 тыс позиций - выборочно???? |
|||
34
alarm2020
29.08.22
✎
09:24
|
(33) Я только что предложил
|
|||
35
Маленький Вопросик
29.08.22
✎
09:25
|
(32) типа выбор количество > 0 тогда 1, иначе 0...
ну да, это хороший момент |
|||
36
alarm2020
29.08.22
✎
09:26
|
(35) ... тогда истина иначе ложь
|
|||
37
СеменовСемен
29.08.22
✎
09:26
|
(0) не может быть пустой ссылки в справочнике
|
|||
38
Маленький Вопросик
29.08.22
✎
09:26
|
(34) чем отличается от обертки в ВТ с явным выбором Истина/Ложь ?
|
|||
39
Ryzeman
29.08.22
✎
09:28
|
(33) >>проставлять доп реквизит у 50 тыс позиций - выборочно????
Вот этот момент как раз легко оптимизировать по тому же условию вхождения в группу у которой уже есть этот признак. Вручную не надо, вот если разово понадобится все 50к или сколько у тебя там перезаписать - займёт ненулевое время. Но не так долго. |
|||
40
alarm2020
29.08.22
✎
09:28
|
(38) Отсутствием обертки в ВТ
|
|||
41
alarm2020
29.08.22
✎
09:28
|
(37) В этом и вопрос у ТС
|
|||
42
СеменовСемен
29.08.22
✎
09:29
|
(41) нужно проверять пустоту результата запроса
|
|||
43
alarm2020
29.08.22
✎
09:30
|
(42) Пустоту надо проверять в запросе
|
|||
44
СеменовСемен
29.08.22
✎
09:31
|
В регистр доступ к группам?
По идее нужно рекурсивно делать. Если нужно для многих номенклатур проверить, то можно через транзитивное замыкание группы собрать |
|||
45
Маленький Вопросик
29.08.22
✎
09:32
|
(42) всю "не истину" можно пометить как ЛОЖЬ или 0, запросом "выше" - вот смысл этого
|
|||
46
СеменовСемен
29.08.22
✎
09:33
|
(43) можно объединить с Ложь и выбрать первые. Только нужно порядок правильный задать
|
|||
47
Kassern
29.08.22
✎
09:37
|
(0) Какой смысл от этой конструкции?
| ВЫБОР | КОГДА Номенклатура.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ТОГДА ЛОЖЬ | ИНАЧЕ ИСТИНА | КОНЕЦ КАК Разрешено Если уж пошли этим путем, то почему не выбрать просто Истина? |
|||
48
Kassern
29.08.22
✎
09:38
|
В данном запросе не будет пустой ссылки, она либо есть, либо ее нет.
|
|||
49
ptiz
29.08.22
✎
09:39
|
(23) Кардинально - это сделать отдельный РС, в котором хранить все группы, в т.ч. вложенные, и запрос делать к нему.
|
|||
50
ptiz
29.08.22
✎
09:40
|
+(49) Перезапись не будет очень тяжелой, если у вас всего несколько тысяч групп.
|
|||
51
Маленький Вопросик
29.08.22
✎
09:41
|
(48) ну это тут уже поняли. но если сделать "шаг вперед", можно исключить пустую выборку. мы тоже это уже поняли
|
|||
52
Kassern
29.08.22
✎
09:42
|
(51) Какая конфигурация? Есть сегменты номенклатуры? Можно по аналогии их сделать функционал проверки
|
|||
53
Маленький Вопросик
29.08.22
✎
09:45
|
(52) ЕРП. типовая бсп-шная. про "сегменты" отличная идея....
|
|||
54
Kassern
29.08.22
✎
09:47
|
(53) Ну вот, создайте нужные сегменты, заполните их по условию и уже к РС НоменклатураСегмента и делайте вашу проверку на вхождение.
|
|||
55
Маленький Вопросик
29.08.22
✎
09:50
|
ладно, всем спасибо за участие. троллить запросами вас пока не буду :)
|
|||
56
Ёпрст
29.08.22
✎
09:59
|
Эх, почитал бы что такое в иерархии, возможно выкинул бы всё к..е..ям
https://infostart.ru/1c/articles/1091745/ |
|||
57
Ёпрст
29.08.22
✎
09:59
|
Ильдарович, тоже неплохую статейку написал, про разные виды деревьев
https://infostart.ru/1c/articles/1105799/ |
|||
58
Ёпрст
29.08.22
✎
10:07
|
Ну и насчет оптимизации, разве что первым запросом получить список всех групп для выбранной номенклатуры и вторым запросом, уже проверка вхождения списка групп в РС и без "иерархии"
|
|||
59
unenu
29.08.22
✎
10:13
|
всегда избавляюсь от "В ИЕРАРХИИ" в запросах посредством временных таблиц.
к сожалению "В ИЕРАРХИИ" в 1С - это лишь глава(лапша) в методичках, а на практике причина неэффективности. |
|||
60
Kassern
29.08.22
✎
10:14
|
(59) Так на уровне платформы "В ИЕРАРХИИ" выплевывается во временные таблицы.
|
|||
61
unenu
29.08.22
✎
11:00
|
(60) в том и соль, что "выплевывается" и все равно тормозит. а когда сам "защекотуришь" вт, то все ок.
запилите отчет по регистру себестоимости с кол-ом записей эдак в 80КК+ и убедитесь, что "плевки" такое себе - просто маркетинг. |
|||
62
Kassern
29.08.22
✎
11:03
|
(61) И юзверам не даете возможности использовать ВГруппе и ВГруппеИзСписка?
|
|||
63
Kassern
29.08.22
✎
11:03
|
Я стараюсь писать логику так, чтобы по минимуму данную конструкцию исопльзовать в запросе, либо вообще не использовать.
|
|||
64
Kassern
29.08.22
✎
11:05
|
(61) Все зависит от того, какой уровень вложенности, если не большой, то не так страшно
|
|||
65
unenu
29.08.22
✎
11:26
|
(62) даем. посмотрите как в УТ(ЕРП) в типовых отчетах разарабы разрулили с сегментами.
если бы эта идея была перенесена на все таблицы (номеклатура, склады, клиенты, накладные), то в кнфах наступил бы локальный рай. суть там в том, что первым пакетом идет тяжелый отбор по жирным таблицам(указал выше) со всеми грехами (в группе, в группе из списка), а затем в еще более тяжелых оборотных таблицам ни разраб не умничает, ни СКД не лепит свои дурацкие вставки В ИЕРАХИИ. Пример отбора в первых "грешных" пакетах, которые дают пользовтелю свободу, а отчету кислород: ВЫБРАТЬ РАЗРЕШЕННЫЕ ТаблТовары.Ссылка КАК ТоварОтбора ПОМЕСТИТЬ ВтТовары {ВЫБРАТЬ ТоварОтбора.*} ИЗ Справочник.Номенклатура КАК ТаблТовары ГДЕ НЕ ТаблТовары.ЭтоГруппа {ГДЕ ТаблТовары.Ссылка.* КАК ТоварОтбора, ТаблТовары.Производитель.* КАК ПроизводительОтбора, ТаблТовары.Марка.* КАК МаркаОтбора, ТаблТовары.ТоварнаяКатегория.* КАК КатегорияОтбора} ИНДЕКСИРОВАТЬ ПО ТоварОтбора ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ ТаблСклады.Ссылка КАК СкладОтбора ПОМЕСТИТЬ ВтСкладыОтбора {ВЫБРАТЬ СкладОтбора.*} ИЗ Справочник.Склады КАК ТаблСклады ГДЕ НЕ ТаблСклады.ЭтоГруппа {ГДЕ ТаблСклады.Ссылка.* КАК СкладОтбора} ИНДЕКСИРОВАТЬ ПО СкладОтбора ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ ТаблВидыЗапасов.Ссылка КАК ВидЗапасов ПОМЕСТИТЬ ВтВидыЗапасов {ВЫБРАТЬ ВидЗапасов.*} ИЗ Справочник.ВидыЗапасов КАК ТаблВидыЗапасов {ГДЕ ТаблВидыЗапасов.Ссылка.* КАК ВидЗапасов} ИНДЕКСИРОВАТЬ ПО ВидЗапасов ; ... далее в жирных пакетах главное назначить полям синонимы отличные от имен полей (иначе СКД может лепить свои гроздья) и получим относительно быструю фильрацию жирных таблиц: ВЫБРАТЬ РАЗРЕШЕННЫЕ ТаблАналитикаУчетаНоменклатуры.КлючАналитики КАК КлючАналитики, ТаблАналитикаУчетаНоменклатуры.Номенклатура КАК ТоварОтбора, ТаблАналитикаУчетаНоменклатуры.Склад КАК СкладОтбора ПОМЕСТИТЬ ВтАналитикаУчетаНоменклатуры ИЗ РегистрСведений.АналитикаУчетаНоменклатуры КАК ТаблАналитикаУчетаНоменклатуры ГДЕ ТаблАналитикаУчетаНоменклатуры.Номенклатура В (ВЫБРАТЬ ВтТовары.ТоварОтбора ИЗ ВтТовары) И ТаблАналитикаУчетаНоменклатуры.Склад В (ВЫБРАТЬ ВтСклады.СкладОтбора ИЗ ВтСклады) ИНДЕКСИРОВАТЬ ПО КлючАналитики ; ВЫБРАТЬ ВиСпОбороты.Период КАК ДатаНачала, ВиСпОбороты.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, ВиСпОбороты.ВидЗапасов КАК ВидЗапасов, ВиСпОбороты.КоличествоОборот КАК КоличествоПродаж, ВиСпОбороты.СебестоимостьОборот КАК СтоимостьПродаж, ВиСпОбороты.СуммаВыручкиОборот КАК СуммаВыручки, ВиСпОбороты.СуммаДополнительныхРасходовОборот КАК СуммаДопРасходов ИЗ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты( &НачалоПериода, &КонецПериода, День, &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День) И АналитикаУчетаНоменклатуры В (ВЫБРАТЬ ВтАналитикаУчетаНоменклатуры.КлючАналитики ИЗ ВтАналитикаУчетаНоменклатуры) И ВидЗапасов В (ВЫБРАТЬ ВтВидыЗапасов.ВидЗапасов ИЗ ВтВидыЗапасов) И Склад В (ВЫБРАТЬ ВтСклады.СкладОтбора ИЗ ВтСклады) {(ХозяйственнаяОперация) КАК ХозяйственнаяОперация}) КАК ВиСпОбороты |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |