Описание механизмов программных реализаций на платформе 1С:Предприятие 8.1 : «Использование временных таблиц в запросах»

07.06.10

Разработка - Запросы

Этой статьей я начинаю цикл, который будет посвящен описанию механизмов реализации, которые нужно уметь реализовывать при сдаче экзамена 1С:Специалист по платформе 8.1. Начну пожалуй с "Использования временных таблиц в запросах".
Блог автора: http://provlax.livejournal.com/
Дата написания: Октябрь 2007

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

Этой статьей я начинаю цикл, который будет посвящен описанию механизмов реализации, которые нужно уметь реализовывать при сдаче экзамена 1С:Специалист по платформе 8.1

Согласно требованиям фирмы 1С, основной перечень механизмов, которые нужно уметь реализовывать, следующий:

1) организация контроля остатка по регистру остатков;
2) работа с себестоимостью;
3) организация средневзвешенного списания;
4) организация партионного списания;
5) работа с оборотными показателями;
6) запросы по регистрам накопления и регистрам сведений;
7) работа с регистрами сведений;
8) валютные пересчеты через кросс-курс
9) использование характеристик объектов (план видов характеристик)
10) работа с измерениями в регистрах бухгалтерии;
11) работа с небалансовыми измерениями и ресурсами регистра бухгалтерии;
12) средневзвешенное списание себестоимости по данным бух регистра;
13) работа с субконто (включая оборотные);
14) запросы по таблицам бухгалтерских регистров;
15) организация валютного учета;
16) организация количественного учета в бухгалтерии;
17) организация учета авансов;
18) работа с данными графиков по фактическому периоду действия;
19) работа с данными графиков по периоду регистрации;
20) работа с базовыми видами расчета - получение базы;
21) работа с вытесняющими расчетами - получение дополнения;
22) работа с ведущими видами расчетов - использование перерасчетов;
23) построение запросов по регистрам расчетов;
24) работа со сводной таблицей;
25) работа с построителем отчета;
26) работа с системой компоновки данных;
27) работа с механизмом бизнес-процессов;
28) использование временных таблиц в запросах;


Начну, пожалуй, с новых:

Использование временных таблиц в запросах

Как заявляет фирма «1С» в технической документации: «..Использование временных таблиц помогает повысить производительность запросов и сделать текст сложных запросов более легким для восприятия…». Что касается первого утверждения (сравнение скорости выполнения запросов с использованием временных таблиц приводилось мною в статье «Сравнение производительности различных техник проведения документов в 1С:Предприятие 8.1, с выборкой из табличной части и регистра накопления»), то повышение наблюдается только при значительных объемах количества введенных документов одного типа, в остальных случаях быстрее работают все-таки вложенные запросы. Что касается второго утверждения, то не берусь его оспаривать, как говорят - на любителя, мне, например, так не показалось (кроме того, при работе с временными таблицами практически не возможно использовать конструктор запросов, временные таблицы он не понимает и выдает постоянно ошибки, хотя это может относиться только к моей версии платформы - 8.1.8.76).

Ну, перейдем сразу к сути. Для описания техники работы с временными запросами рассмотрим небольшой сквозной пример, из которого, я думаю, всем будет все ясно.

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


Сделаю небольшое отступление. В качестве исходных данных для временной таблицы, также может быть использован внешний источник данных: табличная часть документа, таблица значений, результат запроса. В этом случае в запросе нельзя использовать объединения и соединения.


Запрос.УстановитьПараметр("РасходнаяТовары",Товары); //внешним источником данных у нас будет табличная часть "Товары документа"


Запрос.Выполнить();

Запрос2 = Новый Запрос; //создаем новый запрос
Запрос2.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; //указываем новому запросу наш менеджер временных таблиц
Запрос2.Текст= "ВЫБРАТЬ
| ВременнаяТаблица.Номенклатура,
| ВременнаяТаблица.Количество,
| ВременнаяТаблица.Сумма
|ИЗ
| ВременнаяТаблица КАК ВременнаяТаблица //используем выборку из временной таблицы"
;
Выборка = Запрос2.Выполнить();

МенеджерВременныхТаблиц.Закрыть(); //удаляем менеджер временных таблиц


Итак, я привел пример использования временных таблиц в запросах. Вроде все должно быть понятно. В примере первым запросом мы создали временную таблицу, а во втором выбирали поля уже из нее. Стоит ли использовать временные таблицы в запросах, покажет только время.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    171592    960    403    

924

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11700    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6650    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    9338    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

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

08.07.2024    2798    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10616    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3668    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PavelYa 11.12.07 22:28 Сейчас в теме
Только автор забыл сказать о том что Запрос2.Текст= "ВЫБРАТЬ.... конструктором не открыть. Конструктор не понимает временных таблиц и их поля:), что ставит под вопрос целесообразность использования данного механизма. Работа с ним не комфортна. Запрос1 как правло простой набор, одна таблица с условиями а вот вся сложная логика ложится на Запрос2. Если запрос2 достаточно сложный его перебирать в ручную достаточно трудоёмко.... не говоря уже, когда необходимо изменить его логику.
3. logarifm 1123 18.12.07 14:04 Сейчас в теме
ПРо конструктор автор сказал:

"... (кроме того, при работе с временными таблицами практически не возможно использовать конструктор запросов, временные таблицы он не понимает и выдает постоянно ошибки, хотя это может относиться только к моей версии платформы - 8.1.8.76)."
4. Pavel_03 27.02.08 20:27 Сейчас в теме
Интересно .... а без конструктора Вы бы запросы вообще не писали бы? аа?

На самом деле оч полезный механизм............ Который позволяет оптимизировать выполнение сложных запросов.... :)
charushkin; +1 Ответить
5. Andy1981 15.04.08 19:57 Сейчас в теме
Ох...Налетели...Конструктор им подвай... Автор ясно указал, что начинает серию публикаций на тему экзамена на 1С: специалист. А в некоторых заданиях явно просят при составлении запросов использовать временные таблицы. Так что фанаты конструкторов будут не у дел. Автору респект..В отличии от сайта С.Митичкина где предлагается использовать вот такую конструкцию:
Код
 Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары");
Запрос.Выполнить(); //Создалась таблица ВТТовары
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы
ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений 
Показать полностью

которая, к слову сказать не рабочая, автор предлагает корректный пример кода...это раз. Во-вторых, я не знал что в качестве источника данных можно указывать параметр, за что автору огромное спасибо!
6. Andy1981 16.04.08 23:36 Сейчас в теме
Кстати, что правда - то правда, невозможность использования конструктора запроса имеет место в старых версиях платформы. Начиная с версии 8.1.10 в конструкторе появляется кнопочка создания "скелета" временной таблицы...
7. ILNIK 34 23.05.08 11:08 Сейчас в теме
Дополню. Если используется таблица значений, то колонки должны быть типизированы в обязательном порядке!
Например:

[/code]
Если А<>0 Тогда
ТЗ=Новый ТаблицаЗначений();
//Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
[/code]
8. ILNIK 34 23.05.08 11:09 Сейчас в теме
теги неправильно поставил

Код
Если А<>0 Тогда
ТЗ=Новый ТаблицаЗначений();
//Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
Показать полностью

9. Татьянка 02.12.08 10:56 Сейчас в теме
Отличная статья, отличный пример. В конструкторе все открывается, все видно, как обычная таблица. Огромное спасибо, мне эта статья очень помогла!!!
10. andyid 09.03.10 21:55 Сейчас в теме
спасибо большое автору!!! Вроде если не в даваться в детали, если говорить вообще про запросы, все понятно, но как только капнешь, сразу туман!!!! Хорошая ячейка знаний и классный пример про временные таблицы))))
11. Трактор 1255 11.06.10 16:11 Сейчас в теме
при работе с временными таблицами практически не возможно использовать конструктор запросов, временные таблицы он не понимает и выдает постоянно ошибки

Офигеть!!! :o
Вот запрос в шестью временными таблицами. Конструктор их прекрасно понимает. Только писАть правильно надо.
ВЫБРАТЬ
 13 КАК Количество
ПОМЕСТИТЬ ВТКоличествоЯблок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 "Склад1" КАК Склад
ПОМЕСТИТЬ ВТСклады

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 "Склад2"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 "Склад3"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 "Склад4"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 КОЛИЧЕСТВО(*) КАК Количество
ПОМЕСТИТЬ ВТКоличествоСкладов
ИЗ
 ВТСклады КАК ВТСклады
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ВЫРАЗИТЬ(ВТКоличествоЯблок.Количество / ВТКоличествоСкладов.Количество КАК ЧИСЛО(15, 0)) КАК Количество
ПОМЕСТИТЬ ВТЯблокКаждому
ИЗ
 ВТКоличествоЯблок КАК ВТКоличествоЯблок,
 ВТКоличествоСкладов КАК ВТКоличествоСкладов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ВТЯблокКаждому.Количество * ВТКоличествоСкладов.Количество - ВТКоличествоЯблок.Количество КАК Количество
ПОМЕСТИТЬ ВТПерерасход
ИЗ
 ВТЯблокКаждому КАК ВТЯблокКаждому,
 ВТКоличествоСкладов КАК ВТКоличествоСкладов,
 ВТКоличествоЯблок КАК ВТКоличествоЯблок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ВТСклады1.Склад,
 КОЛИЧЕСТВО(*) КАК НомерСтроки
ПОМЕСТИТЬ ВТПронумерованныеСклады
ИЗ
 ВТСклады КАК ВТСклады1
  ПОЛНОЕ СОЕДИНЕНИЕ ВТСклады КАК ВТСклады2
  ПО ВТСклады1.Склад <= ВТСклады2.Склад
СГРУППИРОВАТЬ ПО
 ВТСклады1.Склад
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ВТПронумерованныеСклады.Склад,
 ВТЯблокКаждому.Количество - ВЫБОР
  КОГДА ВТПронумерованныеСклады.НомерСтроки <= ВТПерерасход.Количество
  ТОГДА 1
  ИНАЧЕ 0
 КОНЕЦ КАК Количество
ИЗ
 ВТПронумерованныеСклады КАК ВТПронумерованныеСклады,
 ВТЯблокКаждому КАК ВТЯблокКаждому,
 ВТПерерасход КАК ВТПерерасход
Показать

Запрос не мой. Взял у кого-то с Инфостарта. Он, кстати, неправильно раздаёт яблоки.
Оставьте свое сообщение