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