Ошибка «Поле не найдено» в Системе компоновки данных (СКД) — одна из самых коварных проблем, с которыми сталкивается разработчик 1С. Она может возникнуть даже тогда, когда поле визуально присутствует в наборе данных, выбрано в группировках и добавлено в макет. Рассмотрим подробно причины возникновения этой ошибки и разберем по шагам способы их устранения на примере реальных кейсов из практики разработки в среде 1С:Управление торговлей 11.
Проанализируем ситуацию: часто ошибка возникает при обращении к реквизитам справочников, которые имеют иерархическую структуру (например, Номенклатура). У элементов справочника реквизит (например, ТоварнаяГруппа) заполнен, а у групп (папок) — нет, либо он физически не предусмотрен для типа «Группа».
Выясним причину: СКД при попытке построить отчет по иерархии или при включении групп в выборку может «потерять» поле, если оно не определено для всех записей результата запроса. Чтобы побороть это, нам необходимо явно обработать проверку на группу в тексте запроса. Рассмотрим пример правильного написания конструкции ВЫБОР:
ВЫБРАТЬ
ВЫБОР
КОГДА СпрНоменклатура.ЭтоГруппа
ТОГДА ЗНАЧЕНИЕ(Справочник.ТоварныеГруппы.ПустаяСсылка)
ИНАЧЕ СпрНоменклатура.ТоварнаяГруппа
КОНЕЦ КАК ТоварнаяГруппа,
СпрНоменклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
Если группы в отчете не нужны вовсе, проанализируем условие ГДЕ. Достаточно добавить фильтр ГДЕ НЕ СпрНоменклатура.ЭтоГруппа, чтобы исключить пустые значения реквизитов, характерные для папок, и ошибка исчезнет.
В современных конфигурациях (УТ 11, ERP, КА 2) многие реквизиты жестко привязаны к функциональным опциям. Это одна из самых неочевидных причин. Если в настройках программы отключена определенная подсистема (например, ордерные склады или использование товарных групп), платформа 1С автоматически исключает связанные поля из всех запросов СКД на уровне платформенного движка.
Посмотрим на ситуацию: разработчик видит поле в конфигураторе, но в режиме «Предприятие» СКД сообщает, что поле не найдено. Проверим настройки программы. Например, если вы используете поле ТоварнаяГруппа, убедитесь, что в базе включена соответствующая опция. Как только функционал будет активирован (например, склад станет ордерным или будет включен учет по группам), СКД «увидит» поле, и отчет заработает корректно.
Иногда проблема кроется не в коде, а в кэше сохраненных настроек. Система компоновки данных сохраняет пользовательские настройки (варианты отчета). Если вы изменили структуру набора данных или переименовали поле, старые настройки могут продолжать ссылаться на несуществующий путь к данным.
Рассмотрим, как это исправить:
Отчет в конфигураторе. Это принудит систему создать новую запись в кэше настроек, очистив старые «хвосты».Довольно распространенная техническая ошибка при написании сложных запросов. Выясним, как ведет себя СКД: если ваш запрос состоит из нескольких частей, создающих временные таблицы, но в конце отсутствует финальный блок ВЫБРАТЬ из этих таблиц, СКД не поймет, какие именно данные нужно выводить в отчет.
Убедимся, что ваш запрос не заканчивается созданием временной таблицы:
// ОШИБКА: Запрос заканчивается созданием ВТ
ВЫБРАТЬ Номенклатура, Количество ПОМЕСТИТЬ ВТ_Данные ИЗ РегистрНакопления.Запасы;
// ПРАВИЛЬНО: Должна быть итоговая выборка
ВЫБРАТЬ Номенклатура, Количество ИЗ ВТ_Данные
Если вы модифицируете схему компоновки программно в модуле отчета (например, в событии ПриКомпоновкеРезультата), обратите внимание на свойство АвтоЗаполнениеДоступныхПолей. Если вы вручную дописываете поля в текст запроса, но забываете добавить их в Поля набора данных схемы, СКД выдаст ошибку.
Проанализируем ситуацию: путь к данным в настройках (Settings) должен строго соответствовать пути к данным в самой схеме (Schema). Если вы программно добавили поле в запрос, обязательно вызовите обновление состава полей набора данных или добавьте их вручную в коллекцию Поля.
Рассмотрим еще несколько нюансов, которые могут приводить к ошибке «Поле не найдено»:
Объект (Таблица значений) проверьте соответствие имен колонок в ТЗ и имен полей в СКД. Регистр имен имеет значение!ДокументОснование.Склад, а ДокументОснование имеет составной тип, убедитесь, что у всех возможных типов документов есть реквизит Склад. В противном случае используйте ВЫРАЗИТЬ(ДокументОснование КАК Документ.РеализацияТоваровУслуг).Склад.Подводя итог, можно сказать, что решение проблемы всегда начинается с анализа иерархии данных и проверки функциональных опций конфигурации. В большинстве случаев ошибка лечится либо явным указанием ВЫБОР в запросе для обработки NULL и групп, либо простым сбросом настроек пользователя.