Профессия — 1С

Рукопашный бой Карташ

Категории

Таблица значений во временную

рубрики: Фишки | Дата: 23 Декабрь, 2015

Многие наверное сталкивались с ошибкой, когда при попытке поместить таблицу значений во временную таблицу в запросе 1С8, запрос при выполнении вываливается с ошибкой: «Тип не может быть выбран в запросе» . И когда впервые сталкиваешься с этим, приходится потратить достаточное количество времени, чтобы понять в чем дело. Рассмотрим это на примере (можете создать обработку и поместить туда код, показанный ниже).




Для начала создадим простейшую таблицу значений с одной колонкой в которую запишем числа от 1 до 100



Процедура КнопкаВыполнитьНажатие(Кнопка)

	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("Число");
	
	Для Счетчик = 1 По 100 Цикл
		НоваяСтрока = ТаблицаЗначений.Добавить();
		НоваяСтрока.Число = Счетчик;
	КонецЦикла;

КонецПроцедуры

А теперь попытаемся поместить эту таблицу во временную таблицу в запросе:



Процедура КнопкаВыполнитьНажатие(Кнопка)

	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("Число");
	
	Для Счетчик = 1 По 100 Цикл
		НоваяСтрока = ТаблицаЗначений.Добавить();
		НоваяСтрока.Число = Счетчик;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТаблицаЗначений.Число
	|ПОМЕСТИТЬ ВТ_Таблица
	|ИЗ
	|	&ТаблицаЗначений КАК ТаблицаЗначений";
	
	МенеджерВТ = Новый МенеджерВременныхТаблиц;
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	Запрос.УстановитьПараметр("ТаблицаЗначений", ТаблицаЗначений);
	
	Результат = Запрос.Выполнить();

КонецПроцедуры

Теперь, если попытаться выполнить эту процедуру, мы увидим сообщение об ошибке:


{Форма.Форма.Форма(27)}: Ошибка при вызове метода контекста (Выполнить)
	Результат = Запрос.Выполнить();
по причине:
{(2, 2)}: Тип не может быть выбран в запросе
<<?>>ТаблицаЗначений.Число




Вроде код написан правильно, синтаксический контроль никаких ошибок не выдает. Так в чем же дело?
А дело все в том, что если вы собираетесь использовать таблицу значений в качестве временной в запросе, необходимо явно прописывать тип ее колонок. То есть в нашем случае надо немного подправить вторую строку нашей процедуры:



ТаблицаЗначений.Колонки.Добавить("Число");

вот таким образом:



ТаблицаЗначений.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"));

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



Процедура КнопкаВыполнитьНажатие(Кнопка)

	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"));
	
	Для Счетчик = 1 По 100 Цикл
		НоваяСтрока = ТаблицаЗначений.Добавить();
		НоваяСтрока.Число = Счетчик;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТаблицаЗначений.Число
	|ПОМЕСТИТЬ ВТ_Таблица
	|ИЗ
	|	&ТаблицаЗначений КАК ТаблицаЗначений";
	
	МенеджерВТ = Новый МенеджерВременныхТаблиц;
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	Запрос.УстановитьПараметр("ТаблицаЗначений", ТаблицаЗначений);
	
	Результат = Запрос.Выполнить();

КонецПроцедуры

И вот теперь она выполняется без ошибок.

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

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

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С