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