В практике разработчика 1С часто встречается загадочная ситуация: пользователь жалуется, что поле в документе или справочнике заблокировано (отображается серым цветом), хотя у него есть все необходимые права. Разработчик открывает отладчик, проверяет свойства Элементы.ИмяРеквизита.Доступность и Элементы.ИмяРеквизита.ТолькоПросмотр, видит там «Истина» и «Ложь» соответственно, но поле на форме всё равно остается недоступным. В этой статье мы разберем по шагам, почему так происходит, и рассмотрим скрытые механизмы платформы, которые могут блокировать ввод данных вопреки программному коду.
Рассмотрим самую редкую, но наиболее вероятную причину в подобных случаях, о которой часто забывают даже опытные специалисты. В управляемой форме 1С есть разница между Элементом формы (визуальное поле) и Реквизитом формы (данные). У самого реквизита формы в окне свойств есть пункт «Редактирование».
Проанализируем ситуацию: если в этом свойстве сняты флажки для определенных ролей или установлено ограничение, то никакие манипуляции с Элементы.ИмяРеквизита.Доступность в коде не помогут. Платформа проверяет права на уровне состава данных формы. Чтобы исправить это, выполним следующие действия:
Выясним, не находится ли наш элемент внутри группы (обычной группы, страниц или командной панели), у которой установлены ограничивающие свойства. В управляемых формах действует иерархический принцип: если у родительской группы свойство Доступность установлено в значение Ложь, то все вложенные элементы автоматически станут недоступны, даже если у них самих в отладчике свойство Доступность равно Истина.
Разберем, как это проверить программно. Вместо проверки одного элемента, проинспектируем всю цепочку родителей:
ТекущийЭлемент = Элементы.ИмяНужногоРеквизита;
Пока ТекущийЭлемент.Родитель <> Неопределено Цикл
ТекущийЭлемент = ТекущийЭлемент.Родитель;
Сообщить("Группа: " + ТекущийЭлемент.Имя + ", Доступность: " + ТекущийЭлемент.Доступность);
КонецЦикла;
Если хотя бы одна группа в иерархии заблокирована, поле ввода будет недоступно пользователю.
Функциональные опции (ФО) — это мощный инструмент платформы, который позволяет динамически изменять интерфейс. Если реквизит объекта или сам элемент формы привязан к функциональной опции, которая выключена, платформа может сделать элемент недоступным или вообще скрыть его. Важно помнить: функциональные опции имеют приоритет над программной установкой свойств в процедуре ПриСозданииНаСервере.
Чтобы исключить эту причину, проверим в конфигураторе свойство реквизита объекта в дереве метаданных. Посмотрим, в какие функциональные опции он включен, и проверим значение этих опций в режиме «Предприятие» для конкретного пользователя.
В современных конфигурациях (таких как ЕРП, УТ 11, БП 3.0) активно используется подсистема «Запрет редактирования реквизитов объектов». Она блокирует ключевые поля в документах, которые уже были проведены или помечены на удаление, чтобы избежать случайного изменения данных, влияющих на учет.
Проанализируем поведение системы:
ПодсистемыБСП.УправлениеДоступностьюЭлементов.Механизм БСП срабатывает в самом конце инициализации формы, поэтому в ПриСозданииНаСервере вы можете видеть «Истину», но после отрисовки формы БСП принудительно «засерит» поле.
У управляемой формы есть стандартное свойство — «Автоматическое управление доступностью». Если оно включено, платформа самостоятельно блокирует элементы в зависимости от состояния объекта. Например, если у документа установлен статус «Проведен», платформа делает форму доступной только для чтения.
Посмотрим на свойства самой формы в конфигураторе. Найдем параметр Автоматическое управление доступностью. Если он включен, попробуем изменить программно свойство ТолькоПросмотр для всей формы или конкретно для этого элемента в обработчике ПриЧтенииНаСервере.
Если реквизит имеет ссылочный тип (например, СправочникСсылка.Контрагенты), а у пользователя нет прав на просмотр этого справочника, платформа заблокирует поле выбора. Пользователь не сможет не только выбрать новое значение, но иногда и просто активировать поле.
Также проверим права на уровне RLS (Record Level Security). Если настроены ограничения на чтение определенных записей, и реквизит ссылается на такую запись, доступ к изменению поля может быть ограничен на уровне ядра системы.
Если все вышеперечисленные методы не помогли, воспользуемся проверенным способом «от обратного»:
ОбновлениеОтображения. Это событие вызывается платформой очень часто (при любом движении мыши или изменении фокуса), и если там прописана блокировка, она будет моментально возвращаться, даже если вы измените её в отладчике.
Сообщить("Доступность элемента: " + Элементы.ИмяРеквизита.Доступность);
Сообщить("Только просмотр элемента: " + Элементы.ИмяРеквизита.ТолькоПросмотр);
Таким образом, мы выяснили, что доступность реквизита — это комплексный параметр, складывающийся из прав метаданных, свойств реквизита формы, настроек функциональных опций и логики прикладных подсистем (БСП). Проверка свойства «Редактирование» у самого реквизита формы является ключевым шагом, если программный код кажется абсолютно корректным. Для быстрой проверки и изменения параметров открытых окон и их элементов прямо во время работы можно использовать обработку для редактирования свойств форм в режиме «1С:Предприятие».