Имя: Пароль:
1C
1C 7.7
v7: Можно ли ускорить запрос 7.7
,
0 zenon46
 
07.02.19
12:30
Доброго дня!
В справочнике номенклатура сделал кнопку, по которой находится документ "установка цен" в котором есть номенклатура на которой с позиционирован курсор, можно ли как то ускорить этот запрос? По большому счету работает он нормально, но можно ли быстрей?

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |ОбрабатыватьДокументы Все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |ТекДок      = Документ.УстановкаЦен.ТекущийДокумент;
    |Товар       = Документ.УстановкаЦен.Номенклатура;    
    |Группировка ТекДок;
    |Условие (Товар = ТекущийЭлемент());
    |";
8 Davalebor
 
07.02.19
12:39
(7) Ну документ "Установка цен" наверное устанавливает цену в номенклатуре? Это предположение мое.
9 trad
 
07.02.19
12:40
Документ.УстановкаЦен - при проведении делать движения в оборотный регистр с измерением Товар
Дергать не из ТЧ документа, а из регистра
10 zenon46
 
07.02.19
12:47
(9) это 7.7, документ самописный. В регистры ничего не складывает.
11 trad
 
07.02.19
12:51
(10) ну я употребил глагол "делать", а не "делает"
т.е. как один из способов решения задачи - расширить учет
12 Mikeware
 
07.02.19
12:51
(9) лучше графу отбора.
13 mishaPH
 
модератор
07.02.19
12:52
(0) использовать в запросе обращение к функциям! 1с

    |Условие (Товар = ТекущийЭлемент()); моветон.
14 mishaPH
 
модератор
07.02.19
12:54
(0) как часто у вас появляются эти доки?
15 palpetrovich
 
07.02.19
12:54
тип БД никого не заинтересовал? или по дефолту - файловая? :)
16 zenon46
 
07.02.19
12:55
(13) может и так, но почему то отработал так запрос быстрей чем через переменную, проверил по 3 раза через замер производительности.
17 zenon46
 
07.02.19
12:55
(15) SQL
18 trad
 
07.02.19
12:57
(12) можно и графу - строго для решения задачи, но в регистр можно и прочего "вкусного" накидать в перспективе (ту же цену)
19 ДенисЧ
 
07.02.19
12:59
(16) План запроса тогда смотри, что в скуль летит
20 Провинциальный 1сник
 
07.02.19
13:01
Только новички в 7.7 используют штатные запросы. Забудьте про них. Есть давно уже стабильный и быстрый 1с++ с прямыми sql-запросами и индексированными таблицами.
21 palpetrovich
 
07.02.19
13:02
(17) дык что, прямыми запросами не пользуетесь?
22 zenon46
 
07.02.19
13:02
(18) поясните за гарфу, что-то я не совсем понял о чем речь идет?
23 trad
 
07.02.19
13:04
(22) ты для начала все же скажи двигает этот документ периодические цены?
24 zenon46
 
07.02.19
13:04
(23) да, в справочнике цены устанавливает цены из документа.
25 trad
 
07.02.19
13:07
(24) если периодика с опцией "Изменяется документами", то можно и без графы
но я умею только прямые запросы
26 zenon46
 
07.02.19
13:09
(25) да изменяется документами
по прямым запросам, руки пока совсем не доходили до этого. Насколько прямой запрос в данном случае будет выигрышней?
27 trad
 
07.02.19
13:10
а графа - в конфигурации добавляешь новую графу отбора, в нее кидаешь реквизит УстановкаЦен.Номенклатура.
Тогда условие в черном запросе будет использовать индекс
28 zenon46
 
07.02.19
13:11
(27) понял
29 trad
 
07.02.19
13:16
примерно так:

select
  Периодика.docid [Док $Документ],
  Журнал.iddocdef Док_вид
from _1sconst Периодика (nolock)
join _1sjourn Журнал (nolock) on Журнал.iddoc = Периодика.docid
where Периодика.id = $ИсторияРеквизита.Номенклатура.Цена
  and Периодика.objid = :Товар
30 Mikeware
 
07.02.19
13:16
(25) такую периодику только прямым удобно доставать
31 Mikeware
 
07.02.19
13:17
(26) примерно на порядок. хотя зависит от количеств документов
32 trad
 
07.02.19
13:17
такая задача без запросов, а через объект Периодический решается тоже на ура
33 Mikeware
 
07.02.19
13:19
(32) в объект периодический попадут только движения, следовательно, определим толькопроведенные документы. в запрос как в (0) - все неудаленные
34 zenon46
 
07.02.19
13:19
(29) а как будет выглядеть мой "черный" запрос на прямом хотяб примерно очень инетресно замерить скорость?
35 trad
 
07.02.19
13:20
(34) боюсь что никак
36 zenon46
 
07.02.19
13:21
(35) а в чем ограничение ?
37 trad
 
07.02.19
13:22
(36) в синтаксисе черных запросов
38 Mikeware
 
07.02.19
13:22
(34)
select док.iddoc [Док $Документ.УстановкаЦен]
from
$ДокументСтроки.УстановкаЦен as Док
where $Док.Номенклатура=:Номенклатура
39 Mikeware
 
07.02.19
13:23
+(38) это все, в т.ч. помеченые на удаление
40 zenon46
 
07.02.19
13:23
(35) тады не понял. есть документ установка цен, у него в табличной части есть реквизит номенклатура, как скажем получить список документов установка цен в которой встречается номенклатура выбранная на форме отчета? Никак?
41 Mikeware
 
07.02.19
13:23
(35) ??
42 trad
 
07.02.19
13:23
(33) это да, но наверно ТСу все же нужны доки потрогавшие цену. имхо
43 trad
 
07.02.19
13:24
(38) ааа, ну да, я не врубился в вопрос )
44 Mikeware
 
07.02.19
13:26
(43)  только ввиду отсутствия индекса - он будет медленным, но все равно быстрей черного раза в 3.
45 trad
 
07.02.19
13:26
(40) это я не понял. см (38)
46 zenon46
 
07.02.19
13:27
(44) да, а как потом группировку обходить ?
47 Mikeware
 
07.02.19
13:27
(46) результат получишь в ТЗ
48 Mikeware
 
07.02.19
13:30
где-то валяется  расширение недоделанное для прямой замены обходов кривых запросов на обход прямых, но даже не помню, какой степени готовности... да собственно оно и не нужно особо
49 zenon46
 
07.02.19
13:32
(47)  select  <<?>> док.iddoc [Док $Документ.УстановкаЦен]
Запрос[2] : Ожидается  '=' перед 'док'
Странно зачем там знак =
50 Mikeware
 
07.02.19
13:34
(49) это кто такое сказал?
51 Mikeware
 
07.02.19
13:46
(49) млин, интригу тянешь?
52 Herby
 
07.02.19
13:47
(34) даже если черный запрос протранслируется в sql в такой же прямой, как и если бы ты его сам написал, то черный все равно будет медленнее - потому что создается временный дбф файл.
53 Провинциальный 1сник
 
07.02.19
13:58
(49) Воспользуйся восьмеркоподобной консолью запросов для прямого запроса
http://www.1cpp.ru/forum/YaBB.pl?num=1193394153
54 Mikeware
 
07.02.19
14:12
(53) 1cQA проще.
55 zenon46
 
07.02.19
15:19
(51) предприятие эту ошибку выдало.
56 Mikeware
 
07.02.19
15:22
(55) дык куда ты в "предприятии" его пихал?
57 zenon46
 
07.02.19
15:33
(56) вот так намутил, правильно?
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |SELECT док.IDDOC [Док $Документ.УстановкаЦен]
    |FROM $ДокументСтроки.УстановкаЦен AS Док
    |WHERE ($Док.Номенклатура=:Товар)
    |";
    РС = СоздатьОбъект("ODBCRecordset");
    РС.УстановитьТекстовыйПараметр("Товар", ТекущийЭлемент());
    Выгрузка = РС.ВыполнитьИнструкцию(ТекстЗапроса);
58 zenon46
 
07.02.19
15:43
(56) по замеру производительности показало снижение времени на общей задаче 15%, это запрос + вывод реестра на форму.
59 Mikeware
 
07.02.19
15:44
(57) ээээ...
не должно тут ругаться...
60 zenon46
 
07.02.19
15:45
(59) да я уже разобрался что не так было. 1cpp.dll - нужно каждому кидать в BIN или достаточно в папку с базой закинуть?
61 Mikeware
 
07.02.19
15:47
(60)  никакой разницы - смотри "порядок загрузки компонент", я не помню его уже
62 Botanik8888
 
07.02.19
15:47
В папку с базой достаточно
63 Botanik8888
 
07.02.19
15:47
1cpp.dll должна загружаться первой
64 Mikeware
 
07.02.19
15:48
(58) у тебя поле поиска неиндексировано, вот и прирост небольшой. что там скан, что тут
65 zenon46
 
07.02.19
15:49
(63) да я ее первой поставил в глПриНачалеРаботыСистемы
66 trad
 
07.02.19
15:53
(58) а по _1sconst как?
67 zenon46
 
07.02.19
17:11
(64) а как в прямом запросе исключать помеченные на удаление? А еще может занаете как синтаксис помощник добавить функции и методы из 1cpp ?
68 Mikeware
 
07.02.19
17:26
(67) 1.приджойнить журнал, и фильтровать по нему.
признак удаления (и проведения) - в журнале
2.кинуть в папку с базоq 1с++.als
69 Злопчинский
 
07.02.19
18:50
(27) в скальной базе - скорее всего да, в файловой - очень- очень сомневаюсь.
70 Злопчинский
 
07.02.19
18:51
В файловой быстрее будет выборка с установкой отбора по графе
71 zenon46
 
07.02.19
21:48
(70) у меня база уже 50 гигов, какая тут файловая
72 Salimbek
 
07.02.19
23:11
(71) А мне тоже любопытно - код из (29) вы пробовали? Как он по скорости?
73 palpetrovich
 
08.02.19
05:02
(57) немного дорисуй, потом расскажещь :)

    ТекстЗапроса = "
    |SELECT
    |Док.IDDOC [Док $Документ.УстановкаЦен]
    |FROM
    |$ДокументСтроки.УстановкаЦен  AS Док
    |Inner JOIN _1SJOURN AS Жур (nolock) ON Док.IDDOC = Жур.IDDOC
    |    AND (Жур.IsMark = 0) -- не помечен на уд
    |    AND (Жур.CLOSED > 0) -- проведен - если надо
    |    AND (Жур.IDDOCDEF = $ВидДокумента.УстановкаЦен) -- ограничение по виду - не в обяз, но не лишнее
    |    AND (Жур.DATE_TIME_IDDOC >= :ДатаС) AND (Жур.DATE_TIME_IDDOC <= :ДатаПо~) - лучше таки ограничивать по позиции
    |WHERE ($Док.Товар=:Товар)
    |";
    рс = СоздатьОбъект("ODBCRecordset");
    рс.УстБД1С();
    рс.УстановитьТекстовыйПараметр("ДатаС", ДатаС);
    рс.УстановитьТекстовыйПараметр("ДатаПо", ДатаПо);
    рс.УстановитьТекстовыйПараметр("Товар", Товар);
    время = _GetPerformanceCounter();
    тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    время = _GetPerformanceCounter() - время;
    Сообщить("кво строк: "+тз.КоличествоСтрок()+" за "+время+" мс.");
74 Mikeware
 
08.02.19
07:35
(71) всего 50 :-)
75 Mikeware
 
08.02.19
07:42
(73) зачем iddocdef, если при джойне будет использование индекса журнала по iddoc? и зачем дата? все равно iddocdef+date_iime_iddoc тут дополнительной информации не даст
76 trad
 
08.02.19
07:59
(75) если план построится по журну (а так и будет при наличии условия по периоду), то с видом, сработает более селективный индекс
77 Провинциальный 1сник
 
08.02.19
08:00
рс.УстБД1С() тоже лишнее
78 xXeNoNx
 
08.02.19
08:15
В клюшках есть запросы?)
79 ADirks
 
08.02.19
08:25
(78) в клюшках вообще всё есть. даже ООП.
80 Изучаю1С8
 
08.02.19
08:41
Для базы в 50 гигов уже пора освоить 1с++
81 Mikeware
 
08.02.19
08:41
(76) первым все равно будет скан.
Или ты хочеш сказать, что построитель плана при иннер джойне перевернет последовательность, и сначала отберет все доки, соединит со строками, а потом среди них будет детать скан?
если ограничение по датам не нужно, то получается "что пнем об сову, что совой об пень"©
82 Mikeware
 
08.02.19
08:43
(80) ну и с SQLной базой тоже.
да и вообще, прямые запросы банально удобнее.
а если взять класс "ПрямойЗапрос", то вообще практически снеговиковые запросы.
83 Изучаю1С8
 
08.02.19
08:44
По поводу задачи из (0), цена устанавливается документом установка цен, значит в номенклатуре есть реквизит который изменяется этим доком, значит можно из периодики это все выдернуть, зачем доки так искать не очень понятно.
84 Изучаю1С8
 
08.02.19
08:45
(82) Я в курсе)
85 mikecool
 
08.02.19
08:58
завести реквизит в номенклатуру, куда писать последний док - не предлагать?
или надо все выводить?
86 ДенисЧ
 
08.02.19
09:01
(85) Может, ты ещё и плац предложишь метлой подметать, а не ломом?
87 Изучаю1С8
 
08.02.19
09:04
|SELECT
|TOP 1
|
|const_vt.VALUE [Цена $Число.14.2],
|const_vt.docid [id $Документ.УстановкаЦенНоменклатуры]
|
|FROM _1SCONST const_vt  (nolock)
|
|LEFT JOIN $Справочник.Номенклатура as СпрНоменклатура (nolock)
|ON СпрНоменклатура.ID = :ВыбТовар
|
|WHERE const_vt.ID = '42425'
|AND const_vt.OBJID = :ВыбТовар
|AND const_vt.DATE <= :ВыбДата
|ORDER BY const_vt.DATE DESC,const_vt.TIME DESC,const_vt.DOCID DESC,const_vt.ROW_ID DESC

Вот так из переодики док получить с ценником например
88 ADirks
 
08.02.19
09:04
(82) Ага, именно так :))
Я давным давно в запросах, где есть журнал с отбором по периоду, ставлю журнал первым, и в WHERE условие по IDDocDef. Это хороший индекс.
89 zenon46
 
08.02.19
09:12
(82) а как в прямых запрос использовать, заменяется функция, вот как пример "черного" запроса
        |ФирмаЗ                       = Документ.Реализация.Фирма;
        |Контр                         = Документ.Реализация.Контрагент;
        |СумОтгруз                    = Документ.Реализация.СуммаВзаиморасчетов;
        |Функция СуммаСумм = Сумма(СумОтгруз);
90 Изучаю1С8
 
08.02.19
09:15
(89) А регистра нет что-ли по продажам, от куда можно получить сумму отгрузки с отбором по контрагенту и фирме?
91 Изучаю1С8
 
08.02.19
09:16
Из документов это получать это говнокодинг
92 trad
 
08.02.19
09:16
(81) " при иннер джойне перевернет последовательность"
при наличии условия по позиции - к бабке не ходи
И тут есть варианты: индекс по позиции или индекс по вид+позиция. поэтому по возможности нужно конкретизировать вид, что бы сработал второй, белее селективный, индекс
93 trad
 
08.02.19
09:19
(80) вообще с любой базой надо осваивать прямые запросы. Потому что язык SQL придуман для людей (не то что этот 1c-BQL)
94 Изучаю1С8
 
08.02.19
09:20
(93) С восьмеркой ненадо к сожалению.
95 trad
 
08.02.19
09:27
(87) 1.зачем тут справочник?
2.что получим если периодика двигается документом отличным от $Документ.УстановкаЦенНоменклатуры ?
96 trad
 
08.02.19
09:27
(94) а на восьмерке ты на каком языке запросы пишешь?
97 Mikeware
 
08.02.19
09:28
(85) "дядя петя, ты дурак?"©
98 trad
 
08.02.19
09:28
выбрать
из
внутреннее соединение
левое соединение
где
- что это если не язык SQL?
99 ADirks
 
08.02.19
09:29
(94) и с восьмёркой надо
100 Mikeware
 
08.02.19
09:31
(88) ну так это если есть отбор по периоду...
а если нету, и связь по иду - то индекс iddoc ничем не хуже, чем journal
101 Изучаю1С8
 
08.02.19
09:34
(95) 1. Если ты про этот кусок

|LEFT JOIN $Справочник.Номенклатура as СпрНоменклатура (nolock)
|ON СпрНоменклатура.ID = :ВыбТовар

то он ненужен, я выдернул у себя кусок, у меня там реквизиты нужны в запросе

2. Не известно как у (0) все организовано, поэтому не вижу смысла гадать что там будет. Если что всегда можно отобратся по вид доку например
102 Mikeware
 
08.02.19
09:39
(98) ну, это некий язык запросов, основанный на операциях реляционной алгебры :-)
"ну какой же это SQL если у него нет DDL&"© :-)
Ну и некоторые буквоеды на этом основании отвергают, что база 1с - реляционная...
103 trad
 
08.02.19
09:42
(102) DDL ∉ SQL
104 trad
 
08.02.19
09:44
(103) чую, помидорами закидают, за такую позицию )
105 Mikeware
 
08.02.19
09:48
(103) ну, вообще говоря, мнения разные есть. в свое время видел нехилый ср@ч на эту тему...
106 Изучаю1С8
 
08.02.19
10:01
(96) Я понимаю к чему ты клонишь, но исходя из того что вижу, 90% тех кто пишет на снеговике не думают про оптимизацию и во что восьмерка конвертит запрос.
В этом смысле 1с++ хорошая школа 1сника.
107 Mikeware
 
08.02.19
10:06
(106) угу. "работает медленно - это у вас сервер слабый" :-)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн