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

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

3

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

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

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

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

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

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


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

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

Например:

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

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

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

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

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

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

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

Добавить комментарий для madmonk Отменить ответ

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

Next Post

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

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