Описание механизмов программных реализаций на платформе 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С.

15500 руб.

02.09.2020    184737    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2201    17    XilDen    26    

36

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

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5734    artemusII    11    

23

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

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

18.10.2024    13140    sergey279    18    

66

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

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

11.10.2024    8220    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

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

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

16.08.2024    10801    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PavelYa 11.12.07 22:28 Сейчас в теме
Только автор забыл сказать о том что Запрос2.Текст= "ВЫБРАТЬ.... конструктором не открыть. Конструктор не понимает временных таблиц и их поля:), что ставит под вопрос целесообразность использования данного механизма. Работа с ним не комфортна. Запрос1 как правло простой набор, одна таблица с условиями а вот вся сложная логика ложится на Запрос2. Если запрос2 достаточно сложный его перебирать в ручную достаточно трудоёмко.... не говоря уже, когда необходимо изменить его логику.
3. logarifm 1126 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 36 23.05.08 11:08 Сейчас в теме
Дополню. Если используется таблица значений, то колонки должны быть типизированы в обязательном порядке!
Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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