К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как открыть форму существующего объекта 1С

Как программно открыть форму существующего объекта 1С: ОткрытьФорму, ПолучитьФорму, ключ записи регистра, примеры кода, ошибки и проверка результата.

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

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

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

Как платформа решает, какой объект показать

Любая форма объекта в 1С имеет стандартный параметр Ключ. Если при открытии формы в этот параметр передана ссылка, платформа считывает объект из базы данных и заполняет форму его данными. Если параметр Ключ не передан или пуст, открывается форма нового объекта — именно поэтому передача ссылки является решающим условием.

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

Важно понимать: платформа не проверяет «существование» ссылки заранее. Если передать битую ссылку (объект удалён), форма откроется с сообщением о том, что объект не найден, либо с ошибкой в зависимости от режима работы. Поэтому перед открытием полезно проверять ссылку на валидность.

Открытие формы через ОткрытьФорму()

Функция ОткрытьФорму() — стандартный способ в управляемом приложении. Первый параметр — полное имя формы, второй — структура параметров. Минимальный рабочий пример для документа:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);

Имя формы можно указывать полностью, как в примере, или использовать сокращённый вариант "Документ.РеализацияТоваровУслуг.ФормаОбъекта" — тогда платформа возьмёт форму, назначенную основной в конфигураторе. Полный путь к конкретной форме надёжнее, когда у объекта несколько форм и нужна определённая.

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

Открытие с владельцем и блокировкой окна

Третий параметр ОткрытьФорму() задаёт владельца формы — обычно текущую форму или элемент управления. Владелец нужен, чтобы при закрытии родительской формы закрылась и дочерняя, а также для организации оповещений. Четвёртый параметр — ключ уникальности: если передать, например, ссылку, то повторный вызов с тем же ключом не откроет вторую копию формы, а активирует уже открытую.

ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента",

ПараметрыФормы,

ЭтотОбъект, // владелец

СсылкаНаКонтрагента, // ключ уникальности

, // окно

, // навигационная ссылка

, // описание оповещения о закрытии

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

1c
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);

Когда нужен ПолучитьФорму()

ПолучитьФорму() отличается тем, что возвращает объект формы до её отображения. Это нужно, когда требуется что-то настроить в форме программно — заполнить дополнительные реквизиты, подготовить данные — и только потом показать её пользователю методом Открыть() или ОткрытьМодально().

ФормаДокумента = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);

// дополнительная настройка формы

ФормаДокумента.Открыть();

В управляемом приложении ПолучитьФорму() применяется редко: почти всё, что раньше делалось через получение формы, теперь решается передачей параметров при ОткрытьФорму() и обработкой их в событии ПриСозданииНаСервере целевой формы. В обычном приложении ПолучитьФорму() остаётся основным способом, так как ОткрытьФорму() там недоступна.

ОткрытьФорму или ПолучитьФорму

ОткрытьФорму()

Стандарт для управляемого приложения. Форма открывается сразу, вся подготовка — через параметры и ПриСозданииНаСервере. Подходит в большинстве случаев.

ПолучитьФорму()

Нужна, когда до показа формы требуется программный доступ к ней, и в обычном приложении. Избыточна для простого показа объекта.

ПерейтиПоНавигационнойСсылке()

Открывает объект по ссылке вида e1cib/data/... без указания формы. Подходит, когда тип объекта заранее неизвестен.

Открытие записи регистра сведений

У записи регистра сведений нет ссылки, поэтому в параметр Ключ передаётся ключ записи, который создаётся менеджером регистра. Значения измерений должны точно соответствовать существующей записи — иначе откроется форма новой записи с заполненными измерениями.

ЗначенияКлюча = Новый Структура;

ЗначенияКлюча.Вставить("Организация", Организация);

ЗначенияКлюча.Вставить("Контрагент", Контрагент);

КлючЗаписи = РегистрыСведений.ОтветственныеЛица.СоздатьКлючЗаписи(ЗначенияКлюча);

ПараметрыФормы = Новый Структура("Ключ", КлючЗаписи);

ОткрытьФорму("РегистрСведений.ОтветственныеЛица.Форма.ФормаЗаписи", ПараметрыФормы);

Для периодического регистра в структуру значений ключа дополнительно включается Период. Если регистр подчинён регистратору, в ключ входит регистратор, и чаще в таких случаях открывают не отдельную запись, а сам документ-регистратор.

Открытие объекта по навигационной ссылке

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

НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);

ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);

Платформа сама определит тип объекта и откроет его основную форму. Минус способа — нельзя указать конкретную нестандартную форму и передать дополнительные параметры, поэтому для управляемых сценариев предпочтительнее ОткрытьФорму().

Проверки перед открытием и типичные ошибки

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

Ещё одна обязательная проверка — права пользователя. Если у пользователя нет права «Просмотр» на объект, открытие формы завершится ошибкой нарушения прав доступа. В коробочных обработках такую ситуацию лучше перехватывать и показывать понятное сообщение.

Типичные ошибки
01
Передача ссылки не в параметр Ключ, а в самодельный параметр: форма открывается пустой, как для нового объекта
02
Открытие формы в цикле без ключа уникальности: накапливаются десятки одинаковых окон
03
Игнорирование битых ссылок: пользователь видит ошибку платформы вместо понятного сообщения
04
Вызов ОткрытьФорму на сервере: функция доступна только на клиенте, код падает с ошибкой
05
Неточный ключ записи регистра: вместо существующей записи открывается форма новой

Проверка результата после внедрения

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

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

Контрольные точки

Как проверить результат

Передана существующая ссылка
Норма

Форма открывается с данными объекта

Тревожный признак

Форма пустая — ключ не дошёл до формы

Ссылка битая
Норма

Понятное сообщение пользователю

Тревожный признак

Исключение платформы или окно с ошибкой

Повторный вызов
Норма

Активируется уже открытая форма

Тревожный признак

Открывается вторая копия окна

Пользователь без прав
Норма

Корректное сообщение о недоступности

Тревожный признак

Аварийное завершение с ошибкой прав

Итог

Что важно запомнить

Существующий объект открывается передачей ссылки в параметр Ключ функции ОткрытьФорму; для регистров сведений вместо ссылки строится ключ записи. Открытие выполняется только на клиенте, ссылку и права стоит проверять заранее, а от дублей окон защищает ключ уникальности.

Частые вопросы

Форма открывается пустой, хотя ссылка передана. В чём причина?

Чаще всего ссылка передана не в стандартный параметр «Ключ», а в параметр с другим именем, который форма не обрабатывает. Проверьте, что структура параметров содержит именно ключ «Ключ», и что в событии ПриСозданииНаСервере целевой формы нет кода, очищающего объект.

Можно ли открыть форму объекта на сервере?

Нет. ОткрытьФорму и ПолучитьФорму доступны только в клиентском контексте. На сервере можно подготовить ссылку, проверить права и сформировать параметры, а сам вызов открытия должен выполняться в клиентской процедуре.

Как открыть форму элемента справочника из табличной части документа?

В обработчике события Выбор или ПриАктивизацииЯчейки табличной части получите ссылку из текущей строки (Элементы.ИмяТаблицы.ТекущиеДанные.ИмяРеквизита) и вызовите ОткрытьФорму с параметром Ключ. Проверьте, что ссылка не пустая, чтобы не открывать форму нового элемента.

Как открыть форму и получить результат её работы обратно?

Передайте в ОткрытьФорму описание оповещения о закрытии (предпоследний параметр). Когда форма закроется, выполнится указанная процедура, в которую будет передано возвращаемое значение формы, если она закрыта методом Закрыть с параметром.

Чем отличается открытие формы в тонком клиенте и веб-клиенте?

Синтаксис одинаковый, но в веб-клиенте строже ограничения на модальные вызовы и работу с окнами. Режим БлокироватьОкноВладельца поддерживается везде, а устаревший ОткрытьМодально в веб-клиенте требует специальной настройки браузера и использовать его не рекомендуется.

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

Укажите полный путь к форме в первом параметре ОткрытьФорму, например «Документ.ЗаказКлиента.Форма.ФормаДокументаРасширенная». Параметр Ключ передаётся так же — нестандартная форма обязана поддерживать стандартный параметр Ключ, что выполняется автоматически для форм объекта.