Почему в СКД возникает ошибка Поле не найдено Номенклатура.ЭтоГруппа после обновления и как ее исправить?

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

В практике разработчика 1С нередко возникает ситуация, когда стабильно работающий отчет на базе Системы компоновки данных (СКД) внезапно перестает формироваться после обновления конфигурации или смены версии платформы. Одной из наиболее коварных ошибок является сообщение «Поле не найдено "Номенклатура.ЭтоГруппа"» (или аналогичное для других реквизитов), особенно когда отчет не подвергался программным изменениям. Рассмотрим детально, почему это происходит и как исправить проблему, используя возможности платформы.

Выясняем причину: влияние режима совместимости и оптимизация СКД

Проанализируем ситуацию, описанную в теме. Основным триггером проблемы стало изменение режима совместимости конфигурации с версии 8.3.14 на 8.3.16. Начиная с версии платформы 8.3.15, разработчики фирмы «1С» внедрили механизм агрессивной оптимизации состава полей в запросах, генерируемых компоновщиком макета СКД.

Суть изменений заключается в следующем: компоновщик макета теперь считает задействованными поля, используемые в «Условном оформлении», только в том случае, если этот элемент оформления применяется хотя бы к одному конкретному полю из списка выбранных. Если в элементе условного оформления список Оформляемые поля пуст (что по умолчанию трактуется как «оформлять все доступные поля»), СКД в новых режимах совместимости может «решить», что поле, участвующее только в условии (отборе) оформления, не является обязательным для выборки. В результате поле Номенклатура.ЭтоГруппа просто не включается в итоговый SQL-запрос к базе данных, и при попытке применить оформление система выдает ошибку о его отсутствии.

Способ 1. Явное указание оформляемых полей

Разберем самый быстрый способ «оживить» отчет, который часто помогает без вмешательства в структуру запроса. Как было замечено в обсуждении, ошибка пропадает, если в настройках условного оформления явно указать поля, к которым оно должно применяться.

  1. Перейдем в настройки варианта отчета на закладку «Условное оформление».
  2. Найдем проблемный элемент оформления (где в условии используется Номенклатура.ЭтоГруппа).
  3. В колонке «Оформляемые поля» вместо пустого списка добавим те поля, которые фактически должны менять свой вид (например, Номенклатура, Количество и т.д.).

Этот шаг заставляет компоновщик осознать связь между условием и выводимыми данными, принудительно включая реквизиты из условия в выборку. Однако этот метод не всегда удобен, если оформление должно применяться ко всей строке целиком.

Способ 2. Использование свойства Обязательное в наборе данных

Более системный подход заключается в настройке самой схемы компоновки данных в конфигураторе. Проанализируем возможности закладки Наборы данных. У каждого поля в СКД есть набор свойств, которые управляют его поведением при компоновке результата.

Найдем в списке полей нашу Номенклатуру или ее реквизит ЭтоГруппа. В колонке «Роль» или через контекстное меню свойств поля можно установить флаг «Обязательное» (в англоязычном интерфейсе — Always Selected). Рассмотрим, что это дает:

Способ 3. Получение поля напрямую в запросе

Часто ошибка «Поле не найдено» при обращении «через точку» (например, Номенклатура.ЭтоГруппа) связана с тем, что СКД пытается минимизировать количество соединений таблиц. Если мы используем обращение к реквизиту ссылки, платформа вынуждена делать LEFT JOIN к таблице справочника номенклатуры.

Посмотрим на пример оптимизации запроса. Вместо того чтобы полагаться на автоматическое извлечение реквизита платформой, мы можем явно выбрать его в основном тексте запроса набора данных:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
    Продажи.КоличествоОборот КАК Количество
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи

После такого изменения в настройках условного оформления следует использовать не Номенклатура.ЭтоГруппа, а непосредственно поле набора данных ЭтоГруппа. Платформа гораздо стабильнее работает с плоскими полями набора данных, так как они считаются «родными» для текущей выборки.

Особенности работы с иерархией

Проанализируем ситуацию, когда отчет строится по группировке «Номенклатура (иерархия)». При включении иерархии СКД выполняет дополнительные запросы для получения родительских записей. В режимах совместимости выше 8.3.14 алгоритм построения иерархических связей стал более чувствительным к составу полей.

Если вы используете условие Номенклатура.ЭтоГруппа Равно Нет для оформления детальных записей в иерархическом списке, убедитесь, что само поле Номенклатура присутствует в выбранных полях компоновки. Если группировка ведется по иерархии, но в «Выбранных полях» самой номенклатуры нет (например, выводятся только ресурсы), компоновщик может исключить реквизиты номенклатуры из макета, что и приведет к обсуждаемой ошибке.

Резюме и рекомендации

Для предотвращения подобных ошибок при обновлении программ на базе 1С (таких как КА 2.4, ERP или УТ 11) рекомендуется придерживаться следующих правил разработки отчетов на СКД:

  1. При переходе на новые версии платформы и повышении режима совместимости (особенно выше 8.3.15) всегда проверяйте работоспособность внешних отчетов с иерархией и сложным условным оформлением.
  2. Старайтесь избегать обращений «через точку» в условиях оформления, если эти поля можно вытащить напрямую в запросе.
  3. Используйте свойство Обязательное для ключевых полей, на которых завязана логика оформления или расчета, чтобы обезопасить отчет от излишне агрессивной оптимизации компоновщика.
  4. Если ошибка возникла внезапно, первым делом попробуйте явно заполнить список «Оформляемые поля» в настройках проблемного элемента.

Таким образом, проблема «Поле не найдено» — это не баг конфигурации, а следствие развития механизмов оптимизации платформы 1С. Понимание принципов работы компоновщика макета позволяет быстро устранять такие инциденты и создавать отказоустойчивые отчеты.

← На главную