Почему возникает ошибка «Тип не может быть выбран в запросе» при работе с таблицей значений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина возникновения ошибки

Когда мы передаем таблицу значений в качестве параметра в Запрос, платформа 1С пытается сопоставить колонки этой таблицы с типами данных, которые понимает язык запросов. Если вы создали таблицу значений «на лету» в коде, не задав при этом ОписаниеТипов для колонок, система не знает, что именно в них хранится: Число, Строка, Дата или ссылка на объект. Особенно критично это для строковых полей, где платформа не может определить допустимую длину, что часто приводит к конфликту с ограничениями движка запросов.

Способ решения: Явная типизация колонок

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

Вместо простого добавления колонок по имени, мы будем передавать второй аргумент — объект, описывающий допустимые типы. Рассмотрим, как это реализовать на практике:


// Создаем таблицу значений
ТабАПи = Новый ТаблицаЗначений;

// Определяем типы для колонок
ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));

// Добавляем колонки с типизацией
ТабАПи.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТабАПи.Колонки.Добавить("Количество", ОписаниеТипаЧисло);
ТабАПи.Колонки.Добавить("Комментарий", ОписаниеТипаСтрока);

Использование ОписаниеТипов позволяет платформе 1С «понять», как именно нужно обрабатывать данные внутри запроса. Если вы работаете со строками, обязательно ограничивайте их длину, так как неограниченная длина (длина 0 в квалификаторе) не поддерживается для полей временных таблиц при определенных операциях.

Работа с консолью запросов

Если вы отлаживаете запрос в Консоли запросов, часто возникает путаница с тем, как передать параметр. Убедитесь, что для параметра, содержащего таблицу значений, в настройках консоли установлен верный тип данных (ТЗ). В коде 1С передача выглядит следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ТАБАПИ.Номенклатура КАК Номенклатура,
               |    ТАБАПИ.Количество КАК Количество
               |ПОМЕСТИТЬ ТАБАПИ2
               |ИЗ
               |    &ТАБАПИ КАК ТАБАПИ";

Запрос.УстановитьПараметр("ТАБАПИ", ТабАПи);
Результат = Запрос.Выполнить();

Важные рекомендации при работе с таблицами значений

  1. Всегда типизируйте колонки: Никогда не оставляйте колонки «пустыми» по типам, если планируете передавать их в Запрос.
  2. Ограничивайте строки: Избегайте использования строк неограниченной длины в структурах, которые передаются в запрос. Если это невозможно, используйте функцию ВЫРАЗИТЬ внутри текста запроса, например: ВЫРАЗИТЬ(ТАБАПИ.Комментарий КАК СТРОКА(200)).
  3. Проверка перед запросом: Если таблица заполняется динамически, добавьте проверку или принудительное приведение типов перед тем, как устанавливать её параметром запроса.
  4. Преимущество типизации: Помимо устранения ошибки, явная типизация позволяет оптимизатору запросов 1С работать быстрее, так как он заранее знает структуру данных.

Соблюдение этих правил поможет вам избавиться от ошибок времени выполнения и сделает ваш код более профессиональным и предсказуемым. Теперь вы знаете, что при возникновении подобного исключения первым делом стоит проверить ОписаниеТипов ваших колонок!

← На главную