В практике администрирования и доработки конфигураций на платформе 1С:Предприятие часто встречается ситуация, когда отчет, прекрасно работающий у администратора, выдает ошибку компоновки данных у рядового пользователя. Одной из наиболее распространенных ошибок является сообщение вида "Поле не обнаружено". Рассмотрим подробнее этот случай на примере конфигурации "Бухгалтерия сельскохозяйственного предприятия" (БСХП) и отчета "Карта структуры посевных площадей".
Ситуация выглядит следующим образом: в коде при получении настроек компоновщика поле присутствует, администратор видит его в доступных полях, пользователь имеет права на просмотр соответствующего справочника (в данном случае "Географические объекты"), но при формировании отчета система выдает ошибку.
Давайте разберем причины такого поведения и способы решения проблемы, опираясь на особенности работы Системы Компоновки Данных (СКД) и механизмы разграничения прав доступа.
В исходном коде, который выполняется в привилегированном режиме или под администратором, настройки получаются корректно:
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// В коллекции "Настройки" существуют поля: Гектары, Координаты, ГеографическийОбъект
Однако у пользователя возникает ошибка. Тот факт, что пользователь может открыть справочник ГеографическиеОбъекты через интерфейс, сбивает с толку, так как создает иллюзию наличия полных прав. На самом деле механизм видимости полей в СКД работает сложнее, чем просто проверка права "Просмотр" на ссылку справочника.
В современных типовых и отраслевых решениях (ERP, КА, БСХП) видимость реквизитов, справочников и документов часто управляется не только ролями, но и Функциональными опциями.
Рассмотрим, как это работает:
ИспользоватьАгрохимическийУчет или ВестиУчетПоПолям).В контексте СКД это означает, что при инициализации схемы компоновки данных платформа "вырезает" поля, отключенные функциональными опциями. Когда отчет пытается наложить отбор или группировку по полю ГеографическийОбъект, он его физически не находит в доступной схеме пользователя.
Решение: Проверим в конфигураторе, входит ли справочник "Географические объекты" в состав какой-либо функциональной опции. Убедимся, что роль пользователя дает право чтения объектов, определяющих значение этой опции (обычно это константы).
Наличие права на просмотр справочника (права на таблицу) не гарантирует права на чтение всех его полей. Если в запросе отчета используется обращение к конкретным реквизитам (например, координаты полигона, площадь, кадастровый номер), а у пользователя нет прав на просмотр именно этих реквизитов, СКД исключит все поле целиком, чтобы избежать ошибки доступа к данным.
Проанализируем ситуацию:
ГеографическиеОбъекты может быть доступен бухгалтеру, но реквизиты, хранящие геометрию (координаты), могут быть закрыты ролью "Чтение данных ГИС" или "Агроном".Если отчет пытается вывести поле, составленное из реквизитов, к которым нет доступа, возникает ошибка "Поле не обнаружено".
Решение: Проверим роли пользователя. Попробуем добавить профиль, связанный с агрономией или работой с картами. Также полезно заглянуть в Журнал регистрации на предмет ошибок AccessDenied (Отказ в доступе) при формировании отчета.
Это одна из самых частых и неочевидных проблем. Пользователь мог сохранить вариант отчета или его настройки в тот момент, когда конфигурация была другой, или когда у него были другие права. Либо структура отчета обновилась с релизом (как в сообщении упоминается версия 3.0.174.30), а пользовательские настройки ссылаются на старые идентификаторы полей.
При формировании отчета 1С пытается применить сохраненные настройки (отборы, группировки, выбранные поля) к текущей схеме. Если в сохраненных настройках есть ссылка на поле, которое теперь недоступно (или называется иначе во внутренней структуре), возникает ошибка.
Решение: Выполним очистку настроек. Для этого в форме отчета нужно:
В сложных запросах СКД, если используется соединение с таблицей, к которой у пользователя полностью закрыт доступ через RLS (Record Level Security), оптимизатор запросов может исключить эту таблицу, и, как следствие, поля из нее станут недоступны.
Например, поле ГеографическийОбъект может подтягиваться не напрямую, а через регистр сведений (например, ПлощадиПолей). Если RLS настроен так, что пользователь не видит записей в этом регистре, поле может "исчезнуть".
Чтобы точно определить причину и устранить неисправность, выполним следующую последовательность действий:
Шаг 1. Проверка под полными правами
Как верно замечено в обсуждении, первым делом проверим работу отчета под пользователем с полными правами. Если под администратором отчет формируется корректно, значит проблема 100% в правах доступа или функциональных опциях.
Шаг 2. Сброс настроек
Попросим пользователя установить стандартные настройки отчета. Это исключит влияние "битого" кэша настроек.
Шаг 3. Анализ Журнала регистрации
Посмотрим журнал регистрации событий в момент формирования отчета. Фильтруем по событию "Отказ в доступе". Если видим ошибки доступа к константам — это функциональные опции. Если к реквизитам справочника — это нехватка ролей.
Шаг 4. Проверка Функциональных опций
Откроем конфигуратор. Найдем справочник ГеографическиеОбъекты. На вкладке "Дополнительно" или в свойствах посмотрим, привязан ли он к какой-либо ФункциональнойОпции. Если да — найдем эту опцию в дереве метаданных, посмотрим её "Хранение" (обычно Константа) и проверим, есть ли у роли пользователя права на чтение этой константы.
Шаг 5. Добавление ролей
Если конфигурация отраслевая (БСХП), часто права разбиты очень дробно. Попробуем добавить пользователю роль "Чтение нормативно-справочной информации по растениеводству" или аналогичную. В типовых конфигурациях для доступа к картам иногда требуется отдельная роль "Использование карт".
Иногда программисты пытаются решить проблему, принудительно добавляя права в коде или выполняя запрос в привилегированном режиме.
УстановитьПривилегированныйРежим(Истина);
// Формирование отчета
Однако для СКД это работает плохо, так как компоновка макета происходит в контексте прав текущего пользователя. Правильный подход — настройка ролей (Роли). Убедитесь, что пользователю назначены профили групп доступа, соответствующие его бизнес-функции (в данном случае работа с картами и полями).
Ошибка "Поле не обнаружено" при наличии прав на объект чаще всего указывает на работу механизма Функциональных опций или сохранение некорректных пользовательских настроек. В редких случаях — это ограничение прав на конкретные реквизиты объекта. Последовательная проверка этих гипотез позволит быстро вернуть работоспособность отчета.