Почему возникает ошибка "Поле объекта не найдено" для реквизита "Родитель" в 1С:УТ11 и как ее исправить?

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

При работе в системе 1С:Предприятие, особенно с конфигурациями на управляемых формах, пользователи могут столкнуться с неожиданной ошибкой: "Поле объекта не обнаружено". Эта ошибка может проявиться при попытке программного обращения к элементам формы, которые, казалось бы, должны присутствовать. Рассмотрим подробнее случай, описанный на форуме, когда такая ошибка возникла для реквизита Родитель справочника РассылкиОтчетов в конфигурации 1С:Управление торговлей 11 (УТ11).

Представим ситуацию: пользователь открывает форму элемента справочника РассылкиОтчетов, и в коде формы, при попытке обратиться к Элементы.Родитель, система выдает ошибку. При этом, под полными правами все работает корректно, что сразу указывает на проблему с правами доступа. Давайте разберем, почему так происходит и как устранить эту ошибку.

Причина 1: Динамическое изменение формы платформой 1С на основе прав

Платформа "1С:Предприятие" обладает мощным механизмом, который автоматически управляет видимостью и доступностью элементов на форме в зависимости от прав текущего пользователя. Если у пользователя нет прав на просмотр или редактирование определенного реквизита объекта, то соответствующий ему элемент на форме (например, поле ввода, гиперссылка) может быть автоматически:

  1. Скрыт (удален из коллекции элементов формы).
  2. Сделан недоступным (серым, неактивным).

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

Диагностика проблемы с помощью отладчика

Чтобы убедиться, что элемент действительно исчезает, а не просто становится недоступным, мы можем воспользоваться отладчиком:

  1. Установим точку остановки в том месте кода формы, где происходит обращение к Элементы.Родитель.
  2. Запустим программу под пользователем с ограниченными правами.
  3. Когда выполнение остановится на точке, исследуем коллекцию Элементы формы. Мы можем обнаружить, что элемента с именем Родитель там нет вовсе, что подтверждает его динамическое удаление платформой (как это было отмечено в сообщениях 4 и 6: "Поставил , не пойму ,как это элемент формы как бы изчезает .", "Причем другие элементы доступны ,в отладчике").

Причина 2: Специфика работы ролей в расширениях

Работа с ролями в расширениях конфигурации имеет ключевую особенность, которая часто становится причиной подобных проблем с правами доступа:

  1. Пока в расширении нет ни одной собственной роли, все созданные в нем объекты (справочники, документы и т.д.) доступны пользователям в соответствии с ролями основной конфигурации. Это означает, что если в основной конфигурации есть роль, дающая доступ к определенному типу объектов, то объекты, созданные в расширении, которые относятся к этому же типу (например, новый реквизит в существующем справочнике), будут доступны по этой основной роли.
  2. Как только в расширение добавляется хотя бы одна собственная роль, доступ ко всем объектам этого расширения для всех пользователей по умолчанию запрещается. Чтобы пользователи могли видеть и работать с объектами из расширения, им необходимо явным образом назначить роли из этого расширения или заимствованные в расширение роли основной конфигурации с установленными правами на новые объекты.

В описанной на форуме ситуации, скорее всего, роль, созданная или измененная в расширении, не давала всех необходимых прав (например, прав на чтение групп справочника РассылкиОтчетов или самого реквизита Родитель). Мы выясним, что решение, к которому пришел автор (сообщение 2: "Решил вопрос, добавив в профиль стандартную роль из конфигурации и из расширения тоже."), является правильной практикой:

Необходимо убедиться, что для пользователя назначены все роли, которые в совокупности дают полный набор прав на все используемые объекты и реквизиты, включая те, что добавлены или изменены в расширении. Иногда бывает, что роли могут "слетать" из профиля пользователя, или при обновлении прав не все изменения корректно применяются. Поэтому важно проверить настройки профилей и ролей (как это предлагает сообщение 8).

Причина 3: Ограничение доступа на уровне записей (RLS)

Ограничение доступа на уровне записей (RLS) — это мощный механизм, который позволяет ограничивать доступ пользователей не только к объектам в целом, но и к отдельным записям этих объектов. Фрагмент кода RLS, найденный в стандартной роли к справочнику РассылкиОтчетов (сообщение 10), является важной подсказкой:


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
РассылкиОтчетов ГДЕ (РассылкиОтчетов.Автор = &ТекущийПользователь ИЛИ РассылкиОтчетов.Личная = ЛОЖЬ ИЛИ РассылкиОтчетов.ЭтоГруппа = ИСТИНА)
#КонецЕсли

Проанализируем этот код:

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

В иерархических справочниках "родителем" может быть только элемент, который является группой. Если из-за настроек прав доступа и правил RLS пользователю не доступна для чтения ни одна группа в этом справочнике (например, нет групп, автором которых он является, и нет неличных групп), то платформа может посчитать, что реквизит Родитель бессмысленен, так как выбирать все равно не из чего, и скрыть его с формы. В этом случае, даже если общие права на справочник есть, RLS "отфильтровывает" все возможные варианты для выбора родителя.

Комплексное решение проблемы

Чтобы решить проблему "Поле объекта не обнаружено" для реквизита Родитель, мы рекомендуем выполнить следующие шаги:

  1. Проверим и назначим необходимые права на справочник и его реквизиты

    Убедимся, что у профиля пользователя есть полные права на чтение, изменение и добавление для справочника РассылкиОтчетов. Особое внимание уделим правам на сам реквизит Родитель, а также на возможность чтения элементов-групп в этом справочнике.

  2. Проанализируем и настроим роли в расширениях

    Если справочник РассылкиОтчетов или его функциональность каким-либо образом модифицированы или расширены через расширение конфигурации, выполним следующее:

    1. Убедимся, что в профиль пользователя добавлены все необходимые роли: как из основной конфигурации (стандартные роли, которые предоставляют базовый доступ к объектам), так и из всех используемых расширений.
    2. Проверим права в ролях расширения. Возможно, роль в расширении была создана, но в ней не были явно установлены права на чтение, изменение или использование справочника РассылкиОтчетов и его реквизитов. Нам нужно будет открыть эту роль в конфигураторе расширения и убедиться, что все необходимые права установлены.
    3. В некоторых случаях может потребоваться заимствовать стандартную роль из основной конфигурации в расширение и затем расширить ее правами на новые объекты или модифицированные реквизиты, а уже эту заимствованную роль добавить в профиль пользователя.
  3. Изучим ограничения RLS

    Мы выясним, нет ли в ролях, назначенных пользователю, ограничений RLS, которые запрещают ему просматривать группы справочника РассылкиОтчетов. Для этого:

    1. Откроем конфигуратор и перейдем в раздел Роли.
    2. Найдем роли, связанные со справочником РассылкиОтчетов, и изучим вкладку Ограничения доступа к данным для этого справочника.
    3. Проанализируем текст RLS (например, приведенный выше код) и убедимся, что условия позволяют пользователю видеть хотя бы некоторые элементы, которые являются группами, чтобы реквизит Родитель имел смысл и мог быть отображен платформой. Если все группы скрыты RLS, нам потребуется скорректировать условия RLS или структуру данных.

Дополнительные аспекты, которые следует проверить

Помимо основных причин, существуют и другие факторы, которые могут влиять на появление данной ошибки:

  1. Очистка кэша настроек пользователя

    Иногда у конкретного пользователя в кэше сохраняются устаревшие настройки формы. Например, форма была изменена, реквизит удален или его тип изменен, но старая версия настроек формы осталась в кэше. В этом случае мы можем попробовать очистить кэш клиента 1С или сбросить настройки формы для данного пользователя (через меню Все действия -> Изменить форму или Стандартные настройки).

  2. Ошибки после обновления

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

    • Тестирование и исправление информационной базы (в режиме Конфигуратора, меню Администрирование -> Тестирование и исправление...).
    • Проверка на наличие более актуальных обновлений платформы или конфигурации.

Мы видим, что ошибка "Поле объекта не обнаружено" для реквизита Родитель, как правило, указывает на комплексную проблему, связанную с правами доступа, особенностями работы расширений и ограничениями RLS. Системный подход к диагностике и устранению этих причин позволяет успешно решить данную проблему.

← На главную