Синтаксис и применение Предложение ПОМЕСТИТЬ в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
Предложение ПОМЕСТИТЬ
Для того чтобы создать временную таблицу на основе данных базы данных, следует установить объекту Запрос менеджер временных таблиц, а затем выполнить запрос к базе данных, используя ключевое слово ПОМЕСТИТЬ, после которого указать имя создаваемой временной таблицы.
Ключевое слово ПОМЕСТИТЬ располагается после списка выборки запроса. Например:
ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ Справочник.Номенклатура
Результат исполнения такого запроса будет содержать строки с колонками Код и Наименование, в которых будут находиться записи, помещенные в созданную таблицу.
Если менеджер временных таблиц не установлен, или был закрыт, или в установленном менеджере временных таблиц уже существует таблица с указанным именем и запрос не пакетный, будет выдана ошибка.
Для того чтобы создать временную таблицу на основании внешнего источника, следует в тексте запроса в списке источников указать имя параметра, в который будет помещен внешний источник. Остальной синтаксис идентичен обычному созданию временной таблицы.
В качестве внешнего источника могут выступать:
таблица значений;
табличная часть;
результат запроса.
Ниже приведен пример создания временной таблицы на основе внешнего источника.
ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ &ВнешнийИсточник КАК ВнешнийИсточник
В данном примере во временную таблицу ВременнаяТаблица будет помещено содержимое колонок Код и Наименование из внешнего источника, например, таблицы значений, переданной в качестве параметра ВнешнийИсточник.
Если временная таблица создается на основании внешнего источника, в запросе нельзя использовать объединения и соединения. А также нельзя использовать поля, являющиеся реквизитами полей таблиц, на основании которых создается временная таблица.
Если в качестве источника используется таблица значений, то у этой таблицы значений должны быть явно указаны типы значений, содержащихся в колонках.
При создании временной таблицы неявно задаются типы колонок временной таблицы, в том числе, разрядность для числовых колонок и длина для строковых колонок. Когда новые значения добавляются без учета разрядности, длины или типа колонки временой таблицы, может быть получена ошибка "Тип устанавливаемого значения не соответствует типу поля временной таблицы". В таких случаях при создании временной таблицы может быть целесообразным расширить тип колонки с использованием операторов ВЫБОР и ВЫРАЗИТЬ.
Примечание. Предложения АВТОУПОРЯДОЧИВАНИЕ, ИТОГИ, ДЛЯ ИЗМЕНЕНИЯ, ИМЕЮЩИЕ и СГРУППИРОВАТЬ ПО не могут быть использованы в запросе, формирующем временную таблицу на основании таблицы значений.
Для того чтобы создать временную таблицу и заблокировать данные таблиц, на основании которых создается временная, следует использовать предложение ДЛЯ ИЗМЕНЕНИЯ, например:
ВЫБРАТЬ
РасходнаяНакладная.Ссылка,
РасходнаяНакладная.Номер,
РасходнаяНакладная.Дата
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
РасходнаяНакладная.Ссылка В(&Документы)
ДЛЯ ИЗМЕНЕНИЯ
Практические примеры
ИЗ, ГДЕ и ПЕРВЫЕ: выбрать две крупнейшие собственные позиции
Четыре строки создаются в типизированной таблице значений, помещаются в свою временную таблицу и отбираются запросом. Явная сортировка делает смысл первых двух строк определённым.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
Процедура ВыполнитьПример() Экспорт
Источник = Новый ТаблицаЗначений;
Источник.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20)));
Источник.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный)));
Источник.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный)));
Данные = Новый Массив;
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-A", 5, 100));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-B", 0, 200));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-C", 3, 250));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-D", 4, 150));
Для Каждого Позиция Из Данные Цикл
СтрокаИсточника = Источник.Добавить();
СтрокаИсточника.Код = Позиция.Код;
СтрокаИсточника.Количество = Позиция.Количество;
СтрокаИсточника.Цена = Позиция.Цена;
КонецЦикла;
Менеджер = Новый МенеджерВременныхТаблиц;
Попытка
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.Текст = "ВЫБРАТЬ
| Данные.Код КАК Код,
| Данные.Количество КАК Количество,
| Данные.Цена КАК Цена
|ПОМЕСТИТЬ ВТСвоиКниги
|ИЗ &Источник КАК Данные;
|ВЫБРАТЬ ПЕРВЫЕ 2
| Книги.Код КАК Код,
| Книги.Количество * Книги.Цена КАК Сумма
|ИЗ ВТСвоиКниги КАК Книги
|ГДЕ Книги.Количество >= &Минимум
|УПОРЯДОЧИТЬ ПО Сумма УБЫВ, Код";
Запрос.УстановитьПараметр("Источник", Источник);
Запрос.УстановитьПараметр("Минимум", 3);
Пакет = Запрос.ВыполнитьПакет();
Если Пакет.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались создание и выборка собственных строк";
КонецЕсли;
Итог = Пакет[1].Выгрузить();
Если Итог.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались две крупнейшие подходящие строки";
КонецЕсли;
Сообщить(Итог[0].Код = "own-C" И Итог[0].Сумма = 750);
Сообщить(Итог[1].Код = "own-D" И Итог[1].Сумма = 600);
Сообщить(Источник.Количество() = 4);
Исключение
Менеджер.Закрыть();
ВызватьИсключение;
КонецПопытки;
Менеджер.Закрыть();
Сообщить(Итог.Количество() = 2);
КонецПроцедурыРазбор по шагам
ТаблицаЗначений и её колонки имеют явные типы. Это обязательная подготовка внешней таблицы для помещения в временную таблицу запроса, а не чтение справочника книг.
Создать четыре строки: A=500, B=0, C=750, D=600 по произведению собственного количества и цены.
ПОМЕСТИТЬ создаёт ВТСвоиКниги в собственном менеджере. Данные — псевдоним источника первого запроса; Книги — псевдоним временной таблицы второго. Это не поля со значениями этих имён.
Второй запрос читает свою ВТСвоиКниги. ГДЕ Количество>=3 оставляет A,C,D; own-B с нулём отсекается до отбора первых строк.
УПОРЯДОЧИТЬ ПО Сумма УБЫВ, Код задаёт убывание суммы и дополнительный ключ при равенстве. ПЕРВЫЕ 2 оставляет C=750 и D=600, а A=500 уже не входит.
ВыполнитьПакет возвращает две позиции по порядку запросов. Только индекс 1 здесь содержит нужную выборку товаров; индекс 0 — результат помещения строк.
Менеджер закрывается при ошибке и успехе. После закрытия используем независимую выгруженную Итог, но не временную таблицу и не закрытый менеджер.
Как проверить результат
Четыре сообщения Истина: C/750, D/600, четыре неизменённые строки источника и две строки независимой итоговой таблицы.
Уберите ПЕРВЫЕ 2: подходящих строк станет три, поэтому проверку размера и последующие ожидания надо изменить. Измените own-D на количество 5: суммы C и D обе 750; второе поле сортировки Код сохраняет порядок C перед D.
Ожидаемый результат
Отбор, сортировка, ограничение размера и время жизни временной таблицы показаны на полном воспроизводимом наборе своих данных.
На что обратить внимание
ПЕРВЫЕ без явного упорядочивания не обещает именно две крупнейшие позиции. Порядок исходного массива не заменяет ORDER BY.
Переданный ТаблицаЗначений не следует бездумно использовать как обычную постоянную таблицу. Здесь внешний источник сначала помещается в собственную временную таблицу.
Не закрывайте менеджер чужого отчёта. Этот пример создаёт свой менеджер и не удаляет постоянные таблицы, справочники или файлы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.