Как при открытии формы программно ограничить доступ к её элементам и настроить реквизиты?

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

В процессе разработки в системе 1С:Предприятие 8.3 часто возникает задача открыть форму (например, универсальную обработку загрузки данных) таким образом, чтобы пользователю был доступен только ограниченный функционал. Это необходимо для минимизации ошибок и упрощения интерфейса в конкретном бизнес-сценарии. Рассмотрим, как правильно реализовать управление элементами формы, передачу параметров и заполнение данных «на лету».

Метод 1: Использование структуры параметров и обработчика «ПриСозданииНаСервере»

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

Сначала проанализируем код в вызывающей форме (например, в форме списка регистра сведений). Нам нужно создать структуру, наполнить её данными и передать в метод ОткрытьФорму:


&НаКлиенте
Процедура ЗагрузитьДанныеРегистра(Команда)
    
    // Формируем параметры открытия
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("РежимЗагрузки", "РегистрСведений");
    ПараметрыОткрытия.Вставить("ИмяОбъекта", "МенеджерыПартнеров");
    ПараметрыОткрытия.Вставить("ТолькоПросмотрНастроек", Истина);
    
    // Открываем форму обработки, передавая параметры
    ОткрытьФорму("Обработка.ЗагрузкаДанныхИзТабличногоДокумента.Форма", ПараметрыОткрытия);
    
КонецПроцедуры

Далее разберем, что происходит внутри открываемой формы. В модуле формы обработки мы должны перехватить эти параметры в стандартном обработчике ПриСозданииНаСервере. Важно понимать, что в этот момент элементы формы уже созданы, но еще не отображены пользователю.


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

Проблема программного изменения реквизитов и событий «ПриИзменении»

Проанализируем ситуацию, с которой часто сталкиваются разработчики: при программном присвоении значения реквизиту (например, Объект.ИмяВидаРегистра = "...") не срабатывают визуальные изменения, которые обычно происходят, когда пользователь выбирает значение руками. Это происходит потому, что событие ПриИзменении генерируется только при интерактивном действии пользователя в интерфейсе.

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


&НаСервере
Процедура НастроитьИнтерфейсПодРегистр()
    // Здесь код, который меняет состав табличной части
    // или программно добавляет колонки в зависимости от выбранного регистра
    // ...
КонецПроцедуры

Метод 2: Настройка формы через «ПолучитьФорму»

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

Важный нюанс: Попытка напрямую изменить реквизиты объекта через Форма.Объект.Реквизит на клиенте может привести к ошибке «Поле объекта недоступно для записи». Это связано с тем, что реквизит Объект на клиенте часто доступен только для чтения в контексте другой формы. Правильнее работать с параметрами или использовать экспортные методы.


&НаКлиенте
Процедура ВариантЧерезПолучитьФорму(Команда)
    
    ПараметрыФормы = Новый Структура("Ключ", "УникальныйКлючЗагрузки");
    ФормаЗагрузки = ПолучитьФорму("Обработка.УниверсальнаяЗагрузка.Форма", ПараметрыФормы);
    
    // Прямое управление элементами (доступно на клиенте)
    ФормаЗагрузки.Элементы.ГруппаНастроек.Видимость = Ложь;
    ФормаЗагрузки.Заголовок = "Специальный режим загрузки менеджеров";
    
    // Если в форме есть экспортные переменные или методы:
    // ФормаЗагрузки.УстановитьТипОбъекта("РегистрСведений"); 
    
    ФормаЗагрузки.Открыть();
    
КонецПроцедуры

Метод 3: Использование ключа уникальности

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

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


ОткрытьФорму("Обработка.Загрузка.Форма", ПараметрыОткрытия, ЭтаФорма, "УникальныйКлюч_РегистрМенеджеры");

Сравнительный анализ подходов

Проанализируем, какой метод выбрать в зависимости от условий задачи:

  1. Передача через параметры (рекомендуется): Позволяет выполнять всю тяжелую логику на сервере. Это максимально быстро и соответствует стандартам разработки 1С. Вся ответственность за «внешний вид» лежит на самой открываемой форме.
  2. Управление через ПолучитьФорму: Удобно, если нужно быстро «подправить» заголовок или видимость пары кнопок извне, не создавая новых параметров в метаданных формы. Однако это порождает лишние вызовы между клиентом и сервером.
  3. Условное оформление формы: Вместо явного кода Элементы.Имя.Видимость = Ложь, можно использовать механизм условного оформления. Мы можем задать правило: если реквизит РежимРаботы равен "Упрощенный", то скрыть определенные группы. Это работает быстрее, так как отрисовкой управляет сама платформа на уровне ядра.

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

← На главную