При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда новый функционал идеально работает под полными правами, но вызывает критические ошибки у обычных пользователей. Рассмотрим типичный сценарий: в расширении к справочнику (например, Контрагенты) добавлены новые реквизиты, они выведены на форму, и к ним идет обращение через программный код. Однако при попытке открытия формы пользователем с ограниченными правами система выдает ошибку: «Поле объекта не обнаружено», указывая на имя элемента формы.
В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм отображения элементов формы в зависимости от прав доступа и как правильно настроить роли в расширении, чтобы сохранить безопасность данных и стабильность работы системы.
Проанализируем ситуацию, которая часто вводит разработчиков в заблуждение при отладке. Если мы поставим точку останова в коде формы, то увидим, что в структуре Объект наш новый реквизит присутствует и доступен для чтения. Однако при обращении к коллекции Элементы (например, Элементы.Х_СуммаПродажи) мы получаем исключение. Почему так происходит?
Дело в фундаментальном механизме платформы 1С: если у текущего пользователя нет прав на Просмотр конкретного реквизита, платформа автоматически исключает соответствующий элемент управления из коллекции Элементы при генерации формы на стороне сервера. Это происходит из соображений безопасности: пользователь не должен видеть поле, на которое у него нет прав. Поскольку элемента физически нет в коллекции, любое прямое обращение к нему через точку вызывает фатальную ошибку.
Выясним причину отсутствия прав. По умолчанию новые объекты и реквизиты в расширении не доступны никому, кроме пользователей с полными правами. Чтобы исправить это, нам необходимо настроить права доступа внутри самого расширения.
Рассмотрим пошагово, как добавить необходимые права:
Х_ДополнительныеПраваКонтрагенты), нам нужно найти в ней справочник Контрагенты, перейти на закладку Реквизиты и проставить галочки Чтение и Просмотр для наших новых полей.Чтение и Просмотр самому справочнику в этой роли, если планируете назначать её отдельно.После создания роли её необходимо назначить пользователю в режиме «Конфигуратор» или, что более правильно для систем на базе БСП (Библиотека стандартных подсистем), добавить в соответствующий профиль групп доступа в режиме «Предприятие».
Посмотрим на ситуацию глубже. В типовых конфигурациях (УНФ, ERP, УТ) часто используется RLS (разграничение прав на уровне записей). Если мы просто создадим новую роль в расширении и дадим в ней право «Чтение» на справочник без указания условий RLS, мы можем случайно открыть пользователю доступ ко всем контрагентам в базе, нарушив корпоративную политику безопасности.
Поэтому наиболее логичным и безопасным методом будет расширение прав существующей типовой роли. Разберем этот алгоритм:
ДобавлениеИзменениеКонтрагентов).Чтение, Просмотр, Изменение и Редактирование.Таким образом, права на новые поля станут частью стандартного набора прав пользователя, а основные ограничения (RLS) продолжат действовать из основной конфигурации.
Чтобы наш код был устойчив к изменениям прав доступа, крайне рекомендуется избегать прямого обращения к элементам формы через точку. Вместо этого проанализируем использование метода Найти(). Посмотрим на пример безопасного кода:
// Вместо прямого обращения: Элементы.Х_СуммаПродажи.Видимость = Истина;
// Используем безопасный поиск:
ЭлементСумма = Элементы.Найти("Х_СуммаПродажи");
Если ЭлементСумма <> Неопределено Тогда
ЭлементСумма.Видимость = Не Объект.Х_Пенсионер;
КонецЕсли;
Этот подход гарантирует, что если в будущем у какого-то профиля пользователя отберут права на это поле, программа не «вылетит» с ошибкой, а просто пропустит выполнение этого участка кода.
Если ваша конфигурация использует БСП (как в случае с УНФ), простого добавления прав в конфигураторе может быть недостаточно. Выясним, что еще нужно сделать:
Проанализируем еще один важный момент в свойствах самого расширения. В корне дерева метаданных расширения есть свойство «Устанавливать права для новых объектов». Если установить этот флаг, то при добавлении новых реквизитов платформа будет пытаться автоматически назначить права на них во все роли расширения. Однако на практике ручной контроль через заимствованные роли (как описано выше) является более надежным и предсказуемым методом.
Также обратите внимание на свойство «Назначение» расширения. Для корректной работы с формами и правами рекомендуется использовать значение Адаптация или Дополнение. Режим Исправление предназначен для патчей и имеет ряд ограничений при работе с новыми данными.
Подведем итог: ошибка «Поле объекта не обнаружено» — это всегда сигнал о том, что платформа скрыла элемент из-за нехватки прав доступа. Решая эту задачу через расширение типовых ролей и внедрение проверок на существование элемента в коде, мы создаем надежное и безопасное решение, которое не сломается при обновлении основной конфигурации.