Почему в УТ 10.3 при вызове Открыть() открывается новый элемент вместо выбранного и как это исправить

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переходе с разработки управляемых форм на обычные (или при работе со старыми конфигурациями, такими как Управление торговлей 10.3) программисты часто сталкиваются с проблемой: код вроде бы написан верно, ошибок не выдает, но вместо открытия существующего элемента справочника система настойчиво создает новый. Давайте разберем, почему так происходит, и изучим правильные способы программного открытия форм в обычном приложении.

Анализ основной причины проблемы

Рассмотрим ситуацию, с которой столкнулся автор темы. В коде была сделана попытка использовать синтаксис, характерный для управляемого приложения (платформа 8.2 и 8.3 на управляемых формах):


// ОШИБОЧНЫЙ КОД ДЛЯ ОБЫЧНЫХ ФОРМ
Парам = Новый Структура("Ключ", ВыбраннаяСтрока.Ссылка);
Ф = ПолучитьФорму("Справочник.Пользователи.Форма.ФормаЭлемента2", Парам);
Ф.Открыть();

В чем здесь ошибка? В управляемых формах метод ПолучитьФорму действительно принимает структуру параметров, где поле Ключ указывает системе на конкретный объект базы данных. Однако в обычном приложении (которое используется в УТ 10.3) второй параметр метода ПолучитьФорму — это Владелец формы, а не структура параметров. Передавая туда структуру, вы просто передаете «непонятный» для метода объект в качестве владельца, при этом сама форма не получает никакой ссылки на элемент справочника и инициализируется как форма для нового объекта.

Решение №1: Прямая передача ссылки в ПолучитьФорму

Самый простой и правильный способ открыть существующий элемент в обычном приложении — передать ссылку вторым параметром метода ПолучитьФорму. Выясним, как это выглядит на практике. Если нам нужно открыть конкретную форму, мы пишем следующий код:


// Правильный способ для обычных форм
ВыбраннаяСсылка = ВыбраннаяСтрока.Ссылка;
Ф = ПолучитьФорму("Справочник.Пользователи.Форма.ФормаЭлемента2", ВыбраннаяСсылка);
Ф.Открыть();

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

Решение №2: Использование метода ПолучитьФорму от самой ссылки

Если вам нужно открыть основную форму элемента, код можно сократить еще сильнее. У объекта типа «Ссылка» есть собственный метод ПолучитьФорму. Проанализируем этот пример:


// Еще более лаконичный вариант
ВыбраннаяСсылка = ВыбраннаяСтрока.Ссылка;
ВыбраннаяСсылка.ПолучитьФорму("ФормаЭлемента").Открыть();

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

Решение №3: Универсальный метод ОткрытьЗначение

Бывают ситуации, когда нам нужно просто показать пользователю объект, и нам не важно, какая именно форма откроется (главное, чтобы она была основной). Для таких случаев в глобальном контексте обычного приложения существует метод ОткрытьЗначение. Рассмотрим его применение:


// Универсальный метод
ОткрытьЗначение(ВыбраннаяСтрока.Ссылка);

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

Решение №4: Работа через объект (ПолучитьОбъект)

Иногда перед открытием формы нам нужно программно изменить какие-то данные в элементе, но не записывать их в базу сразу, а дать пользователю возможность проверить их и нажать кнопку «ОК». В этом случае мы работаем не со ссылкой, а с объектом. Разберем этот сценарий по шагам:

  1. Получаем объект из ссылки с помощью метода ПолучитьОбъект().
  2. Вызываем получение формы непосредственно от объекта.
  3. Открываем форму.

// Работа через объектную модель
Объект = ВыбраннаяСсылка.ПолучитьОбъект();
// Здесь можно что-то изменить в Объекте
Ф = Объект.ПолучитьФорму("ФормаЭлемента2");
Ф.Открыть();

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

Почему форма всё равно может открываться пустой?

Если вы применили правильный синтаксис (передали ссылку вторым параметром), но форма всё равно открывается как новая, проанализируем настройки в конфигураторе:

Подводя итог, запомним главное правило: в обычных формах (УТ 10.3) забудьте про структуру с ключом "Ключ". Просто передавайте Ссылка вторым параметром метода ПолучитьФорму, и система сама сделает всю необходимую работу по загрузке данных.

← На главную