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