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

Вопрос Что означает сообщение об ошибке «Тип не может быть выбран в запросе»?
Ответ
Такая ошибка возникает, когда при выполнении запроса не получается определить тип выбираемого значения.
Пример.
В текст запроса требуется передать таблицу значений &ТЗПС и из этой таблицы значений построить новый запрос.
В параметры мы передаем ТаблицуЗначений:

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

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

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

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

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

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

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

Здесь использован метод копирования колонки таблицы значений, рассмотренный в http://www.1c-h.ru/?p=1266

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

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

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

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.