Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Временные таблицы в 8.1 , Использование временных таблиц в 8.1          
Vofka Подменю пользователя
сообщение 14.09.10, 13:43
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Для меня оказалась довольно полезной smile.gif , в частности меня интересовал запрос к таблице значений. Тут есть это и не только.

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

В 8.1. появились временные таблицы. Они хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "ПОМЕСТИТЬ", например:

ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТТовары



Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.

Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, в духе 1С, нельзя получить список временных таблиц, которые хранятся в запросе.

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

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




Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это (спасибо Чепелевич А.А., раньше я думал что это невозможно):

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

//Заполняем таблицу данными
Стр=ТЗ.Добавить();
Стр.А="А";
Стр.Б="Б";
Стр=ТЗ.Добавить();
Стр.А="А1";
Стр.Б="Б1";


//Загружаем таблицу значений в менеджер временных таблиц запроса
Запрос=Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬТТаб Из &Таб Как Т");
//Вариант: Запрос=Новый Запрос("Выбрать * ПОМЕСТИТЬТТаб Из &Таб Как Т");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",ТЗ);
Запрос.Выполнить();

//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ТЗ1=ЗапросТМП.Выполнить().Выгрузить();
ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу




Вместо перечисления списка полей можно использовать "ВЫБРАТЬ *".

От zag2art
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:

Процедура ТипизацияТЗ(ТЗ) Экспорт
    РезультатТЗ = новый ТаблицаЗначений;
    Для Каждого Колонка из ТЗ.Колонки Цикл
        Имя = Колонка.Имя;
        МассивТипов = новый Массив(1);
        МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
        Описатель = новый ОписаниеТипов(МассивТипов);
        РезультатТЗ.Колонки.Добавить(Имя, Описатель);
    КонецЦикла;
    
    Для каждого Строка из ТЗ Цикл
        СтрокаРез = РезультатТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
    КонецЦикла;
    
    ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры





Функция для просмотра ВТ в отладчике

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




Вот как получить список всех ВТ, не знаю. Видимо никак.

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

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

ТекстЗапроса = "
| УНИЧТОЖИТЬ ИмяВременнойТаблицы
|";

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




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

1. Если в тексте запроса есть временная таблица, то этот запрос не разбирается конструктором запроса (это ограничение можно обойти нештатно, используя объявление подзапроса Книга знаний: v8: Конструирование сложных запросов для 1С). В релизе с 8.1.11 можно использовать конструктор
2. Нельзя выполнить запрос над временной таблицей и поместить данные в нее же саму.
3. Нельзя получить список временных таблиц из менеджера временных таблиц.

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


[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: 942644, Acid, Ardi, Lefer, logist, MATEVI, World1С, Егор Динин,

Fynjy Подменю пользователя
сообщение 15.09.10, 7:38
Сообщение #2

Сенсей Чака Норриса
**********
За вредность
Группа: Пользователи
Сообщений: 1994
Из: Ахметов сити
Спасибо сказали: 333 раз
Рейтинг: 0

Цитата
Функция для просмотра ВТ в отладчике

Можно после

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

следующей строкой написать
Запрос.Текст = "Выбрать * ИЗ ИмяВременнойТаблицы"

и не заморачиваться с функцией.

© Fynjy
Причина редактирования: Отформатировал немного. Вофка.


Signature

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 21:09
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!