Почему при открытии дополнительной формы элемента справочника в обычных формах 1С открывается новый элемент и как это исправить?

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

Разберем распространенную проблему, с которой сталкиваются разработчики при работе с обычными (неуправляемыми) формами в режиме толстого клиента платформы 1С:Предприятие. При попытке открыть произвольную или дополнительную форму элемента с передачей параметра Ключ создается форма нового элемента, несмотря на то, что в параметрах передается корректная ссылка на существующий объект.

Проанализируем причину поведения платформы

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


СтандартнаяОбработка = Ложь;
Парам = Новый Структура("Ключ", ВыбраннаяСтрока.Ссылка);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаДоп", Парам);

Выясним причину, по которой данный подход не работает так, как ожидается. Согласно Синтаксис-помощнику, механизм передачи параметров формы через структуру, включая параметр Ключ, в полном объеме реализован в расширениях управляемых форм. В обычных (неуправляемых) формах действует важное ограничение:

Если при открытии обычной формы в функции ОткрытьФорму указано нестандартное имя формы (например, дополнительная форма ФормаЭлементаДоп, а не основная форма элемента), передаваемые параметры формы платформой не обрабатываются.

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

Способы решения проблемы

Рассмотрим проверенные способы, которые позволяют корректно открыть дополнительную форму существующего объекта в обычном приложении.

Способ 1. Получение формы напрямую от ссылки объекта (рекомендуемый)

Для обычных форм самым простым и правильным решением является получение формы непосредственно у ссылки на объект справочника с помощью метода ПолучитьФорму().

Разберем по шагам, как написать данный вызов:

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

Рассмотрим пример кода:


СтандартнаяОбработка = Ложь;

// Получаем форму напрямую от ссылки элемента
ФормаДоп = ВыбраннаяСтрока.Ссылка.ПолучитьФорму("ФормаЭлементаДоп");

// Открываем полученную форму
ФормаДоп.Открыть();

При использовании этого метода платформа самостоятельно передает контекст объекта в открываемую форму, и данные существующего элемента отображаются корректно.

Способ 2. Явная передача и обработка параметров в форме

Если вам требуется передать произвольные параметры или дополнительную структуру данных, можно передать их через метод ПолучитьФорму() и вручную обработать в самой открываемой форме.

1. В форме-источнике формируем структуру параметров и передаем ее при получении формы:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СсылкаНаОбъект", ВыбраннаяСтрока.Ссылка);

ФормаДоп = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлементаДоп", ПараметрыФормы);
ФормаДоп.Открыть();

2. В открываемой форме ФормаЭлементаДоп в обработчике события ПриОткрытии или ПередОткрытием считываем переданный параметр и считываем данные объекта:


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

Дополнительные рекомендации

При отладке подобных задач обратите внимание на следующие нюансы:

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