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