Как динамически получить доступ к элементам управляемой формы 1С 8.3 по имени и изменить их свойства?

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

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

Мы выясним, как найти нужный элемент, будь то поле ввода, кнопка, или целая группа, и как затем изменить его свойства, такие как доступность, видимость или цвет. Особое внимание мы уделим тому, где именно должен располагаться наш код для корректной работы с элементами управляемой формы.

Основные принципы работы с элементами управляемой формы

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

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

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

Метод Элементы.Найти() для поиска элементов

Одним из наиболее часто используемых методов для динамического доступа к элементам формы является Элементы.Найти("ИмяЭлемента"). Этот метод позволяет получить объект, соответствующий элементу формы с указанным именем. Если элемент с таким именем не найден, метод вернет значение Неопределено, что позволяет нам строить надежный код с проверкой существования элемента.

Рассмотрим пример, как найти поле ввода по его имени и изменить его свойство Доступность (аналогично Enabled в других системах). Представим, что у нас есть поле ввода с именем "МойРеквизит", и мы хотим сделать его недоступным для пользователя при определенных условиях.

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

Мы разместим наш код в серверной процедуре, например, в ПриСозданииНаСервере или в любой другой серверной процедуре, которая выполняется в нужный момент (например, при изменении другого поля, требующего обновления доступности). В этом примере мы будем искать поле с именем "ИмяПоляВвода".


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Мы хотим найти элемент формы с именем "ИмяПоляВвода"
    // и изменить его свойство "Доступность".

    // Сначала получаем ссылку на элемент с помощью метода Найти().
    // Он возвращает объект типа ЭлементФормы.Поле или Неопределено,
    // если элемент не найден.
    Перем ПолеДляИзменения;
    ПолеДляИзменения = Элементы.Найти("ИмяПоляВвода");

    // Обязательно проверяем, был ли элемент найден.
    Если ПолеДляИзменения <> Неопределено Тогда
        // Если элемент найден, мы можем безопасно изменить его свойства.
        // Например, сделаем его недоступным.
        ПолеДляИзменения.Доступность = Ложь;
        // Или, например, сделаем его невидимым:
        // ПолеДляИзменения.Видимость = Ложь;
    КонецЕсли;

    // Дополнительные действия, если необходимо
КонецПроцедуры

Как мы видим, код достаточно прост и понятен. Мы используем переменную ПолеДляИзменения для хранения ссылки на найденный элемент. После проверки на Неопределено мы получаем доступ к его свойствам и можем их изменять.

Пример 2: Управление доступностью полей в динамическом списке

Если мы работаем с динамическим списком и хотим управлять доступностью его полей, подход будет аналогичным. Важно понимать, что поля динамического списка также являются элементами формы. Если мы знаем точное имя колонки или поля в динамическом списке, мы можем напрямую к нему обратиться. Например, чтобы сделать колонку "ИмяКолонки" недоступной:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // ...
    // Если требуется управлять доступностью поля в динамическом списке,
    // например, колонка "ИмяКолонки", которая является элементом формы.
    Перем ЭлементСписка;
    ЭлементСписка = Элементы.Найти("ИмяКолонки");

    Если ЭлементСписка <> Неопределено Тогда
        ЭлементСписка.Доступность = Ложь;
    КонецЕсли;
    // ...
КонецПроцедуры

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

Пример 3: Управление доступностью группы элементов и ее подчиненных

Нередко требуется изменить свойства целой группы элементов. Например, сделать недоступной всю группу или, наоборот, пройтись по всем элементам внутри группы и изменить их свойства. В этом случае мы сначала находим саму группу, а затем можем итерировать по ее подчиненным элементам.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // ...

    // Если элемент, который мы хотим изменить, является полем
    Перем ПолеДляИзменения;
    ПолеДляИзменения = Элементы.Найти("ИмяПоляВвода");
    Если ПолеДляИзменения <> Неопределено Тогда
        // Делаем поле недоступным
        ПолеДляИзменения.Доступность = Ложь;
    КонецЕсли;

    // Если элемент, который мы хотим изменить, является группой
    Перем ГруппаЭлементов;
    ГруппаЭлементов = Элементы.Найти("ИмяГруппы");
    Если ГруппаЭлементов <> Неопределено Тогда
        // Мы можем сделать недоступной всю группу целиком.
        // В этом случае все элементы внутри группы также станут недоступными.
        // ГруппаЭлементов.Доступность = Ложь;

        // Или мы можем пройтись по всем подчиненным элементам группы
        // и изменить их свойства по отдельности.
        Для Каждого ПодчиненныйЭлемент Из ГруппаЭлементов.ПодчиненныеЭлементы Цикл
            // Для каждого элемента внутри группы делаем его недоступным
            ПодчиненныйЭлемент.Доступность = Ложь;
            // Можно также проверять тип элемента, если нужно применить
            // изменения только к определенным типам (например, только к полям ввода)
            // Если ПодчиненныйЭлемент.Тип = Тип("ЭлементФормы.Поле") Тогда
            //     ПодчиненныйЭлемент.Доступность = Ложь;
            // КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    // ...
КонецПроцедуры

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

Прямой доступ к элементам формы

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

Пример прямого доступа:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Прямой доступ к элементу формы с именем "МоеПоле"
    // и изменение его доступности.
    Элементы.МоеПоле.Доступность = Ложь;

    // Прямой доступ к элементу формы с именем "МояКнопка"
    // и изменение его видимости.
    Элементы.МояКнопка.Видимость = Истина;
КонецПроцедуры

Обратите внимание, что при использовании прямого доступа Элементы.МоеПоле, если элемента с таким именем не существует, произойдет ошибка выполнения. Именно поэтому метод Найти() с последующей проверкой на Неопределено является более безопасным и рекомендованным способом.

Где размещать код?

Как уже было сказано, изменение свойств элементов управляемой формы должно происходить на сервере. Рассмотрим основные места, где мы можем размещать наш код:

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

Заключение

Мы подробно рассмотрели методы динамического доступа к элементам управляемой формы 1С 8.3 по их имени и изменения их свойств. Использование метода Элементы.Найти("ИмяЭлемента") в сочетании с проверкой на Неопределено является наиболее надежным способом. Мы также убедились, что все операции по изменению свойств элементов должны выполняться на сервере, используя соответствующие серверные процедуры или функции.

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

← На главную