Почему реквизит на управляемой форме 1С недоступен для редактирования, если в коде программно установлена доступность?

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

В практике разработчика 1С часто встречается загадочная ситуация: пользователь жалуется, что поле в документе или справочнике заблокировано (отображается серым цветом), хотя у него есть все необходимые права. Разработчик открывает отладчик, проверяет свойства Элементы.ИмяРеквизита.Доступность и Элементы.ИмяРеквизита.ТолькоПросмотр, видит там «Истина» и «Ложь» соответственно, но поле на форме всё равно остается недоступным. В этой статье мы разберем по шагам, почему так происходит, и рассмотрим скрытые механизмы платформы, которые могут блокировать ввод данных вопреки программному коду.

Причина 1. Ограничение редактирования в свойствах реквизита формы

Рассмотрим самую редкую, но наиболее вероятную причину в подобных случаях, о которой часто забывают даже опытные специалисты. В управляемой форме 1С есть разница между Элементом формы (визуальное поле) и Реквизитом формы (данные). У самого реквизита формы в окне свойств есть пункт «Редактирование».

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

  1. Откроем форму в конфигураторе.
  2. Перейдем на закладку «Реквизиты» (правая колонка).
  3. Найдем нужный реквизит и нажмем правую кнопку мыши — «Свойства».
  4. Найдем строку «Редактирование» и нажмем на кнопку с лупой (открыть список ролей).
  5. Убедимся, что для роли текущего пользователя или для всех ролей установлены флажки, разрешающие редактирование.

Причина 2. Наследование доступности от родительских групп

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

Разберем, как это проверить программно. Вместо проверки одного элемента, проинспектируем всю цепочку родителей:


ТекущийЭлемент = Элементы.ИмяНужногоРеквизита;
Пока ТекущийЭлемент.Родитель <> Неопределено Цикл
    ТекущийЭлемент = ТекущийЭлемент.Родитель;
    Сообщить("Группа: " + ТекущийЭлемент.Имя + ", Доступность: " + ТекущийЭлемент.Доступность);
КонецЦикла;

Если хотя бы одна группа в иерархии заблокирована, поле ввода будет недоступно пользователю.

Причина 3. Влияние функциональных опций

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

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

Причина 4. Механизмы Библиотеки стандартных подсистем (БСП)

В современных конфигурациях (таких как ЕРП, УТ 11, БП 3.0) активно используется подсистема «Запрет редактирования реквизитов объектов». Она блокирует ключевые поля в документах, которые уже были проведены или помечены на удаление, чтобы избежать случайного изменения данных, влияющих на учет.

Проанализируем поведение системы:

Механизм БСП срабатывает в самом конце инициализации формы, поэтому в ПриСозданииНаСервере вы можете видеть «Истину», но после отрисовки формы БСП принудительно «засерит» поле.

Причина 5. Автоматическое управление доступностью платформой

У управляемой формы есть стандартное свойство — «Автоматическое управление доступностью». Если оно включено, платформа самостоятельно блокирует элементы в зависимости от состояния объекта. Например, если у документа установлен статус «Проведен», платформа делает форму доступной только для чтения.

Посмотрим на свойства самой формы в конфигураторе. Найдем параметр Автоматическое управление доступностью. Если он включен, попробуем изменить программно свойство ТолькоПросмотр для всей формы или конкретно для этого элемента в обработчике ПриЧтенииНаСервере.

Причина 6. Ограничения на уровне прав доступа (RLS) и типов данных

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

Также проверим права на уровне RLS (Record Level Security). Если настроены ограничения на чтение определенных записей, и реквизит ссылается на такую запись, доступ к изменению поля может быть ограничен на уровне ядра системы.

Методика диагностики: ищем «виновника»

Если все вышеперечисленные методы не помогли, воспользуемся проверенным способом «от обратного»:

  1. Замер производительности: Запустите замер производительности при открытии формы. Проанализируйте все процедуры, где встречается имя вашего реквизита. Возможно, блокировка происходит в общем модуле, о котором вы не подозревали.
  2. Обработчик «ОбновлениеОтображения»: Посмотрите, не написан ли код в событии формы ОбновлениеОтображения. Это событие вызывается платформой очень часто (при любом движении мыши или изменении фокуса), и если там прописана блокировка, она будет моментально возвращаться, даже если вы измените её в отладчике.
  3. Контрольная кнопка: Создайте на форме временную кнопку и в её обработчике пропишите:
    
    Сообщить("Доступность элемента: " + Элементы.ИмяРеквизита.Доступность);
    Сообщить("Только просмотр элемента: " + Элементы.ИмяРеквизита.ТолькоПросмотр);
    
    Нажмите эту кнопку уже после того, как форма полностью открылась. Это покажет финальное состояние свойств, которое видит платформа перед отрисовкой интерфейса для пользователя.

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

← На главную