Имя: Пароль:
1C
1С v8
Оптимизация запроса
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)
> а сам запрос больше менять не нужно?!

Кроме "ДЛЯ ИЗМЕНЕНИЯ" нет, не нужно.

> Какой еще фильтр пропущен?
По номенклатуре "Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТРеализацияТовары)"