Имя: Пароль:
1C
1С v8
Использование менеджера временных таблиц
,
0 Norbertano
 
22.07.14
16:21
Приветствую. Прошу совета. Есть два запроса, в одном создается временная таблица, а во втором хочу ее использовать. Но при выполнении второго запроса ругается, что временная таблица не найдена

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
МоментИтогов = '00010101'
Иначе
МоментИтогов = Новый Граница(МоментВремени(), ВидГраницы.Включая);
КонецЕсли;
Запрос.УстановитьПараметр("МоментИтогов", МоментИтогов);


РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
//.....
КонецЦикла;


Запрос.Текст = "ВЫБРАТЬ
| ДокТЧ.Номенклатура,
| СУММА(ДокТЧ.Количество) КАК Количество,
| СУММА(ДокТЧ.Сумма) КАК Сумма,
| ПартииТоваровОстатки.Партия,
| ПартииТоваровОстатки.КоличествоОстаток,
| ПартииТоваровОстатки.СтоимостьОстаток
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
| ПО ДокТЧ.Номенклатура = ПартииТоваровОстатки.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ДокТЧ.Номенклатура,
| ПартииТоваровОстатки.Партия,
| ПартииТоваровОстатки.КоличествоОстаток,
| ПартииТоваровОстатки.СтоимостьОстаток";

Запрос.УстановитьПараметр("МоментИтогов", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Склад", Склад);

ПросмотрВТ(Запрос, "ДокТЧ");

РезультатЗапроса = Запрос.Выполнить();
ВыборкаИтоги = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

//В то же время, если использовать функцию для выгрузки ВТ в таблицу //значений, ошибок нет

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

ПросмотрВТ(Запрос, "ДокТЧ");
РезультатЗапроса = Запрос.Выполнить();
3 Norbertano
 
22.07.14
16:35
(2) ошибка выпала та же.
Перед выполнением первого запроса я создал МВТ.
Второй запрос это тот же первый, только с другим текстом запроса. (1) нужно создать еще один МВТ
4 Norbertano
 
22.07.14
16:35
?
5 Norbertano
 
22.07.14
16:41
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "Выбрать "; //Первый запрос
//....
Запрос.Текст = "Выбрать"; //Второй запрос

//Где здесь создавать второй МВТ
6 Serginio1
 
22.07.14
16:43
Менеджер=новый МенеджерВременныхТаблиц();

Запрос.МенеджерВременныхТаблиц = Менеджер;
ЗапросТМП.МенеджерВременныхТаблиц= Менеджер;
7 Norbertano
 
22.07.14
16:46
это нужно создать новый запросТМП. То есть я не могу использовать все один запрос
8 DrWatson
 
22.07.14
16:51
Где ошибка-то, во втором запросе в ОбработкаПроведения, или в ПросмотрВТ?
9 Norbertano
 
22.07.14
16:53
(2) если поменять местами, как Вы говорили, то в просмотрВТ. Если ничего не трогать в ОбработкаПроведения
10 rozer76
 
22.07.14
16:53
(7) переделай через "пакетный" как вариант а так походу все правильно
11 Широкий
 
22.07.14
16:55
(Номенклатура, Склад) В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура,
| &Склад

Это нужно переделать
12 Norbertano
 
22.07.14
16:57
(6) Сделал, как Вы сказали. Все равно та же ошибка

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

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

РезультатЗапроса2 = ЗапросТМП.Выполнить();
Выборка2 = РезультатЗапроса2.Выбрать();
//Цикл
13 rozer76
 
22.07.14
17:01
(12) сделай через пакет и "ВыполнитьПакет()" и разбирай массив - учись по типовым конфам ))
14 DrWatson
 
22.07.14
17:04
Да вроде всё правильно написано. Вот для примера себе написал - работает. Посмотри, сравни.

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    1 КАК Поле1
        |ПОМЕСТИТЬ ВТ";

    Результат = Запрос.Выполнить();
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВТ.Поле1
                   |ИЗ
                   |    ВТ КАК ВТ";
    Результат = Запрос.Выполнить();
    
    ЗапросТМП = Новый Запрос;
    ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
    ЗапросТМП.Текст = "ВЫБРАТЬ
                   |    ВТ.Поле1
                   |ИЗ
                   |    ВТ КАК ВТ";
    Результат = ЗапросТМП.Выполнить();
15 alle68
 
22.07.14
17:05
(12) Запрос должен быть один, меняется только текст.
16 Бледно Золотистый
 
22.07.14
17:05
А не закрывает ли одинеска ЗапросТМП.МенеджерВременныхТаблиц автоматом в конце процедуры при уничтожении переменной ЗапросТМП?
17 Norbertano
 
22.07.14
17:07
(14) Вот беда, а у меня этот код выполняется с той же ошибкой в каркасной конфигурации во внешней обработке :(
18 Serginio1
 
22.07.14
17:08
(15) Необязательно.
19 DrWatson
 
22.07.14
17:08
(16) права не имеет, на МВТ есть ещё одна ссылка, из ещё существующего первого запроса
20 Norbertano
 
22.07.14
17:09
(17) в типовой конфигурации тоже ошибка
21 Бледно Золотистый
 
22.07.14
17:10
(20) Да там понятно откуда. Во 2 - запрос новый с новым МенеджерВременныхТаблиц .
22 DrWatson
 
22.07.14
17:12
(21) Да, удалить забыл когда писал

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    1 КАК Поле1
        |ПОМЕСТИТЬ ВТ";

    Результат = Запрос.Выполнить();
    
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВТ.Поле1
                   |ИЗ
                   |    ВТ КАК ВТ";
    Результат = Запрос.Выполнить();
    
    ЗапросТМП = Новый Запрос;
    ЗапросТМП.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
    ЗапросТМП.Текст = "ВЫБРАТЬ
                   |    ВТ.Поле1
                   |ИЗ
                   |    ВТ КАК ВТ";
    Результат = ЗапросТМП.Выполнить();
23 Norbertano
 
22.07.14
18:26
Всем спасибо