Меню

Массив во Временной или ТаблицаЗначений в виртуальной таблице запроса



Механизм запросов

Механизм запросов — это один из способов доступа к данным, которые поддерживает платформа. Используя этот механизм, разработчик может читать и обрабатывать данные, хранящиеся в информационной базе; изменение данных с помощью запросов невозможно. Это объясняется тем, что запросы специально предназначены для быстрого получения и обработки некоторой выборки из больших массивов данных, которые могут храниться в базе данных.

Табличный способ доступа к данным

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

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

Язык запросов

Для того чтобы разработчик имел возможность использовать запросы для реализации собственных алгоритмов, в платформе реализован язык запросов. Этот язык основан на SQL, но при этом содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений. Можно перечислить наиболее существенные возможности, реализуемые языком запросов:

Обращение к полям через точку (».»)

Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через «.», при этом количество уровней вложенности таких ссылок система не ограничивает.

Обращение к вложенным таблицам (табличным частям документов и элементов справочников)

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

Но также мы можем считать заголовочную запись документа, в которой значением поля Товары будут все записи вложенной таблицы, подчиненные этому объекту (документу):

Автоматическое упорядочивание

Для выбора наиболее правильного («естественного») порядка вывода информации на экран или в отчет разработчику в большинстве случаев достаточно задать режим автоматического упорядочивания.

Многомерное и многоуровневое формирование итогов

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

Поддержка виртуальных таблиц

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

Читайте также:  Таблица второго дивизиона апл

Стандартные SQL операции

В языке запросов поддерживаются стандартные для SQL операции, такие, как объединение (Union), соединение (Join) и т. д.

Источник

Массив во Временной или ТаблицаЗначений в виртуальной таблице запроса

Есть такой запрос:
Запрос = Новый Запрос(«ВЫБРАТЬ
| ТД.Документация
|ПОМЕСТИТЬ ТаблицаДокументации
|ИЗ
| &ТаблицаДокументации КАК ТД
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДвиженияДокументовСрезПоследних.Регистратор,
| ДвиженияДокументовСрезПоследних.Документация
|ИЗ
| ТаблицаДокументации КАК ТаблицаДокументации
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДвиженияДокументов.СрезПоследних(&Дата, Документация В (&СписокДокументации)) КАК ДвиженияДокументовСрезПоследних
| ПО ТаблицаДокументации.Документация = ДвиженияДокументовСрезПоследних.Документация
|ГДЕ
| ДвиженияДокументовСрезПоследних.Статус = &Статус»);
Запрос.УстановитьПараметр(«Дата», Дата);
Запрос.УстановитьПараметр(«Статус», ВидДокумента);
Запрос.УстановитьПараметр(«ТаблицаДокументации», ТаблицаДокументации);
Запрос.УстановитьПараметр(«СписокДокументации», ТаблицаДокументации.ВыгрузитьКолонку(«Документация»));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
.
Хочу оставить один параметр из:
Запрос.УстановитьПараметр(«ТаблицаДокументации», ТаблицаДокументации);
Запрос.УстановитьПараметр(«СписокДокументации», ТаблицаДокументации.ВыгрузитьКолонку(«Документация»));

Можно запихнуть во временную таблицу «Массив» или в отбор виртуальной «Таблицу значений» ?

Источник

1с массив во временную таблицу запроса

Временные таблицы. Работа с Табличной Частью.

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

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Организация», Новый ОписаниеТипов(«СправочникСсылка.Организации»));
ТЗ.Колонки.Добавить(«Код» , Новый ОписаниеТипов(«Строка»));

ТЗ = ТабличнаяЧасть.Выгрузить();//Формируем таблицу значений

//1)
//В менеджер временных таблиц передаем заданную таблицу значений
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

ТекстЗапроса = «ВЫБРАТЬ
|*
|ПОМЕСТИТЬ ВТ_ТабличнаяЧасть
|ИЗ
|&ТЗ КАК ТЗ»;
Запрос.Текст = ТекстЗапроса;

Запрос.Выполнить();//Теперь инициализирован менеджер временных таблиц

//2
//Теперь работаем с временной таблицей

ЗапросТМП = Новый Запрос;

ТекстЗапросаТМП = «ВЫБРАТЬ
| ВТ_ТабличнаяЧасть.Организация,
| ВТ_ТабличнаяЧасть.Код
|ИЗ
| ВТ_ТабличнаяЧасть КАК ВТ_ТабличнаяЧасть
|ГДЕ
| ВТ_ТабличнаяЧасть.Код <> «»000″»»;

Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Организация));
КонецЦикла;

//3
//Удаляем временную таблицу

ЗапросУДАЛЕНИЕ = Новый Запрос;
ЗапросУДАЛЕНИЕ.МенеджерВременныхТаблиц = МенеджерВТ;
ТекстЗапросаУДАЛЕНИЕ = «УНИЧТОЖИТЬ ВТ_ТабличнаяЧасть»;
ЗапросУДАЛЕНИЕ.Текст = ТекстЗапросаУДАЛЕНИЕ;
ЗапросУДАЛЕНИЕ.Выполнить();

Использование в запросе временной таблицы из другого запроса

Процедура ИспользованиеВЗапросеВременнойТаблицыИзДругогоЗапроса()

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
МенеджерВТ = Запрос.МенеджерВременныхТаблиц;

ТекстЗапроса = «ВЫБРАТЬ
| НеУволенныеСотрудники.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_НеУволенныеСотрудники
|ИЗ
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СостоянияРаботниковОрганизаций.Сотрудник КАК Сотрудник
| ИЗ
| (ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Организация КАК Организация,
| РаботникиОрганизацийСрезПоследних.Регистратор КАК Регистратор,
| РаботникиОрганизацийСрезПоследних.Период КАК Период,
| РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
| РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| РаботникиОрганизацийСрезПоследних.ОбособленноеПодразделение КАК ОбособленноеПодразделение,
| РаботникиОрганизацийСрезПоследних.ПериодЗавершения КАК ПериодЗавершения,
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния
| ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, Организация = &Организация) КАК РаботникиОрганизацийСрезПоследних) КАК СостоянияРаботниковОрганизаций
| ГДЕ
| (СостоянияРаботниковОрганизаций.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ИЛИ СостоянияРаботниковОрганизаций.ПериодЗавершения > СостоянияРаботниковОрганизаций.Период)
| И СостоянияРаботниковОрганизаций.ПричинаИзмененияСостояния <> &ЭтоУвольнение) КАК НеУволенныеСотрудники»;

Запрос.УстановитьПараметр(«Организация» , Организация);
Запрос.УстановитьПараметр(«Период» ,КонецДня(РабочаяДата));
Запрос.УстановитьПараметр(«ЭтоУвольнение»,Перечисления.ПричиныИзмененияСостояния.Увольнение);

Запрос.Выполнить(); //Инициализируем менеджер временных таблиц

ЗапросОтпуска = Новый Запрос;
ЗапросОтпуска.МенеджерВременныхТаблиц = МенеджерВТ;

ТекстЗапроса = «ВЫБРАТЬ
| ФактическиеОтпускаОрганизаций.Период,
| ФактическиеОтпускаОрганизаций.Сотрудник,
| ФактическиеОтпускаОрганизаций.ДатаОкончания,
| ФактическиеОтпускаОрганизаций.Количество
|ИЗ
| ВТ_НеУволенныеСотрудники КАК ВТ_НеУволенныеСотрудники
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
| ПО ВТ_НеУволенныеСотрудники.Сотрудник = ФактическиеОтпускаОрганизаций.Сотрудник»;

Пока Выборка.Следующий() Цикл

Сообщить(Строка(Выборка.Сотрудник) + » » + Строка(Выборка.ДатаОкончания) + » » + Строка(Выборка.ДатаОкончания));

ПАКЕТНЫЕ ЗАПРОСЫ

Цитата из файла V8AddDoc81.htm

Платформа 1С:Предприятие 8.1 позволяет работать с пакетами запросов. В пакетном запросе тексты запросов разделяются символом «;». Запросы исполняются последовательно, при этом временные таблицы, которые были созданы во время исполнения какого-либо запроса будут существовать до окончания исполнения всего пакета запроса или до исполнения в пакете запроса, уничтожающего данную временную таблицу. Например:

Читайте также:  Как научить ребенка различать цвета

Запрос = Новый Запрос;

| РегистрНакопления.УчетНоменклатуры.ОстаткиИОбороты(, , Авто, , ) КАК УчетНоменклатурыОстаткиИОбороты

| УчетНоменклатуры КАК УчетНоменклатуры

Первый запрос создает временную таблицу, данные из которой используются во втором запросе.

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

Кроме метода Выполнить(), последовательно выполняющего все запросы пакета и возвращающего результат последнего запроса в пакете, платформа 1С:Предприятие 8 предоставляет еще один метод – ВыполнитьПакет(). Этот метод последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета в последовательности расположения запросов в тексте пакета. Результатом выполнения запроса на уничтожение временной таблицы является значение Неопределено, которое также помещается в массив результатов.

// ИСПОЛЬЗОВАНИЕ ПАКЕТА ЗАПРОСА С ВРЕМЕННОЙ ТАБЛИЦЕЙ

Процедура ИспользованиеПакетаЗапросаСВременнойТаблицей()

Запрос = Новый Запрос;

ТекстЗапроса = «ВЫБРАТЬ
| НеУволенныеСотрудники.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_НеУволенныеСотрудники
|ИЗ
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СостоянияРаботниковОрганизаций.Сотрудник КАК Сотрудник
| ИЗ
| (ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Организация КАК Организация,
| РаботникиОрганизацийСрезПоследних.Регистратор КАК Регистратор,
| РаботникиОрганизацийСрезПоследних.Период КАК Период,
| РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
| РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| РаботникиОрганизацийСрезПоследних.ОбособленноеПодразделение КАК ОбособленноеПодразделение,
| РаботникиОрганизацийСрезПоследних.ПериодЗавершения КАК ПериодЗавершения,
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния
| ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, Организация = &Организация) КАК РаботникиОрганизацийСрезПоследних) КАК СостоянияРаботниковОрганизаций
| ГДЕ
| (СостоянияРаботниковОрганизаций.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| ИЛИ СостоянияРаботниковОрганизаций.ПериодЗавершения > СостоянияРаботниковОрганизаций.Период)
| И СостоянияРаботниковОрганизаций.ПричинаИзмененияСостояния <> &ЭтоУвольнение) КАК НеУволенныеСотрудники
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ФактическиеОтпускаОрганизаций.Период,
| ФактическиеОтпускаОрганизаций.Сотрудник,
| ФактическиеОтпускаОрганизаций.ДатаОкончания,
| ФактическиеОтпускаОрганизаций.Количество
|ИЗ
| ВТ_НеУволенныеСотрудники КАК ВТ_НеУволенныеСотрудники
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
| ПО ВТ_НеУволенныеСотрудники.Сотрудник = ФактическиеОтпускаОрганизаций.Сотрудник»;

Запрос.УстановитьПараметр(«Организация» , Организация);
Запрос.УстановитьПараметр(«Период» ,КонецДня(РабочаяДата));
Запрос.УстановитьПараметр(«ЭтоУвольнение»,Перечисления.ПричиныИзмененияСостояния.Увольнение);

Пока Выборка.Следующий() Цикл

Сообщить(Строка(Выборка.Сотрудник) + » » + Строка(Выборка.ДатаОкончания) + » » + Строка(Выборка.ДатаОкончания));

//ИСПОЛЬЗОВАНИЕ ПАКЕТОВ ПОСЛЕДОВАТЕЛЬНЫХ ЗАПРОСОВ

Процедура ДействияФормыИспользованиеПакетаПоследовательныхЗапросов(Кнопка)

Запрос = Новый Запрос;

ТекстЗапроса = «ВЫБРАТЬ
| НачислениеЗарплатыРаботникамОрганизаций.Ссылка
|ИЗ
| Документ.НачислениеЗарплатыРаботникамОрганизаций КАК НачислениеЗарплатыРаботникамОрганизаций
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗарплатаКВыплатеОрганизаций.Ссылка
|ИЗ
| Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплатеОрганизаций»;

Для Инд = 0 По МассивРезультатов.Количество()-1 Цикл

Источник

Временные таблицы в запросах 1С 8.3

  1. Временная таблица
  2. Менеджер временных таблиц
  3. Индексы временных таблиц
  4. Получить данные временной таблицы

Временная таблица

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

Создается временная таблица с помощью ключевого слова ПОМЕСТИТЬ:

В данном примере выборка из справочника Бренды будет помещена во временную таблицу ВТБренды, а уже потом данные будут выбраны из временной таблицы.

При создании новой временной таблицы она не сохраняется в базе данных. В файловой базе временные таблицы хранятся в оперативной памяти, в MS SQL Server в специальной служебной базе TempDB.

Читайте также:  Что такое традиция для чего нужны отличия от обычаев и примеры

Также временные таблицы можно использовать для оптимизации работы СУБД. Если вместо временной таблицы использовать вложенный запрос, то оптимизатор не будет знать сколько строк в этой таблице и не сможет оптимизировать план запроса. В случае использования временной таблицы количество строк будет известно, что позволит лучше оптимизировать план запроса.

Но у временных таблиц есть и свои минусы:

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

Менеджер временных таблиц

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

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

Источник

Профессия — 1С

  • Конструктор запросов. Обзор
  • Соединение таблиц в конструкторе запросов 1С
  • Объединение таблиц в конструкторе запросов
  • Неоднозначное поле в конструкторе запросов
  • Временные таблицы в конструкторе запросов
  • Вложенные запросы в конструкторе
  • Замена таблиц в конструкторе запросов

Временные таблицы в конструкторе запросов

рубрики: Конструктор запросов | Дата: 4 августа, 2017

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

Как поместить результат запроса во временную таблицу

Создадим с помощью конструктора вот такой простейший запрос:

Соответственно текст запроса будет выглядеть следующим образом:

Но мы хотим поместить результат запроса во временную таблицу, которую назовем ВТ_Товары, то есть привести наш запрос вот к такому виду

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

Как прочитать временную таблицу из другого запроса

Очень часто при проектировании запросов большого объема возникает необходимость передавать временные таблицы из одного запроса в другой с использованием объекта МенеджерВременныхТаблиц. То есть вот такая ситуация:

Чтобы выбрать данные из временной таблицы, необходимо на закладке Таблицы и поля нажать на кнопку Создать описание временной таблицы и в открывшейся форме заполнить наименование таблицы и ее поля:

Как создать временную таблицу из параметра запроса

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

В этом случае нам надо сначала создать описание временной таблицы. А затем прописать ее имя на закладке Дополнительно.

То есть получается комбинация двух предудущих методов. Причем знак амперсанта можно также проставить в поле с именем таблицы:

Источник