рубрики: Фишки | Дата: 23 декабря, 2015
Многие наверное сталкивались с ошибкой, когда при попытке поместить таблицу значений во временную таблицу в запросе 1С8, запрос при выполнении вываливается с ошибкой: «Тип не может быть выбран в запросе» . И когда впервые сталкиваешься с этим, приходится потратить достаточное количество времени, чтобы понять в чем дело. Рассмотрим это на примере (можете создать обработку и поместить туда код, показанный ниже).
Для начала создадим простейшую таблицу значений с одной колонкой в которую запишем числа от 1 до 100
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("Число");
Для Счетчик = 1 По 100 Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Число = Счетчик;
КонецЦикла;
КонецПроцедуры
А теперь попытаемся поместить эту таблицу во временную таблицу в запросе:
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("Число");
Для Счетчик = 1 По 100 Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Число = Счетчик;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаЗначений.Число
|ПОМЕСТИТЬ ВТ_Таблица
|ИЗ
| &ТаблицаЗначений КАК ТаблицаЗначений";
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.УстановитьПараметр("ТаблицаЗначений", ТаблицаЗначений);
Результат = Запрос.Выполнить();
КонецПроцедуры
Теперь, если попытаться выполнить эту процедуру, мы увидим сообщение об ошибке:
{Форма.Форма.Форма(27)}: Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить(); по причине: {(2, 2)}: Тип не может быть выбран в запросе <<?>>ТаблицаЗначений.Число
Вроде код написан правильно, синтаксический контроль никаких ошибок не выдает. Так в чем же дело?
А дело все в том, что если вы собираетесь использовать таблицу значений в качестве временной в запросе, необходимо явно прописывать тип ее колонок. То есть в нашем случае надо немного подправить вторую строку нашей процедуры:
ТаблицаЗначений.Колонки.Добавить("Число");
вот таким образом:
ТаблицаЗначений.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"));
То есть здесь мы явно указываем, что тип создаваемой колонки это число.
Таким образом полный текст процедуры будет вот таким:
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"));
Для Счетчик = 1 По 100 Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Число = Счетчик;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаЗначений.Число
|ПОМЕСТИТЬ ВТ_Таблица
|ИЗ
| &ТаблицаЗначений КАК ТаблицаЗначений";
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.УстановитьПараметр("ТаблицаЗначений", ТаблицаЗначений);
Результат = Запрос.Выполнить();
КонецПроцедуры
И вот теперь она выполняется без ошибок.
Добавить комментарий