Имя: Пароль:
1C
1С v8
Запрос к табличной части текущего документа. Какой в этом смысл?
,
0 Lex_Liven
 
29.03.14
08:52
Всем привет.
Разбирая чужой код, наткнулся на странную организацию обработки проведения одного документа. Суть в том, что в обработке зачем-то делается запрос к табличной части этого документа с условием
ГДЕ
    |    ИнвентаризацияСостав.Ссылка = &Ссылка";

причем никаких больше отборов не задается, после получения результата все строки тупо перебираются одна за другой.
Какой смысл в таком коде? Почему нельзя было использовать цикл "Для Каждого" по табчасти документа?
1 Wobland
 
29.03.14
08:55
а чего это нельзя было?
2 Lex_Liven
 
29.03.14
08:57
Вот и я спрашиваю, какие у автора кода могли быть причины написать именно так? Зачем так вообще делается?
3 Lex_Liven
 
29.03.14
09:01
Я понимаю, когда леается запрос к ТЧ с каким-то отбором, чтобы не все строки перебирать. Но зачем делать запрос ко всей ТЧ? Что дает такой метод? Прирост производительности относительно одного простого цикла? Сомневаюсь.
4 Wobland
 
29.03.14
09:02
забей
5 Lex_Liven
 
29.03.14
09:02
(4) Не хочу. Я хочу понять, зачем. Я хочу переписать этот код на один простой цикл. И опасаюсь, что упадет производительность.
6 Lex_Liven
 
29.03.14
09:03
(5) Тем более, что проведение документа и так занимает пару минут. (В ТЧ порядка 2-3 тысяч строк).
7 zak555
 
29.03.14
09:05
полный текст запроса приведи
8 Wobland
 
29.03.14
09:05
вот я раньше бумажные книги читал. а страницу перелистывал всегда одной рукой - любой случайно выбранной. надо же как-то определиться, каким образом перебирать ТЧ
9 Lex_Liven
 
29.03.14
09:10
Полный текст запроса:
    "ВЫБРАТЬ
    |    ИнвентаризацияСостав.Товар,
    |    ИнвентаризацияСостав.КолФ,
    |    ИнвентаризацияСостав.Цена,
    |    ИнвентаризацияСостав.СумФ
    |ИЗ
    |    Документ.Инвентаризация.Состав КАК ИнвентаризацияСостав
    |ГДЕ
    |    ИнвентаризацияСостав.Ссылка = &Ссылка";
10 Lex_Liven
 
29.03.14
09:11
Выбираются ВСЕ колонки ТЧ и ВСЕ ее строки.
11 Lex_Liven
 
29.03.14
09:12
(8) Мы теряем время во-первых, на запрос к ТЧ, во вторых, потом на перебор результата.
Я просто не верю, что это может быть быстрее одного перебора по ТЧ.
12 hhhh
 
29.03.14
09:13
(10) это для скорости, если групповое проведение документов, ваше "Для Каждого" раз в 15 будет медленнее, чем запрос. А бухгатера ведь очень часто перепроводят документы, поэтому это важно.
13 Lex_Liven
 
29.03.14
09:14
(12) То есть все-таки, Запрос + "Пока Рез.Следующий() Цикл" - быстрее, чем "Для Каждого"?

Тогда возникает вопрос номер два. Почему в типовых это редко используется? (Честно говоря, вообще ни разу не встречал)
14 Wobland
 
29.03.14
09:18
(13) мы тут как-то спец.олимпиаду устраивали - Спавочник.Выбрать против запроса. бывает такое, что объектный подход работает быстрее, для этого нужны какие-то особенные флуктуации в атмосфере и железо. но бывает, на миллисекунды, конечно.
судя по тому, как ты описал свою ситуацию, ты занимаешься онанизмом. поэтому (4)
15 Lex_Liven
 
29.03.14
09:21
(14) Судя по этому комментарию, не (4), а "делай как тебе удобнее". Собственно, такой ответ меня устраивает.
16 Wobland
 
29.03.14
09:21
хорошо. забей на этот вопрос и пиши, как удобней ;)
17 mistеr
 
29.03.14
09:22
(14) >Спавочник.Выбрать против запроса
А-ха-ха! Хорошая шутка.
18 Wobland
 
29.03.14
09:23
(17) замерь
19 HEKPOH
 
29.03.14
09:24
(0) Проведи опыт.
Сделай замер производительности по двум алгоритмам.
Оч хочется посмотреть на результат :)
(17) Это не шутка. Объектный метод, действительно, иногда работает не медленнее запроса
20 mistеr
 
29.03.14
09:24
(15) Это скорее следование общему подходу из типовых: при проведении использовать сохраненное состояние объекта из БД, согласованное со всем остальными данными. Просто в данном конкретном случае другие данные в запросе не используются.
21 HEKPOH
 
29.03.14
09:25
(20) Объект уже записан!
22 mistеr
 
29.03.14
09:25
(19) Я к тому, что Справочник.Выбрать() и делает запрос.
23 m-serg74
 
29.03.14
09:39
(15) не тупи, запрос с таким условием "только к записанным данным"
24 Lex_Liven
 
29.03.14
09:43
(23) Мне одному кажется, или в событии "ОбработкаПроведения" - документ уже записан?
25 Мимохожий Однако
 
29.03.14
09:44
(0)Какая конфигурация? ИМХО, это важно.
26 Wobland
 
29.03.14
09:46
(24) мне тоже так кажется
27 HEKPOH
 
29.03.14
09:47
(24) Сделай вывод сам по (20) :)
28 HEKPOH
 
29.03.14
09:47
т.е. по (21)
29 Lex_Liven
 
29.03.14
09:52
(28) Очевидно, что выводы делать я не могу. Я же туплю, судя по (23) :)

(20) А какие могут быть несогласования в (данных документа) с (данными того же документа из базы) в момент его проведения?

(25) Это не важно просто потому, что вопрос был о двух подходах к одному действию в общем случае.
30 mistеr
 
29.03.14
09:55
(21) И что?
31 HEKPOH
 
29.03.14
09:57
(30) читай (0)
32 Мимохожий Однако
 
29.03.14
09:57
(29)Продолжай партизанить. Жди, когда подтянутся телепаты.
33 HEKPOH
 
29.03.14
09:58
+(31) а именно, "Какой смысл?"
34 Lex_Liven
 
29.03.14
09:59
(32) Да какие телепаты? Что вам даст название конфигурации? Она написана кем-то с нуля, абсолютно не связана с типовыми.
Прочитайте внимательно сам вопрос (0) и (29), часть 3.
35 HEKPOH
 
29.03.14
10:06
(34) Давай уже замер производительности в студию!)))))
36 mistеr
 
29.03.14
10:07
(29) В данном случае несогласования нет. Я говорю про общий подход, который применяется в любом случае. Если завтра понадобится приджойнить еще какой-нибудь регистр для проверки, не нужно будет много переделывать (с цикла на запрос).
37 Belomor
 
29.03.14
10:13
(5) "И опасаюсь, что упадет производительность." - религия не позволяет использовать замер производительности?
38 Lex_Liven
 
29.03.14
10:14
(35) Замер производительности будет позже. Что-то мне подсказывает, что та оптимизация, которую я уже проделал, дает куда больше результатов :)
Но чисто академический интерес остался, так что замер будет.

(37) Религия позволяет сначала спросить, а потом делать, а не сделать и переделывать.
39 Мимохожий Однако
 
29.03.14
10:14
(34)Применение объектного метода с перебором и запросом в конечном итоге завершается запросом к серверу. Тебе уже несколько раз сказали про замер, но результатов пока нет.
40 ДенисЧ
 
29.03.14
10:16
при условии "Она написана кем-то с нуля" - проще спросить разработчика
41 Lex_Liven
 
29.03.14
10:17
(39) То есть вы два часа пытаетесь спросить, фаловая это база или серверная? Отвечаю. Файловая.

(40) А если разработчик уже недоступен? Представляете, и такое бывает.
42 Lex_Liven
 
29.03.14
10:40
Замеры готовы. Как их выкладывать?
43 Lex_Liven
 
29.03.14
10:46
В двух словах. Цикл "Для Каждого Строка ИЗ ТЧ" действительно выполняется выполняется дольше, чем, "Пока Рез.Следующий()" по выборке.
НО! Вся связка "запрос + цикл" занимает примерно столько же времени.
Делать больше число сравнений у меня нет ни времени, ни желания. Я для себя делаю вывод, что цикл по ТЧ просто проще писать, а запрос с обработкой результата более гибок при каких-то сложных проверках и возможном расширении базы.
44 H A D G E H O G s
 
29.03.14
10:47
(39) Вы путаете.
45 H A D G E H O G s
 
29.03.14
10:48
(43) Это кусок типового подхода, забей.
46 H A D G E H O G s
 
29.03.14
10:48
(43) Ну там Остатки по номенклатуре получить, к примеру.
И потом перебрать результат запроса.
Просто у тебя упрощенный случай.
47 Lex_Liven
 
29.03.14
10:49
(46) Я понял. Об этом и говорю.
48 H A D G E H O G s
 
29.03.14
10:50
(47) Тебе - тупо перебирать ТЧ документа, не лезть запросом на сервер. Он, да, будет быстр и шустр, ибо попадание в Индекс почти 100%, но все равно.
49 H A D G E H O G s
 
29.03.14
10:51
Но когда нужны остатки - тогда ТИПОВЫЕ и 1С рекомендуют механизм (0).

Но я с ними - не согласен :-)
50 User_Agronom
 
29.03.14
10:51
(0) Как вариант.
Прог писал что-то. Поисковик выдал пример решения (с форума или еще откуда). Прог оттуда скопировал блок и заточил под свою задачу. Так оказалось быстрее.
А теперь давайте всем форумом искать глубинные причины. Работает? Значит нормально.
51 H A D G E H O G s
 
29.03.14
10:52
(50) Как вариант, прог писавший (0) - сдавал 1С:Специалист
52 Lex_Liven
 
29.03.14
10:56
(48) Не люблю обращение "Тебе - тупо..." Меня как будто оскорбить пытаются.

В данном конкретном случае весь (неграмотный)код вообще переписать надо. У меня тут во-первых, два запроса и два цикла, во-вторых, идиотское движение со списанием всех 3000 строк и оприходование их обратно, в-третьих, проверка некоторых условий все равно идет, но реализвано в цикле, а не в запросе. Короче, (неграмотный)код и есть. Я уже переписал его и доволен результатом.

(51) прог, писавший (0) - это я или прог, писавший код который я привел?
53 Мимохожий Однако
 
29.03.14
11:02
(52)Не переживай. Ты самый лучший прог.
54 Lex_Liven
 
29.03.14
11:05
(53) Я тоже люблю язв без чувства юмора.
55 Diamond905
 
29.03.14
11:41
а надо было просто
    |    ИнвентаризацияСостав.Товар,
    |    Сумма(ИнвентаризацияСостав.КолФ) КАК Колф,
    |    ИнвентаризацияСостав.Цена,
    |    Сумма(ИнвентаризацияСостав.СумФ) КАК Сумф
    |ИЗ
    |    Документ.Инвентаризация.Состав КАК ИнвентаризацияСостав
    |ГДЕ
    |    ИнвентаризацияСостав.Ссылка = &Ссылка
    | СГРУППИРОВАТЬ ПО
    | ИнвентаризацияСостав.Товар
    | ИнвентаризацияСостав.Цена";

Тогда дублирующаяся номенклатура в строках бы лучше проходила
Ошибка? Это не ошибка, это системная функция.