|
Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
NordMad
01.07.15
✎
16:47
|
Подскажите как можно оптимизировать запрос:
Запрос.Текст = “ Выбрать РеализацияТовары.Номенклатура, РеализацияТовары.Количество, ОстаткиТоваров.КоличествоОстаток, ОстаткиТоваров.СтоимостьОстаток, ИЗ Документ.РеализацияТоваров.Товары КАК РеализацияТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрыНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров ПО РеализацияТовары.Номенклатура = ОстаткиТоваров.Номенклатура ГДЕ ОстаткиТоваров.Склад = &Склад” я нашел только то что раздел ГДЕ при обращении к виртуальной таблице нужно перенести в параметр. Что ещё можно сделать? |
|||
1
Ненавижу 1С
гуру
01.07.15
✎
16:49
|
(0) "я нашел только то что раздел ГДЕ при обращении к виртуальной таблице нужно перенести в параметр"
это не только оптимизирует запрос, но и вообще меняет результат запроса |
|||
2
Fragster
гуру
01.07.15
✎
16:49
|
а тебе точно ТЧ всех документов нужна?
|
|||
3
Лефмихалыч
01.07.15
✎
16:50
|
(0) что ты получить хочешь? давай с этого начнем
|
|||
4
Ненавижу 1С
гуру
01.07.15
✎
16:50
|
к тому же подумай, что будет, если в ТЧ будет несколько строк одной номенклатуры?
|
|||
5
NordMad
01.07.15
✎
16:52
|
(2) ну это не производственная задача, а скорее учебная. задача состоит в том чтобы "Какие изменения нужно внести в запрос, чтобы повысить производительность и паралелльность работы?"
с параметром я разобрался, но это не всё. |
|||
6
Лефмихалыч
01.07.15
✎
16:53
|
(5) что должен возвращать запрос-то твой? Человеческим языком объяснить можешь?
|
|||
7
NordMad
01.07.15
✎
16:53
|
то есть вариант про то чтобы заменить раздел ГДЕ на параметр (, Склад = &Склад) - это верно, но не всё
|
|||
8
NordMad
01.07.15
✎
16:55
|
(6) как я понимаю остатки номенклатуры в зависимости от склада
|
|||
9
Ненавижу 1С
гуру
01.07.15
✎
16:55
|
(7) ты понимаешь, что у тебя запрос вернет данные ВСЕХ документов?
|
|||
10
WebberNSK
01.07.15
✎
16:56
|
(5) что за м*д*к такие задачи ставит?
(8) а есть точное объяснение? |
|||
11
WebberNSK
01.07.15
✎
16:57
|
(0) какие измерения в таблице ОстаткиТоваров?
|
|||
12
Лефмихалыч
01.07.15
✎
16:57
|
(8) главный скилл программиста - внимательно читать постановку задачи и понимать, что хотят получить в итоге. У тебя я этого не вижу.
|
|||
13
NordMad
01.07.15
✎
16:57
|
я извиняюсь, суть запроса исходя из задания звучит так:
"В документе Реализация товаров производится списание товаров с регистра учета себестоимости. В обработке проведения происходит обращение к итогам регистра, ниже приведен фрагмент запроса" |
|||
14
NordMad
01.07.15
✎
16:58
|
(11) Структура регистра:
Измерения: Склад, Номенклатура. Ресурсы: Количество, Стоимость Структура документа: Шапка: Контрагент, Договор, Склад. Табличная часть Товары: Номенклатура, Количество, Цена, Сумма. |
|||
15
Timon1405
01.07.15
✎
16:58
|
(0) Автор покури первый запрос тут http://1c.chistov.pro/2010/06/1-82.html если разберешься с первым запросом, читай дальше там много интересного для тебя будет
|
|||
16
Лефмихалыч
01.07.15
✎
16:59
|
(13) тогда нужен, как минимум отбор по ссылке на документ. В предложении ГДЕ
|
|||
17
Ненавижу 1С
гуру
01.07.15
✎
16:59
|
если бы ТЧ было одного документа, условие Ссылка=&ССылка, то я бы еще в параметры остатокв добавил:
Номенклатура В (ВЫБРАТЬ Т.НОменклатура ИЗ Документ.РеализацияТоваров.Товары КАК Т ГДЕ Т.Ссылка=&Ссылка) |
|||
18
NordMad
01.07.15
✎
16:59
|
полный текст вопроса звучит так, (с блокировками я вроде разобрался):
В документе Реализация товаров производится списание товаров с регистра учета себестоимости. В обработке проведения происходит обращение к итогам регистра, ниже приведен фрагмент запроса. В ростом числа пользователей стали поступать жалобы на возникновение взаимоблокировки при проведении. Какие изменения нужно внести в код обработки проведения и/или текст запроса, чтобы данная проблема решилась? Предложите два способа - для режима автоматического управления блокировками и ручного. Какие еще изменения нужно внести в запрос, чтобы повысить производительность и паралелльность работы? Фрагмент текста запроса: Запрос.Текст = “ Выбрать РеализацияТовары.Номенклатура, РеализацияТовары.Количество, ОстаткиТоваров.КоличествоОстаток, ОстаткиТоваров.СтоимостьОстаток, ИЗ Документ.РеализацияТоваров.Товары КАК РеализацияТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрыНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров ПО РеализацияТовары.Номенклатура = ОстаткиТоваров.Номенклатура ГДЕ ОстаткиТоваров.Склад = &Склад” Структура регистра: Измерения: Склад, Номенклатура. Ресурсы: Количество, Стоимость Структура документа: Шапка: Контрагент, Договор, Склад. Табличная часть Товары: Номенклатура, Количество, Цена, Сумма. |
|||
19
Ненавижу 1С
гуру
01.07.15
✎
17:00
|
и наверное остатки только по текущему (у документа) складу, это в условие соединения
|
|||
20
Локи-13
01.07.15
✎
17:00
|
выгрузить из таблица дока склад и номенклатуру и запилить их в параметры вирт таблицы (в обработке проведения и так уже считанный объект есть)
убрать нафик соединение |
|||
21
Fragster
гуру
01.07.15
✎
17:01
|
автору ответ будет примерно такой - включить режим разделения итогов, сначала сформировать и записать движения, затем запросом к остаткам выбрать отрицательные остатки на границу документа (включая) по складу и номенклатуре (склад и список номенклатуры получаются в коде (не в запросе), указываются в параметрах виртуальной таблицы).
|
|||
22
Fragster
гуру
01.07.15
✎
17:01
|
у набора движений не забыть включить "для изменения"
|
|||
23
Локи-13
01.07.15
✎
17:02
|
(21) "включить режим разделения итогов" зачем?
|
|||
24
Fragster
гуру
01.07.15
✎
17:03
|
(23) параллельность записи итогов
|
|||
25
NordMad
01.07.15
✎
17:03
|
можете привести пример верного на ваш взгляд запроса? как он будет выглядеть. Решение должно быть одним запросом без лишнего кода.
|
|||
26
Fragster
гуру
01.07.15
✎
17:04
|
(25) нужен доп код, а запрос вида (Выбрать * Из Регистр.Отстаки(Граница, склад = &Склад, Номенклатура в (&Номенклатура)) где КоличествоКонечныйОстаток < 0)
|
|||
27
Fragster
гуру
01.07.15
✎
17:04
|
это самый "параллельный" вариант
|
|||
28
Локи-13
01.07.15
✎
17:04
|
(25) "Решение должно быть одним запросом без лишнего кода"
плохая постановка задачи. я бы отказался ее делать. |
|||
29
Timon1405
01.07.15
✎
17:06
|
вот вы тут насоветуете ща и чувака вместо гения возьмут на 120к)
|
|||
30
Ненавижу 1С
гуру
01.07.15
✎
17:06
|
(0) Гений проводит собеседование на свое уже бывшее место?
|
|||
31
NordMad
01.07.15
✎
17:07
|
(26) то есть соединение тут вообще не нужно?!
|
|||
32
NordMad
01.07.15
✎
17:08
|
(30) :))) эта задача вроде как с экзамена на специалиста
|
|||
33
NordMad
01.07.15
✎
17:09
|
(26) Выбрать * Из Регистр.Отстаки(Граница, склад = &Склад, Номенклатура в (&Номенклатура)) где КоличествоКонечныйОстаток < 0)
это получается что запрос будет по конкретной номенклатуре, а не по всей же, или я неверно понимаю? |
|||
34
WebberNSK
01.07.15
✎
17:10
|
(33) верно
|
|||
35
NordMad
01.07.15
✎
17:11
|
а нужно то по всей
|
|||
36
pitbul
01.07.15
✎
17:12
|
(35) нет, не по всей, а только по той, которая в ТЧ документа
|
|||
37
Dmitrii
гуру
01.07.15
✎
17:12
|
Текст что-то типа:
ВЫБРАТЬ РеализацияТоваровТовары.Ссылка.Склад КАК Склад, РеализацияТоваровТовары.Номенклатура, СУММА(РеализацияТоваровТовары.Количество) КАК Количество ПОМЕСТИТЬ ТЧТовары ИЗ Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО РеализацияТоваровТовары.Ссылка.Склад, РеализацияТоваровТовары.Номенклатура; ВЫБРАТЬ ТЧТовары.Номенклатура, ТЧТовары.Количество, ОстаткиТоваров.КоличествоОстаток, ОстаткиТоваров.СтоимостьОстаток, ИЗ ТЧТовары КАК ТЧТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрыНакопления.ОстаткиТоваров.Остатки (, (Номенклатура, Склад) В (ВЫБРАТЬ ТЧТовары.Номенклатура, ТЧТовары.Склад ИЗ ТЧТовары КАК ТЧТовары)) КАК ОстаткиТоваров ПО ТЧТовары.Номенклатура = ОстаткиТоваров.Номенклатура Но это пример только для оптимизации самого ЗАПРОСА. Fragster же впаривает про оптимизацию АЛГОРИТМА проведения. А это немножко разные вопросы.... ;) |
|||
38
NordMad
01.07.15
✎
17:13
|
мой вариант ответа был такой:
Запрос.Текст = “ Выбрать РеализацияТовары.Номенклатура, РеализацияТовары.Количество, ОстаткиТоваров.КоличествоОстаток, ОстаткиТоваров.СтоимостьОстаток, ИЗ Документ.РеализацияТоваров.Товары КАК РеализацияТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрыНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК ОстаткиТоваров ПО РеализацияТовары.Номенклатура = ОстаткиТоваров.Номенклатура Пояснение: при работе с виртуальной таблицей такой как «остатки» использовать условие в разделе ГДЕ – ошибочно, так как система сначала собирает всю таблицу, затем осуществляет отбор, по этому условие отбора необходимо писать в параметрах виртуальной таблицы на что я получил ответ: Комментарий про параметры виртуальной таблицы верен, но не все учтено. Какой еще фильтр пропущен? вот и не пойму что имелось ввиду |
|||
39
Fragster
гуру
01.07.15
✎
17:13
|
(32) внимательно прочитай (21)(22) и сделай все как там
|
|||
40
Fragster
гуру
01.07.15
✎
17:13
|
(38) если экзамен на спеца, см. (39)
|
|||
41
Dmitrii
гуру
01.07.15
✎
17:14
|
+ к (37): заменить "ОстаткиТоваров.КоличествоОстаток" на "ЕСТЬNULL(ОстаткиТоваров.КоличествоОстаток, 0) КАК КоличествоОстаток"
И тоже самое с ОстаткиТоваров.СтоимостьОстаток |
|||
42
Fragster
гуру
01.07.15
✎
17:15
|
(37) а еще у меня сертификата нет ни одного
|
|||
43
Dmitrii
гуру
01.07.15
✎
17:15
|
(38) Пропущен фильтр по ссылке на документ реализации
|
|||
44
Dmitrii
гуру
01.07.15
✎
17:15
|
(42) Не грусти. Это не главное :)
|
|||
45
NordMad
01.07.15
✎
17:19
|
(43) какой?
|
|||
46
Fragster
гуру
01.07.15
✎
17:21
|
походу в (0) не контроль остатков, в (0) - формирование суммы по среднему для списания.
|
|||
47
Fragster
гуру
01.07.15
✎
17:22
|
хотя зачем средняя стоимость в разрезе складов - непонятно.
|
|||
48
Euguln
01.07.15
✎
17:22
|
(38) Можно еще номенклатуру запихать в параметры, но это надо ВТ по ТЧ делать.
|
|||
49
Euguln
01.07.15
✎
17:24
|
(48) + как в (37) )))
|
|||
50
Dmitrii
гуру
01.07.15
✎
17:24
|
(47) Не лезь в такие дебри. Наверняка средняя считается в разрезе складов. Кроме того контроль отрицательных остатков в разрезе складов однозначно нужен.
|
|||
51
Dmitrii
гуру
01.07.15
✎
17:25
|
(45) см.(37): строка ГДЕ РеализацияТоваровТовары.Ссылка = &Ссылка
|
|||
52
NordMad
01.07.15
✎
17:26
|
(43) интересно что тут за фильтр имелся ввиду? просто я думаю что если ответ на мой вариант был: Комментарий про параметры виртуальной таблицы верен, но не все учтено. Какой еще фильтр пропущен?
то имелось ввиду что то дописать к ЭТОМУ запросу |
|||
53
NordMad
01.07.15
✎
17:27
|
(51) понял. спасибо. ну попробую такой вариант показать, посмотрим что скажут
|
|||
54
Dmitrii
гуру
01.07.15
✎
17:28
|
+ к (51). Возможно еще имеется ввиду параметр виртуальной таблицы Остатков - Период. Нужно указывать момент времени документа.
|
|||
55
Timon1405
01.07.15
✎
17:30
|
(53) Будь мужиком, прочитай (15) блажь!
|
|||
56
NordMad
01.07.15
✎
17:36
|
(55) да яж только ЗА. но мне седня нужно ответить... вот и обратился.. потому что сам не могу понять че ему ещё надо
|
|||
57
NordMad
01.07.15
✎
17:38
|
кстати ссыль то чет не открывается... хмм.. (15)
|
|||
58
yukon
01.07.15
✎
18:00
|
(18) Еще бы знать структуру регистра ОстаткиТоваров
|
|||
59
NordMad
01.07.15
✎
18:01
|
(58) это всё что дано было по заданию, видимо предполагается что этой информации достаточно
|
|||
60
Dmitrii
гуру
01.07.15
✎
18:05
|
(58) В (18) структура регистра описана.
|
|||
61
yukon
01.07.15
✎
18:06
|
(60) Слона-то я не приметил. :)
|
|||
62
yukon
01.07.15
✎
18:13
|
Тогда монстр-запрос:
ТекстЗапроса = "ВЫБРАТЬ | РеализацияТовары.Номенклатура КАК Номенклатура, | СУММА(РеализацияТовары.Количество) КАК Количество |ПОМЕСТИТЬ ВТРеализацияТовары |ИЗ | Документ.РеализацияТоваров.Товары КАК РеализацияТовары |ГДЕ | РеализацияТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РеализацияТовары.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура; | |ВЫБРАТЬ | Остатки.Склад КАК Склад, | Остатки.Номенклатура КАК Номенклатура, | Остатки.КоличествоОстаток КАК КоличествоОстаток, | Остатки.СтоимостьОстаток КАК СтоимостьОстаток |ПОМЕСТИТЬ ВТОстатки |ИЗ | РегистрНакопления.ОстаткиТоваров.Остатки( | , | Склад = &Склад | И Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТРеализацияТовары)) КАК Остатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура; | |ВЫБРАТЬ | ВТРеализацияТовары.Номенклатура КАК Номенклатура, | ВТРеализацияТовары.Количество КАК Количество, | ЕСТЬNULL(ВТОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ВТОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ВТРеализацияТовары КАК ВТРеализацияТовары | ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки | ПО ВТРеализацияТовары.Номенклатура = ВТОстатки.Номенклатура" |
|||
63
yukon
01.07.15
✎
18:20
|
Для автоматического режима блокировок добавить во второй запрос "ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.ОстаткиТоваров.Остатки"
Для управляемого перед выполнением запроса установить управляемую блокировку: Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.ИсточникДанных = Товары; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); |
|||
64
NordMad
02.07.15
✎
10:53
|
(63) а сам запрос больше менять не нужно?! я в смысле того что имелось ввиду: Комментарий про параметры виртуальной таблицы верен, но не все учтено. Какой еще фильтр пропущен?
|
|||
65
yukon
02.07.15
✎
14:28
|
(64)
> а сам запрос больше менять не нужно?! Кроме "ДЛЯ ИЗМЕНЕНИЯ" нет, не нужно. > Какой еще фильтр пропущен? По номенклатуре "Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТРеализацияТовары)" |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |