При работе в системе 1С:Предприятие, особенно с конфигурациями на управляемых формах, пользователи могут столкнуться с неожиданной ошибкой: "Поле объекта не обнаружено". Эта ошибка может проявиться при попытке программного обращения к элементам формы, которые, казалось бы, должны присутствовать. Рассмотрим подробнее случай, описанный на форуме, когда такая ошибка возникла для реквизита Родитель справочника РассылкиОтчетов в конфигурации 1С:Управление торговлей 11 (УТ11).
Представим ситуацию: пользователь открывает форму элемента справочника РассылкиОтчетов, и в коде формы, при попытке обратиться к Элементы.Родитель, система выдает ошибку. При этом, под полными правами все работает корректно, что сразу указывает на проблему с правами доступа. Давайте разберем, почему так происходит и как устранить эту ошибку.
Платформа "1С:Предприятие" обладает мощным механизмом, который автоматически управляет видимостью и доступностью элементов на форме в зависимости от прав текущего пользователя. Если у пользователя нет прав на просмотр или редактирование определенного реквизита объекта, то соответствующий ему элемент на форме (например, поле ввода, гиперссылка) может быть автоматически:
В нашем случае, когда пользователь с ограниченными правами открывает форму, платформа анализирует его права доступа к справочнику РассылкиОтчетов и его реквизитам. Если по какой-то причине у пользователя нет прав на реквизит Родитель, платформа может полностью удалить этот элемент из коллекции Элементы формы. Соответственно, при попытке программного обращения к Элементы.Родитель в коде формы возникает ошибка, поскольку в коллекции элементов формы такого поля для данного пользователя просто не существует.
Чтобы убедиться, что элемент действительно исчезает, а не просто становится недоступным, мы можем воспользоваться отладчиком:
Элементы.Родитель.Элементы формы. Мы можем обнаружить, что элемента с именем Родитель там нет вовсе, что подтверждает его динамическое удаление платформой (как это было отмечено в сообщениях 4 и 6: "Поставил , не пойму ,как это элемент формы как бы изчезает .", "Причем другие элементы доступны ,в отладчике").Работа с ролями в расширениях конфигурации имеет ключевую особенность, которая часто становится причиной подобных проблем с правами доступа:
В описанной на форуме ситуации, скорее всего, роль, созданная или измененная в расширении, не давала всех необходимых прав (например, прав на чтение групп справочника РассылкиОтчетов или самого реквизита Родитель). Мы выясним, что решение, к которому пришел автор (сообщение 2: "Решил вопрос, добавив в профиль стандартную роль из конфигурации и из расширения тоже."), является правильной практикой:
Необходимо убедиться, что для пользователя назначены все роли, которые в совокупности дают полный набор прав на все используемые объекты и реквизиты, включая те, что добавлены или изменены в расширении. Иногда бывает, что роли могут "слетать" из профиля пользователя, или при обновлении прав не все изменения корректно применяются. Поэтому важно проверить настройки профилей и ролей (как это предлагает сообщение 8).
Ограничение доступа на уровне записей (RLS) — это мощный механизм, который позволяет ограничивать доступ пользователей не только к объектам в целом, но и к отдельным записям этих объектов. Фрагмент кода RLS, найденный в стандартной роли к справочнику РассылкиОтчетов (сообщение 10), является важной подсказкой:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
РассылкиОтчетов ГДЕ (РассылкиОтчетов.Автор = &ТекущийПользователь ИЛИ РассылкиОтчетов.Личная = ЛОЖЬ ИЛИ РассылкиОтчетов.ЭтоГруппа = ИСТИНА)
#КонецЕсли
Проанализируем этот код:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе говорит о том, что если используется универсальное RLS, то оно применяется ко всему объекту, иначе — к конкретному условию.РассылкиОтчетов ГДЕ (РассылкиОтчетов.Автор = &ТекущийПользователь ИЛИ РассылкиОтчетов.Личная = ЛОЖЬ ИЛИ РассылкиОтчетов.ЭтоГруппа = ИСТИНА). Это означает, что пользователь может видеть только те элементы справочника РассылкиОтчетов, для которых выполняется хотя бы одно из следующих условий:
РассылкиОтчетов.Автор = &ТекущийПользователь).РассылкиОтчетов.Личная = ЛОЖЬ), то есть доступна всем.РассылкиОтчетов.ЭтоГруппа = ИСТИНА).В иерархических справочниках "родителем" может быть только элемент, который является группой. Если из-за настроек прав доступа и правил RLS пользователю не доступна для чтения ни одна группа в этом справочнике (например, нет групп, автором которых он является, и нет неличных групп), то платформа может посчитать, что реквизит Родитель бессмысленен, так как выбирать все равно не из чего, и скрыть его с формы. В этом случае, даже если общие права на справочник есть, RLS "отфильтровывает" все возможные варианты для выбора родителя.
Чтобы решить проблему "Поле объекта не обнаружено" для реквизита Родитель, мы рекомендуем выполнить следующие шаги:
Убедимся, что у профиля пользователя есть полные права на чтение, изменение и добавление для справочника РассылкиОтчетов. Особое внимание уделим правам на сам реквизит Родитель, а также на возможность чтения элементов-групп в этом справочнике.
Если справочник РассылкиОтчетов или его функциональность каким-либо образом модифицированы или расширены через расширение конфигурации, выполним следующее:
РассылкиОтчетов и его реквизитов. Нам нужно будет открыть эту роль в конфигураторе расширения и убедиться, что все необходимые права установлены.Мы выясним, нет ли в ролях, назначенных пользователю, ограничений RLS, которые запрещают ему просматривать группы справочника РассылкиОтчетов. Для этого:
Роли.РассылкиОтчетов, и изучим вкладку Ограничения доступа к данным для этого справочника.Родитель имел смысл и мог быть отображен платформой. Если все группы скрыты RLS, нам потребуется скорректировать условия RLS или структуру данных.Помимо основных причин, существуют и другие факторы, которые могут влиять на появление данной ошибки:
Иногда у конкретного пользователя в кэше сохраняются устаревшие настройки формы. Например, форма была изменена, реквизит удален или его тип изменен, но старая версия настроек формы осталась в кэше. В этом случае мы можем попробовать очистить кэш клиента 1С или сбросить настройки формы для данного пользователя (через меню Все действия -> Изменить форму или Стандартные настройки).
Если ошибка появилась после недавнего обновления конфигурации или платформы, это может свидетельствовать о некорректно примененном обновлении или о внутренних ошибках нового релиза. В таких случаях нам помогут:
Администрирование -> Тестирование и исправление...).Мы видим, что ошибка "Поле объекта не обнаружено" для реквизита Родитель, как правило, указывает на комплексную проблему, связанную с правами доступа, особенностями работы расширений и ограничениями RLS. Системный подход к диагностике и устранению этих причин позволяет успешно решить данную проблему.