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