Ошибка «Тип не может быть выбран в запросе», использование Таблицы Значений в запросе (1С: Программисту: Язык запросов) — 1C-h
 

Ошибка «Тип не может быть выбран в запросе», использование Таблицы Значений в запросе (1С: Программисту: Язык запросов)

3

Что означает сообщение об ошибке «Тип не может быть выбран в запросе»

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

Пример.
В текст запроса требуется передать таблицу значений &ТЗПС и из этой таблицы значений построить новый запрос.

В параметры мы передаем ТаблицуЗначений:

    ТЗПС = ПолучитьТЗСуммаПоПартииТоваровНаСкладах();
    Запрос.УстановитьПараметр("ТЗПС",ТЗПС);

т.е. Функция ПолучитьТЗСуммаПоПартииТоваровНаСкладах() возвращает ТаблицуЗначений.
Сам текст запроса выглядит примерно так:


    |...;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ТЗПТС.Качество КАК Качество,
    |   ТЗПТС.Количество КАК КоличествоОстаток,
    |   ТЗПТС.КонтрагентКод,
    |   ТЗПТС.Номенклатура КАК Номенклатура,
    |   ТЗПТС.НоменклатураКод КАК НоменклатураКод,
    |   ТЗПТС.СерияНоменклатуры КАК СерияНоменклатуры,
    |   ТЗПТС.Стоимость КАК СтоимостьОстаток,
    |   ТЗПТС.Стоимость / ТЗПТС.Количество КАК СтоимостьЕдиницы
    |ПОМЕСТИТЬ втПервыеСуммыПартииТоваровНаСкладах
    |ИЗ
    |   &ТЗПС КАК ТЗПТС
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ ...

Если просто передать эту таблицу значений в запрос, то может возникнуть ошибка для колонок, у которых сбился тип колонки, например, тип которых «Число».
Чтобы исправить такую таблицу значений, можно сделать следующее: по каждому элементу выборки, на котором запрос «споткнется» с сообщением «Тип не может быть выбран в запросе», выполнить переопределение типа колонки перед передачей таблицы значений в запрос.

Например:

    ТЗПС = ПолучитьТЗСуммаПоПартииТоваровНаСкладах();

    // переработаем ТЗ с учетом сброса типов полей
    // Скопируем значение колонку КоличествоОстаток в колонку Количество:
    // создаем новую колонку с типом "Число":
    ТЗПС.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число"));
    // копируем:
    ТЗПС.ЗагрузитьКолонку(ТЗПС.ВыгрузитьКолонку("КоличествоОстаток"),"Количество");
    ТЗПС.Колонки.Удалить("КоличествоОстаток");

    Запрос.УстановитьПараметр("ТЗПС",ТЗПС);

Здесь использован метод копирования колонки таблицы значений, рассмотренный в статье Как скопировать колонку таблицы значений

3 thoughts on “Ошибка «Тип не может быть выбран в запросе», использование Таблицы Значений в запросе (1С: Программисту: Язык запросов)

  1. Создал таблицу значений. В колонках определим тип с помощью ОписаниеТипов. При попытке выполнить запрос к созданной таблице выдаёт ошибку:
    «Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу»
    Мне временная таблица не нужна. Хочу выгрузить результат запроса в табличную часть документа.

  2. «Если просто передать эту таблицу значений в запрос, то может возникнуть ошибка для колонок, у которых сбился тип колонки, например, тип которых «Число».»
    Весьма настораживает здесь слово «сбился», если оно здесь вообще уместно. Проблема в мягкой типизация встроенного языка 1С. Выгружая что-то, пусть даже с известным типом, в таблицу значений, у которой жестко не заданы типы значений колонок, и используя эту ТЗ далее как в контексте примера, всегда будет возникать ошибка. Для подобного использования НУЖНО явно задавать тип хранимых данных колонок ТЗ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Next Post

Почему при попытке распечатать на конкретный принтер печать идет на принтер по умолчанию? Команда ТабДокумент.ИмяПринтера не работает (1С: V8: Программисту: Язык программирования)

Ср Июн 16 , 2010
Вопрос Почему может не работать команда ТабДокумент.ИмяПринтера — при попытке распечатать на конкретный принтер, печать идет на принтер по умолчанию? Ответ Возможно это происходит из-за того, что после присвоения имени принтера командой ТабДокумент.ИмяПринтера где-то ниже идет команда «ИмяПараметровПечати». Эта команда переопределит принтер. Например: ТабДокумент.ИмяПринтера = ... ... ТабДокумент.ИмяПараметровПечати = ... […]