Разработчики отчетов на базе Системы компоновки данных (СКД) в «1С:Предприятии» часто сталкиваются с крайне неприятной ситуацией. Запрос, написанный в конструкторе, успешно проходит проверку синтаксиса, прекрасно выполняется в консоли запросов и возвращает корректные данные. Однако при попытке сформировать готовый отчет СКД внезапно аварийно завершает работу с ошибкой «Поле не найдено "Владелец"» (или любым другим реквизитом, получаемым через точку).
В этой статье мы подробно проанализируем, почему возникает эта проблема, как работает механизм разыменования полей во временных таблицах СКД, и разберем по шагам надежные практические способы ее решения.
Рассмотрим стандартную ситуацию. У нас есть временная таблица ВТ_Конечная, в которой хранится поле Модель (ссылка на справочник «Модели»). В итоговом запросе пакета мы пытаемся получить владельца этой модели напрямую через точку:
ВЫБРАТЬ
ВТ_Конечная.Ссылка КАК Ссылка,
ВТ_Конечная.Объект КАК Объект,
ВТ_Конечная.Модель КАК Модель,
ВТ_Конечная.Модель.Владелец КАК Владелец
ИЗ
ВТ_Конечная КАК ВТ_Конечная
При формировании отчета система выдает ошибку отсутствия поля. При этом, если мы уберем поле Владелец из самого запроса, но добавим путь Модель.Владелец в пользовательских настройках (выбранных полях) СКД, отчет сформируется без проблем. Почему так происходит? Выясним основные причины этого поведения.
---
Когда данные помещаются во временную таблицу (ВТ), платформа «1С:Предприятие» не всегда способна жестко определить и зафиксировать типы полей на уровне метаданных СКД. Это особенно актуально, если источник данных для временной таблицы имел составной тип или тип поля формировался динамически.
Если поле Модель в таблице ВТ_Конечная не типизировано строго, СКД на этапе генерации макета компоновки не может однозначно определить, к какому именно справочнику относится это поле. Из-за этого обращение через точку к реквизиту Модель.Владелец становится невозможным, и генератор макета выбрасывает ошибку.
Решение: Принудительное приведение типов
Для устранения этой неопределенности мы должны явно указать платформе тип данных поля с помощью функции ВЫРАЗИТЬ. Это можно сделать как в конечном запросе, так и непосредственно при помещении данных во временную таблицу:
ВЫБРАТЬ
ВТ_Конечная.Ссылка КАК Ссылка,
ВТ_Конечная.Объект КАК Объект,
ВТ_Конечная.Модель КАК Модель,
ВЫРАЗИТЬ(ВТ_Конечная.Модель КАК Справочник.Модели).Владелец КАК Владелец
ИЗ
ВТ_Конечная КАК ВТ_Конечная
Использование конструкции ВЫРАЗИТЬ жестко связывает поле с конкретной таблицей БД, позволяя СКД безошибочно определить наличие реквизита Владелец.
---
В СКД по умолчанию включена функция «Автозаполнение» для наборов данных. Этот механизм анализирует настройки отчета (какие поля выбраны пользователем, какие используются в группировках, отборах и условном оформлении) и динамически перестраивает исходный SQL-запрос перед отправкой его к СУБД. Это делается для того, чтобы не выбирать лишние данные и ускорить работу отчета.
Однако при разыменовании полей временных таблиц (обращении через точку вида ВТ_Конечная.Модель.Владелец) оптимизатор СКД ведет себя некорректно. Он может «вырезать» это поле из итогового текста запроса к базе данных, посчитав его неиспользуемым, но при этом продолжит обращаться к нему при компоновке результата. Итог — падение с ошибкой.
Решение А: Переход на явное левое соединение (Best Practice)
В профессиональной разработке на платформе 1С обращение через две точки в запросах (особенно к полям временных таблиц) считается нежелательным из-за непредсказуемости построения планов запросов СУБД. Вместо неявного соединения через точку мы рекомендуем использовать явное ЛЕВОЕ СОЕДИНЕНИЕ с таблицей-источником реквизита:
ВЫБРАТЬ
ВТ_Конечная.Ссылка КАК Ссылка,
ВТ_Конечная.Объект КАК Объект,
ВТ_Конечная.Модель КАК Модель,
СправочникМодели.Владелец КАК Владелец
ИЗ
ВТ_Конечная КАК ВТ_Конечная
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Модели КАК СправочникМодели
ПО ВТ_Конечная.Модель = СправочникМодели.Ссылка
Этот подход решает проблему раз и навсегда. СКД больше не нужно «угадывать» связи полей временной таблицы — связь описана явно на уровне SQL-запроса.
Решение Б: Использование роли поля «Обязательное»
Если по каким-то причинам вам необходимо оставить обращение через точку, вы можете запретить оптимизатору СКД исключать данное поле из запроса. Для этого выполним следующие шаги:
Владелец.Теперь СКД будет принудительно выбирать это поле из базы данных всегда, независимо от того, выбрал ли его пользователь в настройках структуры отчета.
---
Слово Владелец является стандартным системным реквизитом для подчиненных справочников в 1С. Когда мы пишем конструкцию КАК Владелец в псевдониме поля, СКД может попытаться сопоставить его со служебными механизмами платформы (например, для построения иерархических связей или автоматического определения владельца набора данных).
Решение: Назначение уникального псевдонима
Проанализируем имена полей в нашем запросе и заменим стандартный псевдоним на уникальный, который гарантированно не пересекается с ключевыми словами платформы:
ВЫБРАТЬ
ВТ_Конечная.Ссылка КАК Ссылка,
ВТ_Конечная.Объект КАК Объект,
ВТ_Конечная.Модель КАК Модель,
ВТ_Конечная.Модель.Владелец КАК МодельВладелец
ИЗ
ВТ_Конечная КАК ВТ_Конечная
После переименования поля в МодельВладелец конфликт имен в метаданных СКД будет исчерпан.
---
Очень часто разработчик исправляет запрос в Конфигураторе, запускает отчет в режиме «1С:Предприятие», но снова видит старую ошибку «Поле не найдено». Причина кроется в механизме кэширования настроек.
Платформа 1С сохраняет структуру колонок, группировок и выбранных полей, которые пользователь настраивал в режиме «1С:Предприятие» (в системном хранилище настроек). Если структура запроса изменилась, сохраненный кэш настроек пытается сопоставить старые пути к данным с новыми полями, что приводит к ложным ошибкам.
Решение: Сброс настроек до стандартных
Для того чтобы применить изменения в структуре полей «чистыми», выполним следующие действия в режиме «1С:Предприятие»:
Это полностью очистит пользовательский кэш для данного отчета и заново инициализирует схему компоновки данных на основе вашей новой структуры запроса.
---
Если отчет отлично работает под полными правами (например, у администратора), но падает с ошибкой «Поле не найдено» у обычного пользователя, дело почти наверняка в RLS (Row-Level Security).
Если у пользователя нет прав на чтение справочника, который является владельцем справочника «Модели», система безопасности платформы «на лету» исключает это поле из выборки. СКД не получает данные по этому полю и выдает стандартное сообщение о том, что поле не найдено.
Решение: Проверка прав доступа
---
Мы подробно разобрали все возможные причины возникновения ошибки «Поле не найдено "Владелец"» при работе с временными таблицами в СКД. Для обеспечения максимальной отказоустойчивости и высокой производительности отчетов придерживайтесь правила: не использовать разыменование через точку во временных таблицах, заменяя его явными левыми соединениями и контролируя уникальность псевдонимов полей.