При изучении языка запросов 1С, особенно при работе с интерактивными тренажерами и системами автоматического тестирования, начинающие разработчики часто сталкиваются с парадоксальной ситуацией. Запрос написан, данные в таблице результатов визуально полностью соответствуют ожидаемым, однако система выдает критическую ошибку: «Несовпадение типа значений полей результирующего и эталонного наборов данных». Рассмотрим подробнее, почему это происходит и как правильно интерпретировать результаты работы консоли.
Разберем конкретный пример, в котором пользователь пытается выбрать данные из регистра сведений. Перед ним стоит задача: найти модели оборудования, тип которых заканчивается на букву "ы", и вывести две колонки — "Модель" и "Наименование" (под которым подразумевается текстовое название типа оборудования).
Автор предлагает следующий вариант запроса:
ВЫБРАТЬ
Оборудование.Модель,
Оборудование.ТипОборудования КАК Наименование
ИЗ
РегистрСведений.Оборудование КАК Оборудование
ГДЕ
Оборудование.ТипОборудования.Наименование ПОДОБНО "%ы"
Проанализируем этот код. На первый взгляд, все логично: мы выбираем модель и тип, задаем псевдоним Наименование и фильтруем данные. В консоли запросов мы увидим привычную таблицу, где в колонке Наименование будет написано, например, "Принтеры" или "Сканеры". Однако именно здесь кроется ловушка.
Выясним главную причину ошибки. В системе 1С поле Оборудование.ТипОборудования чаще всего является ссылкой на элемент справочника (тип данных СправочникСсылка.ТипыОборудования). Ссылка — это сложный объект, который в базе данных представлен уникальным идентификатором (UUID).
Когда мы выполняем запрос в обычной консоли, платформа 1С старается сделать результат "читаемым" для человека. Она автоматически подтягивает Основное представление объекта (как правило, это реквизит Наименование) и выводит его в ячейку таблицы. Таким образом, мы видим текст "Принтеры", но "под капотом" в этой колонке лежит Ссылка.
В то же время, автоматизированный тест или эталонный запрос ожидает в этой колонке тип данных Строка. Для алгоритма сравнения Ссылка и Строка — это принципиально разные сущности, даже если текст в них совпадает до символа. Это и приводит к сообщению о несовпадении типов.
Чтобы исправить ситуацию, нам необходимо обратиться к конкретному строковому реквизиту объекта через точку. Рассмотрим правильный вариант запроса:
ВЫБРАТЬ
Оборудование.Модель КАК Модель,
Оборудование.ТипОборудования.Наименование КАК Наименование
ИЗ
РегистрСведений.Оборудование КАК Оборудование
ГДЕ
Оборудование.ТипОборудования.Наименование ПОДОБНО "%ы"
В данном случае мы явно указываем системе: "Возьми из справочника, на который ссылается поле ТипОборудования, именно текстовое поле Наименование". Теперь в результирующую таблицу попадет значение с типом Строка, и проверка на соответствие типов данных будет пройдена успешно.
Проанализируем ситуацию глубже. Использование точки в поле Оборудование.ТипОборудования.Наименование заставляет платформу выполнить неявное левое соединение (LEFT JOIN) с таблицей справочника. Это важный технический момент, который нужно учитывать:
ТипОборудования в регистре не заполнено, то обращение через точку вернет NULL. В некоторых задачах это может быть критично.Посмотрим на пример из обсуждения, где упоминается путаница с именами колонок. Тестирующие системы часто сравнивают не только типы, но и заголовки полей. Псевдоним задается с помощью ключевого слова КАК. Если в эталоне колонка называется Наименование, а вы назвали ее Тип, тест выдаст ошибку, даже если типы данных (строка) совпадут.
Правильное использование псевдонимов помогает избежать двусмысленности:
ВЫБРАТЬ
Оборудование.Модель КАК Модель,
Оборудование.ТипОборудования.Наименование КАК Наименование
ИЗ ...
Для успешного решения задач в консоли запросов и прохождения тестов рекомендуем придерживаться следующих правил:
.Наименование.Таким образом, понимание внутреннего устройства объектов 1С и механизмов работы языка запросов позволяет быстро находить и устранять ошибки, которые на первый взгляд кажутся необъяснимыми.