Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка с запросом
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Vofka
Есть обработка:
//************
    ТЗ1=Новый ТаблицаЗначений();
    ТЗ1.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
    ТЗ1.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
    ТЗ1.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число"));
    Для Сч=0 По 100 Цикл
        Стр=ТЗ1.Добавить();
        Стр.А="А"+Сч;
        Стр.Б="Б"+Сч;
        Стр.Кво = 1;
    КонецЦикла;
    
    //************
    ТЗ2 = Новый ТаблицаЗначений();
    ТЗ2.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
    ТЗ2.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
    ТЗ2.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число"));
    Для Сч=0 По 100 Цикл
        Стр=ТЗ2.Добавить();
        Стр.А="А"+Сч;
        Стр.Б="Б"+Сч;
        Стр.Кво = 1;
    КонецЦикла;
    
    //************
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |(Выбрать
    |    Т1.А,
    |    Т1.Б,
    |    Т1.Кво
    |Из
    |    &Таб1 Как Т1
    |
    |ОБЪЕДИНИТЬ
    |
    |Выбрать
    |    Т2.А,
    |    Т2.Б,
    |    Т2.Кво
    |Из
    |    &Таб2 Как Т2)";
    
    Запрос.УстановитьПараметр("Таб1", ТЗ1);
    Запрос.УстановитьПараметр("Таб2", ТЗ2);
    ТИтог = Запрос.Выполнить().Выгрузить();


Жму "Выполнить", получаю ошибку:

Цитата
Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу
ТИтог = Запрос.Выполнить().Выгрузить();
по причине:
Содержимое объекта данных может быть выбрано только во временную таблицу


Шо за беда? sad.gif
logist
Подумайте в эту сторону:
Цитата(Vofka @ 06.09.10, 11:09) необходимо зарегистрироваться для просмотра ссылки
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
...
Vofka
Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ВТТаб
    |ИЗ
    |(Выбрать
    |    Т1.А,
    |    Т1.Б,
    |    Т1.Кво
    |Из
    |    &Таб1 Как Т1
    |
    |ОБЪЕДИНИТЬ
    |
    |Выбрать
    |    Т2.А,
    |    Т2.Б,
    |    Т2.Кво
    |Из
    |    &Таб2 Как Т2)";
    
    Запрос.УстановитьПараметр("Таб1", ТЗ1);
    Запрос.УстановитьПараметр("Таб2", ТЗ2);
    ТИтог = Запрос.Выполнить().Выгрузить();


Ошибка такая же.
logist
Неее... думать в эту сторону это думать дальше, а не использовать одну строчку smile.gif
Я не силен в запросах, просто судя по ошибке надо использовать временные таблицы.
Vofka
Пробую так:

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


Всёравно та же ошибка:
Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу
    Запрос.Выполнить();    
по причине:
Содержимое объекта данных может быть выбрано только во временную таблицу


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

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


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

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


Пример у меня работает, а то что я хочу - нет
Vofka
Все это началось из-за того, что возникла необходимость прочитать и обработать данные запросом из таблицы значений. Точнее из 2-х отдельных таблиц и результат объединить. Может можно это сделать по проще?
World1С
Убери конструкцию ПОМЕСТИТЬ
Vofka
А откуда тогда будет брать данные 2-й запрос?

Пока дошел до такого, вроде работает:
ТЗ1 = Новый ТаблицаЗначений();    
    ТЗ2 = Новый ТаблицаЗначений();
    
    ЗапросТМЦ = Новый Запрос;
    ЗапросТМЦ.Текст = "
    |ВЫБРАТЬ ПЕРВЫЕ 100
    |    СпрНоменклатура.Ссылка КАК Номенклатура
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |ГДЕ
    |    СпрНоменклатура.ЭтоГруппа = 0";
    ТЗ1 = ЗапросТМЦ.Выполнить().Выгрузить();
    ТЗ2 = ЗапросТМЦ.Выполнить().Выгрузить();
    
    ТЗ1.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число"));
    ТЗ1.Колонки.Добавить("ТЗ", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(3)));
    
    ТЗ2.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число"));
    ТЗ2.Колонки.Добавить("ТЗ", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(3)));
    
    ТЗ1.ЗаполнитьЗначения(1, "Кво");
    ТЗ1.ЗаполнитьЗначения("ТЗ1", "ТЗ");
    
    ТЗ2.ЗаполнитьЗначения(1, "Кво");
    ТЗ2.ЗаполнитьЗначения("ТЗ2", "ТЗ");
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ВТ1
    |ИЗ
    |    &ТЗ1 КАК ТЗ1";
    Запрос.УстановитьПараметр("ТЗ1", ТЗ1);
    Запрос.Выполнить();
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ВТ2
    |ИЗ
    |    &ТЗ2 КАК ТЗ2";
    Запрос.УстановитьПараметр("ТЗ2", ТЗ2);
    Запрос.Выполнить();
    
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Подзапрос.Номенклатура КАК Номенклатура,
    |    СУММА(Подзапрос.Кво) КАК Кво
    |ИЗ
    |(ВЫБРАТЬ
    |    Номенклатура КАК Номенклатура,
    |    Кво КАК Кво
    |ИЗ
    |    ВТ1
    |    
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    Номенклатура КАК Номенклатура,
    |    Кво КАК Кво
    |ИЗ
    |    ВТ2) КАК Подзапрос
    |СГРУППИРОВАТЬ ПО
    |    Номенклатура";
    
    ТЗИтоги = Запрос.Выполнить().Выгрузить();


Если это через }*{опу - прошу пояснить smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.