0. dst31 88 28.09.12 00:02 Сейчас в теме

Пример использования временных таблиц в запросах (8.2)

Имея некоторый опыт разработки, не раз приходилось видеть, насколько нерационально и громоздко порой строятся запросы начинающими разработчиками к информационным базам 1С. Существует достаточно простой и удобный механизм временных таблиц, при использовании которого можно разбить большой и плохо читаемый запрос на несколько небольших. Можно так же по некоторому алгоритму сформировать таблицу значений, поместить ее во временную таблицу и выполнить по ней запрос.
В данной публикации на примере процедуры проведения документа Реализация, не вникая в детали алгоритма проведения, описываются некоторые приемы использования временных таблиц в запросах к информационной базе на платформе 8.2. Автор публикации не претендует на полноту освещения вопроса или методическую безупречность.


Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Поручик 4350 28.09.12 00:02 Сейчас в теме
(0) Старо. Пример в статье можно реализовать пакетным запросом с большей эффективностью и наглядностью.
Gotcha; Stety; +2 Ответить
3. mr zafod 22 28.09.12 05:53 Сейчас в теме
Нельзя такие статьи пропускать, ну просто снос крыши. У Вас подход к решению задачи не верный изначально. Верно сказали в (1) - все можно решить пакетным запросом, тем более в вашем случае - Вы в цикле получаете состав комплекта (набора).
Могу вам привести для примера хороший и очень быстрый контроль остатков на ВТ и пакетном запросе, если хотите
44. Gotcha 5 05.08.15 13:16 Сейчас в теме
(1)
После использования пакетных запросов везде, где попало, оптимизатор запросов, который без изменений, фактически, живет еще с Sybase, обламывается на 16 подзапросе и давай, до свидания вся Ваша хваленая производительность, как и читабельность. Привык народ фигачить монструозные запросы. Посидели-бы Вы на старом добром аксессе, во времена windows 95. Ставлю плюс, подход понадобился при соединении по оле к хх базам и сборе данных из них в одну виртуальную таблицу.
45. Поручик 4350 05.08.15 14:35 Сейчас в теме
(44) Ну молодец, вовремя прокудахтал. Ещё трёх лет не прошло после моего поста.
46. Gotcha 5 05.08.15 15:09 Сейчас в теме
(45)
Кудахтают петухи, сохраняйте приличия
Я видел девочек, которых научили писать SQL запросы, вот они любили рисовать полотенца на T-SQL, где пока дочитаешь до конца, уже напрочь забывал, что было вначале. Не учите всех делать некрасиво и нечитабельно, вопрос производительности - спорный, но я думаю, что архитектурные конструкции автора статьи вполне бодро работают.
2. khaoos 239 28.09.12 04:45 Сейчас в теме
Стоит сказать, что огульное использование временных таблиц тоже может быть нерациональным. Все таки они занимают место в оперативной памяти и если перестараться, то СУБД может скинуть промежуточные результаты запроса на жесткий диск и производительность резко просядет.
9. kilokilo 18 28.09.12 10:10 Сейчас в теме
(2) khaoos,
Временные таблицы не хранятся в оперативной памяти. Они создаются и сохраняться в файле tempdb.

(0), минус ставить не буду. Но статье не место здесь, так как она учит как делать не стоит..
Gotcha; khaoos; +2 Ответить
12. khaoos 239 28.09.12 11:19 Сейчас в теме
(9) kilokilo, спасибо за просвещение. Теперь буду еще осторожнее использовать временные таблицы :). Вроде в MSSQL есть еще переменные table, которые в оперативке хранятся. 1С всегда использует именно те временные таблицы, которые в tempdb создаются? Как в остальных используемых СУБД дело обстоит, не знаете?
19. AlexO 128 28.09.12 13:53 Сейчас в теме
(12) khaoos,
Теперь буду еще осторожнее использовать временные таблицы

а название "Временные таблицы" ни о чем вам даже не намекнуло? :)
(15) mr zafod,
в SQL временные таблицы (ВТ) хранятся в отдельной, нетранзакционной базе данных (tempDb)

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

откуда столь точные и противоречивые данные?
22. khaoos 239 28.09.12 14:30 Сейчас в теме
(19) AlexO, вы намекаете на слово "временная" или на слово "таблица"? :) Ни то ни то мне не намекает, что этот объект должен обязательно физически записываться на диск. Я думал оптимизатор СУБД решает, где хранить эту таблицу.
15. mr zafod 22 28.09.12 12:52 Сейчас в теме
(9) kilokilo, (12) khaoos, в SQL временные таблицы (ВТ) хранятся в отдельной, нетранзакционной базе данных (tempDb). В зависимости от версии sql сами таблицы базы данных либо висят в памяти сервера, либо лежат на диске (в случае использования МВТ на сервере) или на клиенте (в случае МВТ на клиенте). В файловом варианте все валяется внутри файлов БД
18. khaoos 239 28.09.12 12:58 Сейчас в теме
(15) mr zafod, если знаете подробности насчет версий, в каких что используется, прошу поделиться
21. mr zafod 22 28.09.12 14:21 Сейчас в теме
(18) khaoos, (19) AlexO, По поводу места хранения данных ВТ - я об этом узнал от самих 1С, методично задавая вопросы в поддержку. У меня есть коммерческий продукт "Загрузка данных из StoreHouse", работает он на ура с кешированием, отборами и кучей всяких интересных вещей - для этого активно используются ВТ (и МВТ), поэтому в свое время пришлось окунуться в эту область.
SQL Server 2008 R2 держит в памяти - в этом можно убедиться (и даже посмотреть содержимое таблиц) с помощью штатного монитора ресурсов (вроде так называется). В PG SQL 9.х - тоже в памяти, там даже на БД с ВТ висят какие-то интересные триггеры. За остальные не знаю, в указанных видел сам. Я так думаю, что эти области хранения ограниченны в объеме и работают как стек fifo.
23. khaoos 239 28.09.12 14:34 Сейчас в теме
(21) mr zafod, спасибо. Это хорошо согласовывается с моими скромными теоретическими познаниями в области БД :). Уж слишком накладно было бы при каждом случае производить физическую запись на диск. При желании конечно можно сделать небольшие эксперименты. Правда дома у меня только Postgre стоит.
38. anchovy 16 11.10.12 16:19 Сейчас в теме
(9) kilokilo,
Ага, временные таблицы МВТ хранятся во временном файле, что повышает нагрузку на диск.
Уж лучше бы в они хранились оперативной памяти )))
4. Поручик 4350 28.09.12 08:36 Сейчас в теме
(0) (3) Тем более, что в примере не используются какие-то временные расчеты, которые можно передать в другие процедуры или запросы. Всё решается в одном блоке. Автор запоздал с менеджерами временных таблиц года на четыре, когда ещё не было пакетных запросов.

(3) Статья Чистова, ставшая классикой. http://chistov.spb.ru/publ/5-1-0-13 Именно с неё я и начал использование пакетов.
Gandalf Белый; CagoBHuK; mr zafod; +3 Ответить
5. mr zafod 22 28.09.12 09:18 Сейчас в теме
(4) согласен, ВТ нужны только для передачи данных запроса между процедурами или временно сохранить результат, когда это действительно необходимо и пакетный запрос использовать невозможно, например сравнить данные движений по регистрам до и после проведения - ВТ можно передать через ДополнительныеСвойства документа.
11. AlexO 128 28.09.12 11:10 Сейчас в теме
(4)
Автор запоздал с менеджерами временных таблиц года на четыре

ну уж не на 4 года, а на все 8... когда там 8.1 появилась?
И потом, применение МВТ или пакетого запроса... суть разве в этом?
Применение таких запросов с ВТ и что можно получать - вот где сама суть.
Да только никто не может так глубоко раскопать... проще из типовой взять пример, желательно на 5 разворотов, и расписать, что вот, в примере такие вот инструкции применены - а зачем, почему именно они, какие альтернативы и когда - это уже не важно....
13. Поручик 4350 28.09.12 11:24 Сейчас в теме
(11) Платформу 8.1 в промышленную эксплуатацию ввели во второй половине 2007 года, менеджеры временных таблиц появились году в 2008, пакетные запросы примерно в начале 2009, то есть не так уж давно.
20. AlexO 128 28.09.12 14:01 Сейчас в теме
(13)
Платформу 8.1 в промышленную эксплуатацию ввели во второй половине 2007 года, менеджеры временных таблиц появились году в 2008, пакетные запросы примерно в начале 2009, то есть не так уж давно.

ну значит, я слишком много работал с 8.0, и сразу перешел к использованию МВТ и пакетных запросов.
Вот бету 8.2 осенью 2009 году помню... Почему так хорошо - два года потом плевался от неё, и до сих пор готово ведро помоев на это поделие...
6. DoctorRoza 28.09.12 09:40 Сейчас в теме
+ .. за старание .. работа то какая-товсе равно проделана
8. mr zafod 22 28.09.12 09:49 Сейчас в теме
(6) DoctorRoza, ну видимо вам никогда не приходилось такие старания переписывать за кем-то
7. Поручик 4350 28.09.12 09:45 Сейчас в теме
(0) (6) Не, автору следовало бы направить затраченную энергию на изучение матчасти.
Обоснование минуса в постах (2) (3) (4) (5).
10. wunderland 201 28.09.12 10:45 Сейчас в теме
14. petrov_al 10 28.09.12 12:51 Сейчас в теме
А в чем фишка то? Этими примерами "кишат" все типовые конфигурации.
16. mr zafod 22 28.09.12 12:53 Сейчас в теме
Даешь пример использования ВТ на примере расчета переходящего больничного из типовой ЗУП!
17. khaoos 239 28.09.12 12:56 Сейчас в теме
(16) mr zafod, ЗУП - это рай для любителей пододбных запросов :)
24. mr zafod 22 28.09.12 14:36 Сейчас в теме
Совсем забыл - в случае файлового варианта ВТ храниться в памяти клиента в кеше (копии 1Cv8.1CD) и не вытесняются. В этом виде использование ВТ наиболее опасно!
25. mr zafod 22 28.09.12 14:42 Сейчас в теме
Я думаю что главный смысл ВТ - это чтение данных из предварительно подготовленной ограниченной таблицы ВТ вместо чтения из возможно очень огромной таблицы скажем регистра. А все остальные фокусы с ВТ - просто для удобста разработки.
26. khaoos 239 28.09.12 14:49 Сейчас в теме
(25) mr zafod, несомненный плюс ВТ - в удобочитаемости запроса и повторного использования тяжело извлекаемых данных. Ну или когда считаешь себя умнее СУБД, и отказываешься от Loop Join'ов по индексному доступу в пользу некоторого подобия Hash Join'ов :)
27. mr zafod 22 28.09.12 14:53 Сейчас в теме
(26) khaoos, в PG SQL кстати сейчас глянул для интереса на tempDb висит что-то типа autotruncate on checkpoint - видимо когда ВТ умирает постгре не убивает ее структуру как в обычных таблицах БД. А может 1С чего-то не допилили.
28. khaoos 239 28.09.12 15:01 Сейчас в теме
(27) mr zafod, когда kilokilo мне ответил, то я немного покопал, вроде на форумах писали, что в MSSQL тоже делается truncate. А таблицы умирают, когда умирают все сеансы 1С. Ну это мож в более ранних версиях платформы, я не в курсе.
29. mr zafod 22 28.09.12 15:08 Сейчас в теме
(28) khaoos, ну триггеры и команды для 1Совских БД создаются платформой - в MSSQL такого платформа не делает, может там какой-то встроенных механизм есть?
30. khaoos 239 28.09.12 15:14 Сейчас в теме
(29) mr zafod, могу предположить (но обманывать не буду, надо б в профайлер или тех.журнал смотреть), что при трансляции запросов УНИЧТОЖИТЬ переведется в truncate (не уверен что так может оператор называться) и при закрытии МВТ аналогично
31. alexandr1972_1 28.09.12 19:23 Сейчас в теме
Устаревшая статья. За последние два года менеджер временных таблиц практически не использую.
32. ok0504 03.10.12 09:14 Сейчас в теме
К вышесказанному добавлю еще одну ложку дёгтя. Ни в одной из ВТ не использована индексация.
35. ksai 11.10.12 10:12 Сейчас в теме
(32) ok0504,
Индексация имеет смысл, если временная таблица используется как источник данных несколько раз. В приведенном примере она не нужна.

(33) marku,
Пакетный запрос - это тоже пример с использованием ВТ. В данном случае приведен пример использования не ВТ, а МВТ, причем далеко не в самом выгодном контексте. После появления пакетных запросов, полезность МВТ свелась единственно к переносу временных таблиц между запросами, расположенными в разных частях кода.
33. marku 61 11.10.12 09:10 Сейчас в теме
Тут приведен пример работы с ВТ. А использовать его или нет каждый сам решает.
34. v.l. 11.10.12 10:01 Сейчас в теме
(0) Только бы код еще раскрасить...
36. Vlad_2008 13 11.10.12 14:49 Сейчас в теме
Попал сюда с голосования от "Spec8.RU". Сам смотрел некоторые курсы, очень полезные. Удивлен прочитанным.
Комментарий только один - ни когда так не делайте!
SirYozha; +1 Ответить
37. premierex 11.10.12 15:00 Сейчас в теме
Не буду даже ввязываться в полемику об использовании внешних таблиц в запросах, так как просто не хотелось читать код, написанный автором. Если автор не в курсе, что есть определённая стилистика при написании любого программного кода, могу подсказать, что имена переменных должны нести определённую смысловую нагрузку. Например, переменная, именованная в примере как "ТзНмСтр" при прокрутке страницы просто "теряется"... Точнее, теряется смысл её наименования и становится не понятен тому, кто читает этот код. Приходится возвращаться к тому месту, где эта переменная была определена, чтобы понять её назначение. Однозначный минус за неуважение к коллегам, для которых была предназначена эта статья!
SirYozha; +1 Ответить
47. nofx 17.12.15 14:42 Сейчас в теме
(37) premier,
Поддерживаю, товарищи! На кол срочно, товарищи!
39. FractonKireyev 11.10.12 19:23 Сейчас в теме
Жаль, минус поставить не могу.
40. klel 11.10.12 20:33 Сейчас в теме
41. szv 12.10.12 14:37 Сейчас в теме
Я так понимаю, что автор предназначал свою работу неопытным программистам. И статья им может быть полезна. Начнут изучать ВТ и прочитают про пакеты.
И не стал бы критиковать за ВТ, а вот про написание кода (я промолчу про имена переменных, уже было) скажу.
Зачем копировать и сжимать ТЗНомен
// 3. копируются отдельные таблицы значений для использования в условиях запроса
ТзНом = ТзНомен.Скопировать();
ТзНмСтр = ТзНомен.Скопировать();
ТзКач = ТзНомен.Скопировать();

ТзНом.Свернуть("Номенклатура");
ТзКач.Свернуть("Качество");

Если вот здесь
// 6. формируются временные таблицы
ЗапрНом.Текст = "ВЫБРАТЬ
| Номен.Номенклатура
|ПОМЕСТИТЬ ВыбНомен // результат запроса помещается во временную таблицу ВыбНомен
|ИЗ
| &ТзНомен КАК Номен";

из ТЗ ТзНомен можно сразу получить ВыбНомен используя слово "Различные".
Светлый ум; +1 Ответить
42. Светлый ум 238 17.12.13 10:58 Сейчас в теме
Согласен свертка - совсем не к чему.
48. endym 196 15.02.16 17:37 Сейчас в теме
Добавлю свое мнение:

пакетные запросы хороши, но есть в менеджере свой плюс.

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

так что менеджер временных таблиц пока еще имеет место быть ;)
rpgshnik; +1 Ответить
49. rpgshnik 1865 31.05.17 10:50 Сейчас в теме
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 120 000 руб.
Полный день

Консультант по 1С:Документооборот
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:Бухгалтерии
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:ЗУП
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день