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