Почему в консоли запросов возникает ошибка «Несовпадение типа значений полей», если результат выглядит правильно?

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

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

Анализируем исходную ситуацию

Разберем конкретный пример, в котором пользователь пытается выбрать данные из регистра сведений. Перед ним стоит задача: найти модели оборудования, тип которых заканчивается на букву "ы", и вывести две колонки — "Модель" и "Наименование" (под которым подразумевается текстовое название типа оборудования).

Автор предлагает следующий вариант запроса:


ВЫБРАТЬ
    Оборудование.Модель,
    Оборудование.ТипОборудования КАК Наименование
ИЗ
    РегистрСведений.Оборудование КАК Оборудование
ГДЕ
    Оборудование.ТипОборудования.Наименование ПОДОБНО "%ы"

Проанализируем этот код. На первый взгляд, все логично: мы выбираем модель и тип, задаем псевдоним Наименование и фильтруем данные. В консоли запросов мы увидим привычную таблицу, где в колонке Наименование будет написано, например, "Принтеры" или "Сканеры". Однако именно здесь кроется ловушка.

Различие между Ссылкой и Строкой: визуальная иллюзия

Выясним главную причину ошибки. В системе 1С поле Оборудование.ТипОборудования чаще всего является ссылкой на элемент справочника (тип данных СправочникСсылка.ТипыОборудования). Ссылка — это сложный объект, который в базе данных представлен уникальным идентификатором (UUID).

Когда мы выполняем запрос в обычной консоли, платформа 1С старается сделать результат "читаемым" для человека. Она автоматически подтягивает Основное представление объекта (как правило, это реквизит Наименование) и выводит его в ячейку таблицы. Таким образом, мы видим текст "Принтеры", но "под капотом" в этой колонке лежит Ссылка.

В то же время, автоматизированный тест или эталонный запрос ожидает в этой колонке тип данных Строка. Для алгоритма сравнения Ссылка и Строка — это принципиально разные сущности, даже если текст в них совпадает до символа. Это и приводит к сообщению о несовпадении типов.

Решение проблемы: разыменование ссылки

Чтобы исправить ситуацию, нам необходимо обратиться к конкретному строковому реквизиту объекта через точку. Рассмотрим правильный вариант запроса:


ВЫБРАТЬ
    Оборудование.Модель КАК Модель,
    Оборудование.ТипОборудования.Наименование КАК Наименование
ИЗ
    РегистрСведений.Оборудование КАК Оборудование
ГДЕ
    Оборудование.ТипОборудования.Наименование ПОДОБНО "%ы"

В данном случае мы явно указываем системе: "Возьми из справочника, на который ссылается поле ТипОборудования, именно текстовое поле Наименование". Теперь в результирующую таблицу попадет значение с типом Строка, и проверка на соответствие типов данных будет пройдена успешно.

Нюансы работы с разыменованием в запросах

Проанализируем ситуацию глубже. Использование точки в поле Оборудование.ТипОборудования.Наименование заставляет платформу выполнить неявное левое соединение (LEFT JOIN) с таблицей справочника. Это важный технический момент, который нужно учитывать:

Важность псевдонимов (алиасов)

Посмотрим на пример из обсуждения, где упоминается путаница с именами колонок. Тестирующие системы часто сравнивают не только типы, но и заголовки полей. Псевдоним задается с помощью ключевого слова КАК. Если в эталоне колонка называется Наименование, а вы назвали ее Тип, тест выдаст ошибку, даже если типы данных (строка) совпадут.

Правильное использование псевдонимов помогает избежать двусмысленности:


ВЫБРАТЬ
    Оборудование.Модель КАК Модель,
    Оборудование.ТипОборудования.Наименование КАК Наименование
ИЗ ...

Итоги и рекомендации

Для успешного решения задач в консоли запросов и прохождения тестов рекомендуем придерживаться следующих правил:

  1. Различайте типы данных: Ссылка на справочник (объект) — это не то же самое, что текст (наименование).
  2. Читайте условие внимательно: Если просят вывести "Наименование", обращайтесь к полю .Наименование.
  3. Проверяйте метаданные: Перед написанием запроса посмотрите в конфигураторе или в дереве запроса, какие типы имеют поля таблиц.
  4. Не доверяйте визуальному представлению: Помните, что консоль 1С "раскрашивает" и форматирует результаты для удобства пользователя, скрывая техническую суть данных.

Таким образом, понимание внутреннего устройства объектов 1С и механизмов работы языка запросов позволяет быстро находить и устранять ошибки, которые на первый взгляд кажутся необъяснимыми.

← На главную