Как передать параметры из формы списка в форму объекта при создании, копировании и изменении?

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

При разработке прикладных решений на управляемых формах часто возникает задача передать контекстные данные из формы списка в форму объекта (документа или справочника). Например, требуется передать признак специального режима открытия, дополнительные значения для автозаполнения или параметры интерфейса при нажатии кнопок Создать, Скопировать, а также при изменении существующей записи по клавишам F2, Enter или двойному клику мыши.

Разберем по шагам, как правильно перехватить стандартные действия пользователя в таблице списка, передать структуру параметров и обработать ее при инициализации формы объекта на сервере.

Почему не подходит обращение через ВладелецФормы

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

  1. Свойство ВладелецФормы — это исключительно клиентский объект интерфейса. Оно доступно только на клиенте (например, в событии ПриОткрытии).
  2. На этапе серверной инициализации в процедурах ПриСозданииНаСервере или ПриЧтенииНаСервере контекст клиентского владельца физически недоступен.
  3. Если логика настройки формы (видимость реквизитов, доступность элементов, предварительные серверные расчеты) должна выполниться до показа формы пользователю, передать данные можно только через параметры формы при ее открытии.

Перехват событий таблицы динамического списка

Чтобы гарантированно перехватить все возможные способы открытия формы объекта из списка, достаточно назначить обработчики для двух событий таблицы динамического списка:

  1. ПередНачаломДобавления — срабатывает при создании нового элемента (кнопка «Создать», клавиша Insert) и при копировании (кнопка «Скопировать», клавиша F9).
  2. ПередНачаломИзменения — срабатывает при любом открытии существующей строки (кнопка «Изменить», клавиша F2, Enter или двойной клик мыши). Обрабатывать отдельно событие Выбор не требуется, так как ПередНачаломИзменения срабатывает раньше и полностью отменяет стандартный вход в редактирование.

Проанализируем пример реализации этих событий в модуле управляемой формы списка:


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

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

Обработка переданных параметров в форме объекта

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

Посмотрим на пример обработки в модуле формы документа:


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

Важные нюансы и правила передачи параметров

Выясним ключевые детали работы механизмов платформы, которые необходимо учитывать:

  1. Стандартный параметр ЗначенияЗаполнения: если при создании нового объекта требуется передать значения для реквизитов (например, склад, организацию или контрагента), поместите во входящую структуру параметров ключ ЗначенияЗаполнения (тип Структура). Платформа автоматически передаст эти значения в событие ОбработкаЗаполнения модуля объекта до вызова ПриСозданииНаСервере.
  2. Служебный аргумент Параметр в ПередНачаломДобавления: системный аргумент Параметр в заголовке обработчика ПередНачаломДобавления предназначен только для служебных целей платформы (например, для передачи типа создаваемого объекта в журналах документов) и не может использоваться для прямой передачи произвольных данных.
  3. Передача владельца формы: третьим параметром в ОткрытьФорму рекомендуется явно указывать форму списка (ЭтаФорма). Это обеспечивает автоматическое позиционирование динамического списка на новой или отредактированной строке после закрытия формы объекта.
  4. Параметр КлючУникальности: для существующих объектов платформа автоматически находит уже открытое окно по переданному параметру Ключ. Однако при создании нового объекта (когда ключа еще нет) отсутствие уникального идентификатора приведет к тому, что при повторном нажатии «Создать» откроется фокус на уже открытой несохраненной форме вместо создания новой.
← На главную