Как программно заменить или переместить элемент на обычной форме 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

При разработке в конфигурациях на обычных формах (например, 1С:Управление производственным предприятием 1.3) часто возникает задача адаптации интерфейса под конкретного пользователя. Одной из таких задач является подмена стандартного реквизита другим (например, отображение «Даты отгрузки» на месте стандартной «Даты документа») в зависимости от настроек прав доступа. Рассмотрим, как правильно реализовать такое поведение, учитывая ограничения платформы 1С.

Ограничения и особенности обычных форм

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

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

Способ 1: Статическое дублирование и управление видимостью

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

Разберем алгоритм реализации по шагам:

  1. В конфигураторе добавим на форму новый элемент (например, поле ввода ДатаОтгрузки1), разместив его точно поверх стандартного поля Дата.
  2. В процедуре ПередОткрытием или ПриОткрытии считаем настройку пользователя.
  3. В зависимости от значения настройки установим свойство Видимость для обоих элементов.

Пример реализации кода в модуле формы:


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

Синхронизация данных при записи

Если мы используем дополнительный элемент формы, который не связан напрямую с основным реквизитом через свойство Данные, нам необходимо обеспечить сохранение измененного значения. Для этого в обработчике ПередЗаписью следует перенести значение из экранного элемента в реквизит объекта.


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Если у пользователя включена подмена, записываем данные из экранного поля в реквизит
    Если ЭлементыФормы.ДатаОтгрузки1.Видимость Тогда
        ДатаОтгрузки = ЭлементыФормы.ДатаОтгрузки1.Значение;
    КонецЕсли;
КонецПроцедуры

Способ 2: Программное создание элементов

Если элементов много или их состав постоянно меняется, удобнее использовать метод ЭлементыФормы.Добавить(). Этот метод позволяет создать элемент управления динамически и сразу указать его владельца (форму или панель).

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


// Пример программного добавления поля ввода
НовоеПоле = ЭлементыФормы.Добавить(Тип("ПолеВвода"), "ПолеДатаОтгрузки", Истина, ЭлементыФормы.ОсновнаяПанель);
НовоеПоле.Данные = "ДатаОтгрузки";
НовоеПоле.Лево = ЭлементыФормы.Дата.Лево;
НовоеПоле.Верх = ЭлементыФормы.Дата.Верх;
НовоеПоле.Ширина = ЭлементыФормы.Дата.Ширина;
НовоеПоле.Высота = ЭлементыФормы.Дата.Высота;

Важный нюанс: при программном управлении координатами (Лево, Верх) необходимо учитывать установленные Привязки. Чтобы элемент корректно вел себя при изменении размеров окна, рекомендуется использовать метод УстановитьПривязку().

Оптимизация и надежность решения

Рассмотрим несколько советов, которые помогут сделать решение более профессиональным:

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

← На главную