Имя: Пароль:
1C
 
Ошибка "Неверные параметры" при использовании временной таблицы в запросе
0 AeroRed
 
18.02.15
17:08
Здравствуйте! Задача: написать запрос, формирующий статистику продаж по номенклатуре, а именно максимальные дневные продажи за период. Хочу реализовать это именно через временную таблицу по некоторым причинам. Использую универсальный отчет, на данный момент написал 2 запроса:

Запрос №1: "СформироватьВТ()". Выгружает ТаблицуЗначений по продажам. Он довольно длинный и заурядный, но если нужно тоже выложу.

Запрос №2: Выводит итоговый результат. Параметр &ВТПродажи берется из результатов первого запроса следующей строчкой:  УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ВТПродажи", СформироватьВТ());

Данный запрос сократил, для удобства чтения, т.к. на ошибку это не влияет.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВТПродажи.Количество,
    ВТПродажи.Номенклатура,
    ВТПродажи.Склад,
    ВТПродажи.День
ПОМЕСТИТЬ ВыборкаПродажи
ИЗ
    &ВТПродажи КАК ВТПродажи
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ВыборкаПродажи.Количество) КАК Количество,
    ВложенныйНоменклатура.Склад,
    ВложенныйНоменклатура.Номенклатура
ИЗ
    (ВЫБРАТЬ
        Склады.Ссылка КАК Склад,
        Номенклатура.Ссылка КАК Номенклатура
    ИЗ
        Справочник.Склады КАК Склады,
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.ЭтоГруппа = ЛОЖЬ
        И Склады.ЭтоГруппа = ЛОЖЬ) КАК ВложенныйНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ВыборкаПродажи КАК ВыборкаПродажи
        ПО ВложенныйНоменклатура.Склад = ВыборкаПродажи.Склад
            И ВложенныйНоменклатура.Номенклатура = ВыборкаПродажи.Номенклатура

СГРУППИРОВАТЬ ПО
    ВложенныйНоменклатура.Склад,
    ВложенныйНоменклатура.Номенклатура

Полный текст ошибки:
{ВнешнийОтчет.ЗапасыИТочкиЗаказа.МодульОбъекта(157)}: Ошибка при установке значения атрибута контекста (Текст)
    УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
по причине:
{(8, 2)}: Неверные параметры "ВТПродажи"
<<?>>&ВТПродажи КАК ВТПродажи

Подскажите пожалуйста, где я ошибся? Спасибо!
1 vicof
 
18.02.15
17:09
Типы в ТЗ нужно явно опредлять
2 vicof
 
18.02.15
17:10
Только нафига с двумя запросами извращаться, когда все можно сделать одним
3 AeroRed
 
18.02.15
17:16
2 запроса нужны, т.к. предполагается дополнительно обрабатывать временную таблицу прежде чем подсунуть в итоговый запрос (будет очистка статистики).

"Типы в ТЗ нужно явно опредлять" - не совсем понял, это в 1-м запросе нужно сделать?
4 vicof
 
18.02.15
17:18
Это надо сначала описать колонки в тз, потом через выборку обходить первый запрос из пихать его в таблицу.
5 vicof
 
18.02.15
17:19
Или менеджер временных таблиц использовать
6 AeroRed
 
18.02.15
17:55
Не получается что-то. Прилагаю код 1-го запроса, добавил обход результата, но ошибка та же. Может не так понял что-то? Или еще вариант, может в универсальном отчете через построитель есть какие-то нюансы?

Функция СформироватьВТ()

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

КонецФункции
7 FIXXXL
 
18.02.15
17:59
попробуй не через функцию получать ТЗ, а в той же процедуре, где ее подсовываешь, должно и без типизации взлететь
8 AeroRed
 
24.02.15
12:17
Пришел к выводу что данная конструкция неработоспособна в "Универсальном отчете". Возможно он вообще не поддерживает временные таблицы. Если у кого есть опровержение с примером, буду благодарен за ссылку или пример кода.
Сейчас же пришлось реализовать в виде внешней обработки, заполняя результатом табличное поле. Там всё завелось сразу с 2-мя запросами и без типизации.
Всем спасибо за участие!