При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда запрос, идеально работающий в консоли запросов, выдает ошибку «Поле не найдено» при запуске самого отчета. Особенно часто это происходит при попытке выполнить ЛЕВОЕ СОЕДИНЕНИЕ справочника (например, Номенклатура) с виртуальной таблицей остатков регистра накопления. Давайте вместе разберем причины этого поведения и найдем способы решения проблемы.
Рассмотрим типовую структуру запроса, которая вызывает подобные затруднения. В данном примере мы хотим получить полный список номенклатуры и привязать к ней остатки по организациям и складам:
ВЫБРАТЬ
СправочникНоменклатура.Ссылка КАК Ссылка,
ТоварыОрганизацийОстатки.Организация КАК Организация,
ТоварыОрганизацийОстатки.Склад КАК Склад,
СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки(&Период, {(Склад = &Склад)}) КАК ТоварыОрганизацийОстатки
ПО (ТоварыОрганизацийОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
ГДЕ
НЕ СправочникНоменклатура.ЭтоГруппа
СГРУППИРОВАТЬ ПО
СправочникНоменклатура.Ссылка,
ТоварыОрганизацийОстатки.Организация,
ТоварыОрганизацийОстатки.Склад
На первый взгляд запрос корректен. Однако при настройке группировки по полю Организация в настройках отчета, СКД может выдать ошибку. Проанализируем основные причины, по которым это происходит.
Самая распространенная причина кроется в специфике работы ЛЕВОГО СОЕДИНЕНИЯ. Когда для конкретной позиции номенклатуры в регистре нет остатков, поля Организация и Склад принимают значение NULL. Система компоновки данных при генерации итогового запроса должна точно понимать тип данных каждого поля.
Если поле Организация содержит NULL, СКД иногда не может корректно определить тип этого поля для строк, где данные отсутствуют. Выясним, как это исправить. Мы должны гарантировать системе, что поле всегда будет иметь определенный тип. Для этого используем функцию ЕСТЬNULL, подставляя пустую ссылку соответствующего типа.
Модернизируем наш запрос:
ВЫБРАТЬ
СправочникНоменклатура.Ссылка КАК Ссылка,
ЕСТЬNULL(ТоварыОрганизацийОстатки.Организация, ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)) КАК Организация,
ЕСТЬNULL(ТоварыОрганизацийОстатки.Склад, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Склад,
СУММА(ЕСТЬNULL(ТоварыОрганизацийОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
...
Важно: После использования ЕСТЬNULL в блоке ВЫБРАТЬ, не забудьте обновить поля в блоке СГРУППИРОВАТЬ ПО, иначе запрос станет синтаксически неверным.
Система компоновки данных опирается на метаданные. Перейдем на закладку «Наборы данных» в схеме СКД и обратим внимание на колонку «Роли». Для полей, приходящих из виртуальных таблиц остатков, СКД должна понимать их назначение.
Разберем по шагам настройку ролей:
Организация в списке полей набора данных.ТоварыОрганизаций).Если СКД автоматически не определила роль поля как измерение, она может исключить его из обработки при попытке построения сложных иерархических группировок, что и приведет к ошибке «Поле не найдено».
В современных конфигурациях 1С (УТ 11, Розница, ERP) многие поля и объекты метаданных управляются через функциональные опции. Рассмотрим ситуацию: если в константах системы выключен учет по организациям (или по складам), платформа может динамически «вырезать» эти поля из запросов СКД на уровне исполнения.
Выясним причины такого поведения:
Организация может быть привязано к функциональной опции, которая в текущий момент ложна.Проанализируем составные типы. Если измерение Склад или Организация имеет составной тип данных, и на один из типов у пользователя нет прав или этот тип отключен функциональной опцией, СКД может выдать ошибку «Поле не найдено» при попытке обращения к этому полю в группировках.
Флаг «Автозаполнение» в конструкторе СКД — это мощный инструмент, который сам расставляет роли, связи и параметры. Однако при использовании сложных соединений он может ошибаться. Посмотрим, как проверить этот момент:
Попробуем на время отключить «Автозаполнение» в наборе данных и вручную прописать все доступные поля на вкладке «Поля». Если после ручной настройки ошибка исчезла — значит, алгоритм автоматического анализа запроса неверно интерпретировал структуру вашего левого соединения.
Даже если пользователь работает под полными правами, в некоторых конфигурациях механизмы RLS (Record Level Security) продолжают накладывать свои фильтры. Рассмотрим ситуацию, когда поле Организация используется в условиях ограничения доступа.
Если RLS-запрос внутри платформы построен таким образом, что он не может быть применен к виртуальной таблице остатков в контексте данного отчета, поле может «исчезнуть» из выборки. Чтобы проверить эту версию, попробуйте упростить запрос до минимума, оставив только выборку из регистра без соединений. Если поле появится — проблема в связи, если нет — в правах или функциональных опциях.
Для устранения ошибки «Поле не найдено "Организация"» рекомендуем придерживаться следующего алгоритма действий:
ЕСТЬNULL для полей, которые могут быть не заполнены в результате левого соединения.Организация и Склад помечены как «Измерения» в настройках набора данных СКД.{...} для передачи параметров в виртуальную таблицу, убедитесь, что имена параметров внутри скобок строго соответствуют именам полей в схеме компоновки.Соблюдение этих правил позволит вам создавать стабильные и отказоустойчивые отчеты, которые не будут «терять» поля при изменении настроек или данных в системе.