Почему возникает ошибка при обращении к кнопке формы в 1С и как ее исправить?

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

При разработке и доработке управляемых форм в 1С программисты часто сталкиваются с ситуацией: в процедуре ПриСозданииНаСервере выполняется программная настройка видимости или доступности элементов, однако при входе под пользователем с ограниченными правами система падает с критической ошибкой вида «Поле объекта не обнаружено». При этом под полными правами администратора форма открывается без нареканий, а требуемая кнопка визуально присутствует в конфигураторе и на экране. Разберем по шагам механизм построения управляемой формы, выясним причину такого поведения платформы и рассмотрим безопасные методы работы с элементами.

Причина поведения платформы при формировании состава элементов

Проанализируем ситуацию и внутренние алгоритмы платформы 1С:Предприятие 8.3. Управляемая форма — это динамическая структура, которая генерируется на стороне сервера перед передачей клиенту с учетом контекста текущего сеанса. В состав элементов формы попадают только те элементы управления, на которые у текущего пользователя есть права доступа.

Если кнопка связана не с локальной командой формы, а с объектом метаданных ОбщаяКоманда или командой другого прикладного объекта, платформа проверяет право «Просмотр» для этой команды. Когда у назначенных пользователю ролей отсутствует право на соответствующую общую команду:

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

Аналогичное поведение наблюдается и в других случаях, когда элементы исключаются из формы платформенными механизмами:

  1. Влияние функциональных опций: если реквизит, объект или команда привязаны к функциональной опции, и эта опция отключена в настройках программы, платформа не включает элемент в коллекцию Элементы.
  2. Автоматическая генерация командной панели: при включенном свойстве «Автозаполнение» платформа самостоятельно генерирует системные имена кнопок для общих команд (например, с префиксами вида ФормаОбщаяКоманда_ИмяКоманды), из-за чего прямое обращение по исходному имени объекта метаданных завершается ошибкой.
  3. Параметризуемые команды: если контекст формы или тип текущих данных не соответствует типу параметра общей команды, кнопка не генерируется.
  4. Влияние расширений конфигурации: если в подключенном расширении форма была модифицирована (элемент удален или переименован), базовый код не найдет его в коллекции.

Способ 1. Безопасное обращение к элементам формы через метод Найти

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

Посмотрим на пример безопасного управления видимостью кнопки:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Ищем элемент в коллекции без риска падения с ошибкой
    ЭлементКнопка = Элементы.Найти("КнопкаВыполнитьДействие");
    
    Если ЭлементКнопка <> Неопределено Тогда
        ЭлементКнопка.Видимость = УсловиеВидимости;
    КонецЕсли;
    
КонецПроцедуры

Если у пользователя нет прав на соответствующую команду, метод Найти вернет Неопределено, условие не выполнится, и форма откроется в штатном режиме без критических ошибок.

Способ 2. Программная проверка прав доступа к метаданным

Если логика работы формы напрямую зависит от прав на конкретную общую команду, перед выполнением операций рекомендуется выполнить явную проверку прав с помощью функции ПравоДоступа.

Разберем пример реализации такой проверки:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если ПравоДоступа("Просмотр", Метаданные.ОбщиеКоманды.CRM_ОткрытьВзаимодействия) Тогда
        ЭлементКнопка = Элементы.Найти("CRM_ОткрытьВзаимодействия");
        Если ЭлементКнопка <> Неопределено Тогда
            ЭлементКнопка.Видимость = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Настройка видимости средствами метаданных

Рассмотрим альтернативный вариант без написания программного кода. Платформа 1С предоставляет встроенные средства управления видимостью элементов в зависимости от ролей:

  1. Настройка прав на уровне ролей: в дереве метаданных найдите нужную общую команду и в окне редактирования прав роли установите флаг «Просмотр» для тех профилей, которым требуется доступ к кнопке.
  2. Свойство «ПользовательскаяВидимость»: в свойствах элемента формы в конфигураторе настройте видимость для конкретных ролей. В этом случае платформа самостоятельно скроет или отобразит элемент для нужных категорий пользователей без необходимости вмешательства в модуль формы.

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

← На главную