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