Разбор от сообщества: Как программно определить элементы формы, скрытые функционал | infolimp.ru

Разбор от сообщества: Как программно определить элементы формы, скрытые функционал

29 июля 2026 · infolimp.ru

Каждый разработчик управляемых форм сталкивался с ситуацией: элемент пропал, а почему — непонятно. Свойство Видимость равно Истина, но поля на экране нет. Или наоборот — элемент виден, хотя по логике должен быть скрыт. Стандартная справка молчит о том, как программно различить скрытие через функциональные опции, роли и прямое изменение свойства. Рассмотрим механику «под капотом» и готовый код для диагностики.

Контекст: три слоя скрытия элемента

В управляемой форме видимость элемента определяется не одним свойством, а комбинацией трёх независимых механизмов:

Ловушка в том, что платформа не предоставляет единого метода «почему элемент скрыт». Свойство ЭлементыФормы.Имя.Видимость возвращает текущее состояние с учётом всех слоёв, но не говорит, какой именно слой его установил. А попытка изменить видимость программно может не сработать, если элемент заблокирован функциональной опцией.

Ключевой тезис: Свойство Видимость элемента — это результат, а не причина. Чтобы понять, почему элемент скрыт, нужно анализировать каждый слой отдельно.

Технический разбор: как заглянуть под капот

Шаг 1. Проверка прямого свойства Видимость

Самый очевидный шаг — прочитать свойство элемента. Если оно Ложь — причина в программном коде или настройке формы. Но если Истина, а элемента нет — переходим к функциональным опциям.

// Пример: проверка видимости элемента "ПолеТовар"
Элемент = ЭтаФорма.Элементы.ПолеТовар;
Если Элемент.Видимость = Ложь Тогда
    Сообщить("Элемент скрыт через свойство Видимость");
Иначе
    Сообщить("Видимость = Истина, но возможно скрыт функциональной опцией или ролью");
КонецЕсли;

Шаг 2. Анализ функциональных опций через метаданные

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

// Функция возвращает Истина, если элемент скрыт хотя бы одной функциональной опцией
Функция ЭлементСкрытФункциональнойОпцией(ИмяЭлемента) Экспорт
    
    Элемент = ЭтаФорма.Элементы[ИмяЭлемента];
    Если Элемент = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    
    // Получаем реквизит, связанный с элементом (если есть)
    ИмяРеквизита = Элемент.ИмяРеквизита; // для полей ввода, полей таблицы и т.д.
    Если ПустаяСтрока(ИмяРеквизита) Тогда
        // Для команд и кнопок нужно анализировать команду
        Возврат Ложь;
    КонецЕсли;
    
    // Получаем метаданные реквизита
    МетаРеквизита = Метаданные.НайтиПоИдентификатору(ИмяРеквизита);
    Если МетаРеквизита = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    
    // Перебираем функциональные опции реквизита
    Для Каждого ИмяОпции Из МетаРеквизита.ФункциональныеОпции Цикл
        Если Не ПолучитьФункциональнуюОпцию(ИмяОпции) Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Ложь;
КонецФункции

Примечание: Метод НайтиПоИдентификатору у глобального объекта Метаданные — реальный. Он возвращает объект метаданных по строковому идентификатору (полному имени). Для реквизитов формы идентификатор формируется как "Справочник.Номенклатура.Реквизит.Артикул".

Шаг 3. Учёт ролей и прав доступа

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

// Проверка прав на реквизит
Если Не ПроверитьДоступность(МетаРеквизита, "Чтение") Тогда
    Сообщить("Элемент скрыт из-за прав доступа");
КонецЕсли;

Практическое руководство: универсальная диагностика

Соберём всё вместе в одну функцию, которая возвращает строку с причиной скрытия. Это пригодится при отладке сложных форм, особенно в типовых конфигурациях, где функциональные опции переплетаются с ролями.

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

Типичные ошибки

Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.

Попробовать НОПик →