Разработка и Конфигурация · 11 мин
Как открыть форму существующего объекта 1С
Как программно открыть форму существующего объекта 1С: ОткрытьФорму, ПолучитьФорму, ключ записи регистра, примеры кода, ошибки и проверка результата.
Открытие формы уже существующего объекта — одна из самых частых задач при доработке конфигураций 1С: показать пользователю документ из отчёта, открыть карточку контрагента по клику, перейти к записи регистра из обработки. В отличие от открытия формы нового объекта, здесь ключевой момент — передать в форму ссылку на существующий элемент, чтобы платформа загрузила его данные из базы.
В управляемом приложении основной инструмент — функция ОткрытьФорму() с параметром Ключ, содержащим ссылку на объект. В обычном приложении и в сценариях, где нужна не только форма, но и доступ к ней до открытия, используется ПолучитьФорму(). В типовых конфигурациях на БСП часть задач решается через общий модуль ОбщегоНазначенияБП или навигационные ссылки без программного открытия.
Ниже разобраны все рабочие способы: от простого открытия документа по ссылке до открытия записи регистра сведений и обработки ситуаций, когда форма уже открыта или у пользователя нет прав.
Как платформа решает, какой объект показать
Любая форма объекта в 1С имеет стандартный параметр Ключ. Если при открытии формы в этот параметр передана ссылка, платформа считывает объект из базы данных и заполняет форму его данными. Если параметр Ключ не передан или пуст, открывается форма нового объекта — именно поэтому передача ссылки является решающим условием.
Для регистров сведений роль ключа выполняет не ссылка, а ключ записи — специальный объект, содержащий значения измерений (и периода для периодических регистров). Для планов обмена, справочников, документов и задач ключом всегда выступает обычная ссылка.
Важно понимать: платформа не проверяет «существование» ссылки заранее. Если передать битую ссылку (объект удалён), форма откроется с сообщением о том, что объект не найден, либо с ошибкой в зависимости от режима работы. Поэтому перед открытием полезно проверять ссылку на валидность.
Открытие формы через ОткрытьФорму()
Функция ОткрытьФорму() — стандартный способ в управляемом приложении. Первый параметр — полное имя формы, второй — структура параметров. Минимальный рабочий пример для документа:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
Имя формы можно указывать полностью, как в примере, или использовать сокращённый вариант "Документ.РеализацияТоваровУслуг.ФормаОбъекта" — тогда платформа возьмёт форму, назначенную основной в конфигураторе. Полный путь к конкретной форме надёжнее, когда у объекта несколько форм и нужна определённая.
Функция возвращает ссылку на открытую форму, что позволяет дальше работать с ней программно: например, получить форму в переменную и обратиться к её реквизитам или вызвать её экспортные процедуры.
Открытие с владельцем и блокировкой окна
Третий параметр ОткрытьФорму() задаёт владельца формы — обычно текущую форму или элемент управления. Владелец нужен, чтобы при закрытии родительской формы закрылась и дочерняя, а также для организации оповещений. Четвёртый параметр — ключ уникальности: если передать, например, ссылку, то повторный вызов с тем же ключом не откроет вторую копию формы, а активирует уже открытую.
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента",
ПараметрыФормы,
ЭтотОбъект, // владелец
СсылкаНаКонтрагента, // ключ уникальности
, // окно
, // навигационная ссылка
, // описание оповещения о закрытии
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);Когда нужен ПолучитьФорму()
ПолучитьФорму() отличается тем, что возвращает объект формы до её отображения. Это нужно, когда требуется что-то настроить в форме программно — заполнить дополнительные реквизиты, подготовить данные — и только потом показать её пользователю методом Открыть() или ОткрытьМодально().
ФормаДокумента = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);
// дополнительная настройка формы
ФормаДокумента.Открыть();
В управляемом приложении ПолучитьФорму() применяется редко: почти всё, что раньше делалось через получение формы, теперь решается передачей параметров при ОткрытьФорму() и обработкой их в событии ПриСозданииНаСервере целевой формы. В обычном приложении ПолучитьФорму() остаётся основным способом, так как ОткрытьФорму() там недоступна.
ОткрытьФорму или ПолучитьФорму
Стандарт для управляемого приложения. Форма открывается сразу, вся подготовка — через параметры и ПриСозданииНаСервере. Подходит в большинстве случаев.
Нужна, когда до показа формы требуется программный доступ к ней, и в обычном приложении. Избыточна для простого показа объекта.
Открывает объект по ссылке вида e1cib/data/... без указания формы. Подходит, когда тип объекта заранее неизвестен.
Открытие записи регистра сведений
У записи регистра сведений нет ссылки, поэтому в параметр Ключ передаётся ключ записи, который создаётся менеджером регистра. Значения измерений должны точно соответствовать существующей записи — иначе откроется форма новой записи с заполненными измерениями.
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Организация", Организация);
ЗначенияКлюча.Вставить("Контрагент", Контрагент);
КлючЗаписи = РегистрыСведений.ОтветственныеЛица.СоздатьКлючЗаписи(ЗначенияКлюча);
ПараметрыФормы = Новый Структура("Ключ", КлючЗаписи);
ОткрытьФорму("РегистрСведений.ОтветственныеЛица.Форма.ФормаЗаписи", ПараметрыФормы);
Для периодического регистра в структуру значений ключа дополнительно включается Период. Если регистр подчинён регистратору, в ключ входит регистратор, и чаще в таких случаях открывают не отдельную запись, а сам документ-регистратор.
Открытие объекта по навигационной ссылке
Когда тип объекта заранее неизвестен (например, пользователь вставил ссылку в поле обработки), удобно открывать форму через навигационную ссылку методом ПерейтиПоНавигационнойСсылке(). Навигационную ссылку на объект можно получить функцией ПолучитьНавигационнуюСсылку(СсылкаНаОбъект).
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);
Платформа сама определит тип объекта и откроет его основную форму. Минус способа — нельзя указать конкретную нестандартную форму и передать дополнительные параметры, поэтому для управляемых сценариев предпочтительнее ОткрытьФорму().
Проверки перед открытием и типичные ошибки
Перед открытием формы существующего объекта стоит убедиться, что ссылка не пустая и объект реально существует в базе. Проверка существования выполняется через запрос или попытку обращения к реквизиту ссылки в попытке — для серверного кода лучше запрос, так как он не вызывает исключение при битой ссылке.
Ещё одна обязательная проверка — права пользователя. Если у пользователя нет права «Просмотр» на объект, открытие формы завершится ошибкой нарушения прав доступа. В коробочных обработках такую ситуацию лучше перехватывать и показывать понятное сообщение.
Проверка результата после внедрения
После добавления кода открытия формы проверьте сценарий на трёх наборах данных: обычный существующий объект, удалённый объект (битая ссылка) и объект, на который у тестового пользователя нет прав. Во всех трёх случаях поведение должно быть предсказуемым: форма открылась, показано понятное сообщение, показано сообщение о недостатке прав.
Дополнительно убедитесь, что повторный вызов не плодит дубликаты окон, если используется ключ уникальности, и что форма открывается именно та, которая задумана, — особенно когда у объекта несколько форм элемента.
Как проверить результат
Форма открывается с данными объекта
Форма пустая — ключ не дошёл до формы
Понятное сообщение пользователю
Исключение платформы или окно с ошибкой
Активируется уже открытая форма
Открывается вторая копия окна
Корректное сообщение о недоступности
Аварийное завершение с ошибкой прав
Что важно запомнить
Существующий объект открывается передачей ссылки в параметр Ключ функции ОткрытьФорму; для регистров сведений вместо ссылки строится ключ записи. Открытие выполняется только на клиенте, ссылку и права стоит проверять заранее, а от дублей окон защищает ключ уникальности.
Частые вопросы
Форма открывается пустой, хотя ссылка передана. В чём причина?
Чаще всего ссылка передана не в стандартный параметр «Ключ», а в параметр с другим именем, который форма не обрабатывает. Проверьте, что структура параметров содержит именно ключ «Ключ», и что в событии ПриСозданииНаСервере целевой формы нет кода, очищающего объект.
Можно ли открыть форму объекта на сервере?
Нет. ОткрытьФорму и ПолучитьФорму доступны только в клиентском контексте. На сервере можно подготовить ссылку, проверить права и сформировать параметры, а сам вызов открытия должен выполняться в клиентской процедуре.
Как открыть форму элемента справочника из табличной части документа?
В обработчике события Выбор или ПриАктивизацииЯчейки табличной части получите ссылку из текущей строки (Элементы.ИмяТаблицы.ТекущиеДанные.ИмяРеквизита) и вызовите ОткрытьФорму с параметром Ключ. Проверьте, что ссылка не пустая, чтобы не открывать форму нового элемента.
Как открыть форму и получить результат её работы обратно?
Передайте в ОткрытьФорму описание оповещения о закрытии (предпоследний параметр). Когда форма закроется, выполнится указанная процедура, в которую будет передано возвращаемое значение формы, если она закрыта методом Закрыть с параметром.
Чем отличается открытие формы в тонком клиенте и веб-клиенте?
Синтаксис одинаковый, но в веб-клиенте строже ограничения на модальные вызовы и работу с окнами. Режим БлокироватьОкноВладельца поддерживается везде, а устаревший ОткрытьМодально в веб-клиенте требует специальной настройки браузера и использовать его не рекомендуется.
Как открыть конкретную нестандартную форму объекта, а не основную?
Укажите полный путь к форме в первом параметре ОткрытьФорму, например «Документ.ЗаказКлиента.Форма.ФормаДокументаРасширенная». Параметр Ключ передаётся так же — нестандартная форма обязана поддерживать стандартный параметр Ключ, что выполняется автоматически для форм объекта.