Что означает сообщение об ошибке «Тип не может быть выбран в запросе»
Такая ошибка возникает, когда при выполнении запроса не получается определить тип выбираемого значения.
Пример.
В текст запроса требуется передать таблицу значений &ТЗПС и из этой таблицы значений построить новый запрос.
В параметры мы передаем ТаблицуЗначений:
ТЗПС = ПолучитьТЗСуммаПоПартииТоваровНаСкладах(); Запрос.УстановитьПараметр("ТЗПС",ТЗПС);
т.е. Функция ПолучитьТЗСуммаПоПартииТоваровНаСкладах() возвращает ТаблицуЗначений.
Сам текст запроса выглядит примерно так:
|...; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗПТС.Качество КАК Качество, | ТЗПТС.Количество КАК КоличествоОстаток, | ТЗПТС.КонтрагентКод, | ТЗПТС.Номенклатура КАК Номенклатура, | ТЗПТС.НоменклатураКод КАК НоменклатураКод, | ТЗПТС.СерияНоменклатуры КАК СерияНоменклатуры, | ТЗПТС.Стоимость КАК СтоимостьОстаток, | ТЗПТС.Стоимость / ТЗПТС.Количество КАК СтоимостьЕдиницы |ПОМЕСТИТЬ втПервыеСуммыПартииТоваровНаСкладах |ИЗ | &ТЗПС КАК ТЗПТС |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ...
Если просто передать эту таблицу значений в запрос, то может возникнуть ошибка для колонок, у которых сбился тип колонки, например, тип которых «Число».
Чтобы исправить такую таблицу значений, можно сделать следующее: по каждому элементу выборки, на котором запрос «споткнется» с сообщением «Тип не может быть выбран в запросе», выполнить переопределение типа колонки перед передачей таблицы значений в запрос.
Например:
ТЗПС = ПолучитьТЗСуммаПоПартииТоваровНаСкладах(); // переработаем ТЗ с учетом сброса типов полей // Скопируем значение колонку КоличествоОстаток в колонку Количество: // создаем новую колонку с типом "Число": ТЗПС.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число")); // копируем: ТЗПС.ЗагрузитьКолонку(ТЗПС.ВыгрузитьКолонку("КоличествоОстаток"),"Количество"); ТЗПС.Колонки.Удалить("КоличествоОстаток"); Запрос.УстановитьПараметр("ТЗПС",ТЗПС);
Здесь использован метод копирования колонки таблицы значений, рассмотренный в статье Как скопировать колонку таблицы значений
Создал таблицу значений. В колонках определим тип с помощью ОписаниеТипов. При попытке выполнить запрос к созданной таблице выдаёт ошибку:
«Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу»
Мне временная таблица не нужна. Хочу выгрузить результат запроса в табличную часть документа.
«Если просто передать эту таблицу значений в запрос, то может возникнуть ошибка для колонок, у которых сбился тип колонки, например, тип которых «Число».»
Весьма настораживает здесь слово «сбился», если оно здесь вообще уместно. Проблема в мягкой типизация встроенного языка 1С. Выгружая что-то, пусть даже с известным типом, в таблицу значений, у которой жестко не заданы типы значений колонок, и используя эту ТЗ далее как в контексте примера, всегда будет возникать ошибка. Для подобного использования НУЖНО явно задавать тип хранимых данных колонок ТЗ.
Спасибо за комментарий, Алексей!