gifts2017

Пакетные запросы для чайников

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

Когда мой запрос стал таким сложным, что превысил пределы моего понимания, я решил использовать пакетные запросы.
Но столкнулся с фактом, что ничего о них не знаю. Оказалось, все очень просто. Через 5 минут вы будете уметь пользоваться пакетными запросами. Начинайте читать.

Когда мой запрос стал таким сложным, что превысил пределы моего понимания, я решил использовать пакетные запросы.

Но столкнулся с фактом, что ничего о них не знаю. Оказалось, все очень просто. Через 5 минут вы будете уметь пользоваться пакетными запросами. Начинайте читать.

Как оказалось все очень просто. Нужно просто написать несколько запросов, разделенных точкой с запятой. Результат вернется в последнем запросе.

Пакетные запросы появились только в версии 8.1.11.67.4.

Вот текст запроса:

ВЫБРАТЬ Т1.Зн ПОМЕСТИТЬ ВТБуквы ИЗ (ВЫБРАТЬ "А" КАК Зн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Б") КАК Т1;

ВЫБРАТЬ Т1.Зн ПОМЕСТИТЬ ВТЦифры ИЗ (ВЫБРАТЬ "1" КАК Зн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "2") КАК Т1;

ВЫБРАТЬ ТБ.Зн, ТЦ.Зн, ТБ.Зн+ТЦ.Зн ИЗ ВТБуквы КАК ТБ, ВТЦифры КАК ТЦ

Пакетные запросы поддерживаются в любой обычной консоли запросов.

На рисунке представлен образец выполнения запроса:

А теперь немного из опыта. Зачем нужны пакетные запросы.

Дело в том, что во временную таблицу можно вложить какой-то промежуточный результат, который потом может понадобиться в нескольких последующих запросах.

Раньше, когда не было временных таблиц, пришлось бы дублировать текст запроса.

Можно конечно, обойтись без пакетного запроса, последовательно выполняя несколько запросов и манипулируя вложенными таблицами. Но с пакетными запросами удобнее. Просто пишешь запрос, и не думаешь о размещении временных таблиц. Все происходит само.

Кроме того, если используется система компоновки данных (СКД), она грамотно отбирает нужные поля и минимизирует весь пакет запросов.

Если у запросов был метод Запрос.Выполнить() то теперь появился метод Запрос.ВыполнитьПакет(), который возвращает все таблицы из пакета, в виде массива.

Анонс пакетных запросов на сайте 1с находится здесь: http://v8.1c.ru/overview/release_8_1_11/#Functional

История из жизни

Объясню, что меня подвигло на пакетные запросы.

Значит, представьте есть документ, у него табличная часть. В колонке «Ошибка» признак, есть ли ошибка при заполнении документа. В колонке «ТекстОшибки» может быть одно или несколько предложений с текстами ошибок. Виды ошибок, содержащиеся в предложениях известны заранее.

Так вот, мы заносим список всех ошибок в таблицу КодыОшибок – там содержится код ошибки и подстрока поиска.

Далее соединяем табличную часть с кодами ошибок.

Получаем для каждой строки одну, две или больше ошибок. Т.к. в одной строке может быть несколько ошибок.

Но ошибка может быть и не распознана, т.е. флаг «Ошибка» стоит, а текст ошибки не выдал нам код ошибки.

Делаем левое соединение, там где код ошибки есть NULL, даем код ошибки «Прочие ошибки» .

Но проблема была в том, что кодов ошибок было около 200, поэтому левое соединение работало очень долго. Пришлось заменить его на внутреннее соединение, которое летало. Но при этом терялись строки, для которых ошибка была не найдена. Я так и не смог понять, как вытащить эти строки в результат.

Запрос писался для системы компоновки, т.е. никаких таблиц значений или временных таблиц применять нельзя в принципе. Тут и пригодились пакетные запросы.

Я просто еще раз соединил все строки с ошибками со всеми строками, для которых были найдены ошибки, и добавил все-таки вид ошибки «Прочие ошибки».

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 07.02.12 16:02
(0) Статью двухлетней или трёхлетней давности от Чистова не читал? Там намного подробней расписано.
2. Осипов Сергей (fixin) 07.02.12 16:25
(1) чукча не читатель, чучка писатель...
sergio199; hulio; anig99; serg_gres; +4 Ответить 1
3. Семен Слепаков (sa1m0nn) 08.02.12 07:22
Автор попутал б-жий дар с яичницей. Описано так, как будто пакетные запросы - что-то недосягаемое и нереально крутое... Это обыденность, простой механизм наряду с прочими механизмами платформы.
4. Сергей Иванов (psa247) 08.02.12 07:25
написано же - для "чайников"
5. Александр Медведев (anig99) 08.02.12 08:08
Если уж пейсатель (и оператор кстати тоже, гыгы), то тогда лучше для чайников сделать 2 изменения.
1. В заглавие добавить что-то типа "как написать свой первый пакетный запрос"
2. Найти статью Чистова и дать на неё ссылку.
hulio; fishca; +2 Ответить 2
6. aleks (maldinitaly) 08.02.12 08:25
Согласен с (5) лучше найти ссылку на статью Чистова
7. yuraskas Рупышев (yuraskas) 08.02.12 08:46
Ну прямо все заладили с Чистовым, ну так дайте ссылку на эту статью, я например не читал.
8. sound sound (sound) 08.02.12 09:17
Набросились такие на человека, по моему для чайников в самый раз :)
9. Fomix (fomix) 08.02.12 10:02
Неееее для чайников не потянет - мудрено написано... Картинок мало... И запрос не из ЗУПа (на 10 листов формата А4)... Переписать!
10. Осипов Сергей (fixin) 08.02.12 10:52
(6)(5) у чистово сложнее и искать надо, а тут под рукой, на ИС.
(4) вот именно, быстрый старт, так сказать.
(8) о чем и речь. Пусть выскажутся чайники.
(9) статья для чайников, а не для дураков.
11. Дмитрий Шпаковский (Godman) 08.02.12 12:51
Скажу так: шел мимо, знал что есть пакетные запросы, но никогда не пользовал, как-то не было нужды. А тут подробно написано как, что и когда, и самое главное пример из жизни для чего. Теперь приблизительно понятно для чего это может пригодиться. Автору спасибо.
А ссылку на Чистова дайте уж пожалуйста. И вообще странный народ, какой смысл писать фразу про Чистова, если вы не даёте ссылку? Если знаете нечто по существу, так дайте развернутый ответ.
12. Дмитрий Шпаковский (Godman) 08.02.12 12:52
13. Екатерина Соколова (catena) 08.02.12 14:12
Чтение действительно облегчает, но, я так поняла, выигрыша в оптимизации нет?
14. Осипов Сергей (fixin) 08.02.12 18:03
(13) почему это нет? Простые запросы можно быстрее выполнить, чем один сложный... Редко когда нужно оптимизировать... ;-)
(12) у Чистова тоже не густо.
15. Юлия Сорокина (YuliaYVS) 08.02.12 18:48
Немного в защиту автора: из общения с некотороми человеками, скажем так, возникает проблема,что читать что-то официальное, специально написанное, они не хотят. Вы за них прочитайте и выберете для них главное (с их точки зрения) и не важно, что это это уже написано, и скорее всего проще, доступнее.
Будем надеяться, что у автора не пропадет желание что-то ещё писать и делать.
При составлении инструкции всем угодить нельзя, очень редко бывает, чтобы угодить хотябы половине...
nlvhome; Innuil; fixin; +3 Ответить 1
16. Осипов Сергей (fixin) 08.02.12 22:21
(15) официальные инструкции слишком официальны! ;-)
17. Сергей Ожерельев (Поручик) 09.02.12 02:09
(14) Как раз у Чистова изложено понятно, что это такое и для чего нужно.
(13) В некоторых случаях выигрыш есть, Чистов об этих случаях и рассказывает.
18. Екатерина Соколова (catena) 09.02.12 06:22
(17)В ссылке из (12) выигрыш только в НЕ создании лишнего объекта запрос и менеджера ВТ.

Еще есть обтекаемая фраза "естественно что система при каждом вложенном запросе заново обращается к базе данных для получения данных." - а при использовании вместо вложенного запроса пакетный не обращается? Т.е. запросы выполняется последовательно и все соединения потом отрабатываются с готовыми выборками?

Является ли 1с-ное "поместить... ;" в данном случае аналогом скульного with ... as?
19. Осипов Сергей (fixin) 09.02.12 07:19
(17) ну пусть Чистов изложит свое видение на Инфостарте. Я изложил свое.
20. Лена (Ленкина) 09.02.12 07:24
По-моему не писала еще пакетные запросы, делаю вложенные, иногда получаются достаточно сложные для чтения и правки, особенно, если приходится к ним возвращаться спустя какое-то время. Так что в таких случаях пакетные наверное удобны... Теперь, если понадобится сложный запрос, попробую сделать пакетный. Так что спасибо автору, что напомнил про такую возможность))
21. Модератор раздела Сергей Лунев (luns) 09.02.12 09:36
(10) fixin,
статья для чайников, а не для дураков.

полегче.
будешь высказываться в подобном стиле, отдохнешь от комментариев месяц.
22. Осипов Сергей (fixin) 09.02.12 10:42
Лунс, не нервничай, я имел ввиду "Защиту от дурака". Вполне литературный термин...
Можно поправить на глупцов.
23. Илья (i132) 09.02.12 10:54
по моему у Чистова понятней ( http://www.nashe1c.ru/materials-view.jsp?id=47#oultine_7 )

Стоит добавить: пакетные запросы удобны если надо делать запрос к таблице значений или еще не записанному документу

Запрос.Текст =
"Выбрать ТабЧастьТовары.Номенклатура,ТабЧастьТовары.Количество
|Поместить ТабЧасть из &ТабЧать как ТабЧастьТовары;
|Выбрать * из ТабЧасть";
Запрос.УстановитьПараметр("ТабЧать",Док.Товары);
(тоже боян)
24. Осипов Сергей (fixin) 09.02.12 11:15
(23) сколько людей - столько мнений!
25. LukoyanovAS (lukoyanovas) 13.02.12 07:05
"Запрос писался для системы компоновки, т.е. никаких таблиц значений или временных таблиц применять нельзя в принципе"
Это почему?
26. Сергей Ожерельев (Поручик) 13.02.12 08:45
Я тоже вброшу
(0) >>>> Запрос писался для системы компоновки, т.е. никаких таблиц значений или временных таблиц применять нельзя в принципе
Прямо так и нельзя в принципе? В принципе таблицу значений в СКД передать можно. http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=571359
27. Роман Махно (parvoos) 13.02.12 09:22
28. Владимир К (VladKir) 13.02.12 09:49
(26) Поручик, если вам это необходимо, то может быть нужно подумать о том, чтобы поменять логику построения?

Пакетные запросы позволили мне сэкономить почти на порядок времени при выполнении огромного запроса с кучей вложенных подзапросов всего лишь грамотным их разнесением. Также можно обращаться в разных пакетах к однажды выполненному запросу, а не выполнять его многократно.

Ну и если данное руководство кому-то поможет, то почему нет? Вдруг кто-то да научится, почитает статью Чистова и начнёт правильно писать, чтобы потом другому человеку не переписывать данный кусок при принятии конфигурации на поддержку?
29. Осипов Сергей (fixin) 13.02.12 10:31
(26) когда писал, еще не знал. таблицу значений в СКД передать можно, но менеджера временных таблиц в СКД нет.
30. Сергей Ожерельев (Поручик) 13.02.12 10:36
(29) Впечатление такое, что тебя в погребе держали года три, и вот внезапно мятежный дух восстал из ада.
31. Осипов Сергей (fixin) 13.02.12 15:39
(30) неа. просто копипащу со своего сайта... Тут обратная связь имеется, прикольно. Да и рейтинг растет как на доржжах.
32. Александр Доровских (Requiem) 14.02.12 07:38
Лучше переименовать статью во "Временные таблицы для чайников", потому что пакетные запросы это немного другое. Суть пакетных запросов в том, что можно сделать несколько запросов, не обязательно помещенных во временную таблицу, можно их получить как Запрос.ВыполнитьПакет().
33. Осипов Сергей (fixin) 14.02.12 07:59
(32) Буквоедством страдаете? Могли бы сказать без буквоедства, что пакетные запросы не всегда используют временные таблицы, а в данной статье упор в основном сделан на них. ;-)
34. Дмитрий (dimk@a) 21.03.12 16:12
Ув. fixin, высказываюсь как чайник. Объяснение зачем - понятно, так действительно проще для восприятия. Но пример запроса вгоняет в полнейший ступор. В частности, вот это:
ВЫБРАТЬ Т1.Зн ПОМЕСТИТЬ ВТБуквы ИЗ (ВЫБРАТЬ "А" КАК Зн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Б") КАК Т1;

вместо <список источников> два объединенных запроса опять же без источников. Может это чисто абстрактный пример, но мой мозг разорван в клочья и не воспринимает дальнейшую информацию. Если бы вы привели полностью весь код запроса - было бы понятнее для чайника ,имхо.
И еще два вопроса по существу, ответа на которые, кстати в желтых книгах тоже нет:
1. при использовании пакетных запросов реально можно не создавать менеджер временных таблиц?
2. если юзать пакетный запрос без временных таблиц, то как обращаться к результатам предыдущего запроса?
35. Осипов Сергей (fixin) 21.03.12 21:14
вложенный запрос просто выдает таблицу из одной колонки Зн в которой в первой строке А, во второй строке Б.
1. Да, можно не создавать менеджера, если вам не надо потом получать данные из промежуточных временных таблиц, а достаточно результата
2. А смысл? Результаты промежуточных запросов никуда не сохраняются и к ним доступ не получить. Так что временные таблицы!
36. Дмитрий (dimk@a) 21.03.12 22:36
(35) fixin,
[QUOTE=fixin]вложенный запрос просто выдает таблицу из одной колонки Зн в которой в первой строке А, во второй строке Б. [/IS-QUOTE] нигде не встречал ранее, запомню.
по вопросу 2 - я имел ввиду следующий запрос в пакете. или о чем вы здесь говорите (33):
пакетные запросы не всегда используют временные таблицы
37. Осипов Сергей (fixin) 22.03.12 08:12
(36) перефразируй вопрос, не понял
38. Дмитрий (dimk@a) 22.03.12 08:31
для передачи результатов между запросами внутри пакета всегда используются временные таблицы? или можно без них.
они как я понял могут тормозить работу запроса.
39. Осипов Сергей (fixin) 22.03.12 11:10
(38) без них не получится. ;-) но ВТ можно использовать без создания менедежера временных таблиц, да хоть в СКД
40. Осипов Сергей (fixin) 13.04.12 17:58
Кстати, статья Чистова в тему: http://pro1c.org.ua/index.php?showtopic=3052
И заметки самому себе:
 ВЫБРАТЬ 1 КАК П Поместить Т;
 ВЫБРАТЬ Т.П Поместить Т1 ИЗ Т; 
 УНИЧТОЖИТЬ Т;
41. Незнайка Незнайка (ytpyfqrf) 05.05.12 21:13
мне помогло!!!
Закинул в консоль, просмотрел вложенные запросы, временные таблицы, попробовал свой маленький пример сделать и получилось.
Большое спасибо автору, не пожалел времени и потрудился для меня и таких как я, учтите, что ему это уже не нужно было!
42. nikolaygorbunov (nikolaygorbunov) 19.12.12 11:43
Запрос писался для системы компоновки, т.е. никаких таблиц значений или временных таблиц применять нельзя в принципе.


Почему нельзя, можно, советую Хрусталеву почитать.
43. nikolaygorbunov (nikolaygorbunov) 19.12.12 11:45
+(42) Статья кстати толковая, спасибо.
44. Дмитрий Живето (getnight) 23.03.15 14:35
Бывает, что не хватает самой малости, чтобы понять какую-нибудь в принципе простую вещь.
После чего ты никак не можешь понять, почему ты не понимал этого раньше.

Спасибо тем, кто еще помнит, что мешало разобраться с темой, и тратят свое личное время на то, чтобы помочь другим преодолеть этот шаг.

В то же время господа-профессионалы любят стебаться над чужими статьями, сами при этом ничего не пишут, или пишут на таком марсианском языке, что новичкам и чайникам проще искать решение в другом месте, чем выпрашивать совет мелкими крошками, как милостыню.

От меня лично - большое спасибо, вроде не чайник, но ранее не пересекался с темой, натолкнула на новые мысли.
45. Сергей Евстигнеев (grey_yes) 08.06.15 16:16
(44) getnight, просто поддержу Ваши мысли....

хотя кмк автору следовало бы более подробнее расписать для "чайников" смысл запроса...
читателю сначала надо врубиться в суть примера, и только потом понять "простоту" пакетного запроса
46. Осипов Сергей (fixin) 08.06.15 16:48
(45) я гений 1С, не всегда могу разжевать для посредственностей, но стараюсь. ;-)
47. Александр Медведев (anig99) 08.06.15 17:06
(46) Фиксин как всегда жжот (:
48. Алексей Т. (CratosX) 28.10.16 19:12
(1) Поручик, (2) fixin, - У Чистова-то может и написано было, но ссылки из (12) Godman уже недоступна. Так что иногда полезно копипастить или переизлагать инфу на разных ресурсах.