В практике разработчика 1С нередко возникает ситуация, когда стабильно работающий отчет на базе Системы компоновки данных (СКД) внезапно перестает формироваться после обновления конфигурации или смены версии платформы. Одной из наиболее коварных ошибок является сообщение «Поле не найдено "Номенклатура.ЭтоГруппа"» (или аналогичное для других реквизитов), особенно когда отчет не подвергался программным изменениям. Рассмотрим детально, почему это происходит и как исправить проблему, используя возможности платформы.
Проанализируем ситуацию, описанную в теме. Основным триггером проблемы стало изменение режима совместимости конфигурации с версии 8.3.14 на 8.3.16. Начиная с версии платформы 8.3.15, разработчики фирмы «1С» внедрили механизм агрессивной оптимизации состава полей в запросах, генерируемых компоновщиком макета СКД.
Суть изменений заключается в следующем: компоновщик макета теперь считает задействованными поля, используемые в «Условном оформлении», только в том случае, если этот элемент оформления применяется хотя бы к одному конкретному полю из списка выбранных. Если в элементе условного оформления список Оформляемые поля пуст (что по умолчанию трактуется как «оформлять все доступные поля»), СКД в новых режимах совместимости может «решить», что поле, участвующее только в условии (отборе) оформления, не является обязательным для выборки. В результате поле Номенклатура.ЭтоГруппа просто не включается в итоговый SQL-запрос к базе данных, и при попытке применить оформление система выдает ошибку о его отсутствии.
Разберем самый быстрый способ «оживить» отчет, который часто помогает без вмешательства в структуру запроса. Как было замечено в обсуждении, ошибка пропадает, если в настройках условного оформления явно указать поля, к которым оно должно применяться.
Номенклатура.ЭтоГруппа).Номенклатура, Количество и т.д.).Этот шаг заставляет компоновщик осознать связь между условием и выводимыми данными, принудительно включая реквизиты из условия в выборку. Однако этот метод не всегда удобен, если оформление должно применяться ко всей строке целиком.
Более системный подход заключается в настройке самой схемы компоновки данных в конфигураторе. Проанализируем возможности закладки Наборы данных. У каждого поля в СКД есть набор свойств, которые управляют его поведением при компоновке результата.
Найдем в списке полей нашу Номенклатуру или ее реквизит ЭтоГруппа. В колонке «Роль» или через контекстное меню свойств поля можно установить флаг «Обязательное» (в англоязычном интерфейсе — Always Selected). Рассмотрим, что это дает:
Часто ошибка «Поле не найдено» при обращении «через точку» (например, Номенклатура.ЭтоГруппа) связана с тем, что СКД пытается минимизировать количество соединений таблиц. Если мы используем обращение к реквизиту ссылки, платформа вынуждена делать LEFT JOIN к таблице справочника номенклатуры.
Посмотрим на пример оптимизации запроса. Вместо того чтобы полагаться на автоматическое извлечение реквизита платформой, мы можем явно выбрать его в основном тексте запроса набора данных:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
Продажи.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи
После такого изменения в настройках условного оформления следует использовать не Номенклатура.ЭтоГруппа, а непосредственно поле набора данных ЭтоГруппа. Платформа гораздо стабильнее работает с плоскими полями набора данных, так как они считаются «родными» для текущей выборки.
Проанализируем ситуацию, когда отчет строится по группировке «Номенклатура (иерархия)». При включении иерархии СКД выполняет дополнительные запросы для получения родительских записей. В режимах совместимости выше 8.3.14 алгоритм построения иерархических связей стал более чувствительным к составу полей.
Если вы используете условие Номенклатура.ЭтоГруппа Равно Нет для оформления детальных записей в иерархическом списке, убедитесь, что само поле Номенклатура присутствует в выбранных полях компоновки. Если группировка ведется по иерархии, но в «Выбранных полях» самой номенклатуры нет (например, выводятся только ресурсы), компоновщик может исключить реквизиты номенклатуры из макета, что и приведет к обсуждаемой ошибке.
Для предотвращения подобных ошибок при обновлении программ на базе 1С (таких как КА 2.4, ERP или УТ 11) рекомендуется придерживаться следующих правил разработки отчетов на СКД:
8.3.15) всегда проверяйте работоспособность внешних отчетов с иерархией и сложным условным оформлением.Обязательное для ключевых полей, на которых завязана логика оформления или расчета, чтобы обезопасить отчет от излишне агрессивной оптимизации компоновщика.Таким образом, проблема «Поле не найдено» — это не баг конфигурации, а следствие развития механизмов оптимизации платформы 1С. Понимание принципов работы компоновщика макета позволяет быстро устранять такие инциденты и создавать отказоустойчивые отчеты.