gifts2017

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

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

Этой статьей я начинаю цикл, который будет посвящен описанию механизмов реализации, которые нужно уметь реализовывать при сдаче экзамена 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. Pavel Yakimovich (PavelYa) 11.12.07 22:28
Только автор забыл сказать о том что Запрос2.Текст= "ВЫБРАТЬ.... конструктором не открыть. Конструктор не понимает временных таблиц и их поля:), что ставит под вопрос целесообразность использования данного механизма. Работа с ним не комфортна. Запрос1 как правло простой набор, одна таблица с условиями а вот вся сложная логика ложится на Запрос2. Если запрос2 достаточно сложный его перебирать в ручную достаточно трудоёмко.... не говоря уже, когда необходимо изменить его логику.
3. Sasha_H (logarifm) 18.12.07 14:04
ПРо конструктор автор сказал:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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