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

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

1С: как получить форму по ссылке

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

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

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

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

Что происходит при получении формы по ссылке

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

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

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

Метод ПолучитьФорму: синтаксис и пример

Метод ПолучитьФорму() возвращает объект формы, который можно дополнительно настроить перед открытием или вообще не открывать — например, использовать для программного заполнения. Основные параметры: имя формы (или полный путь вида «Справочник.Номенклатура.Форма.ФормаЭлемента»), структура параметров и владелец формы.

Типовой пример для управляемого приложения — открыть форму элемента справочника по ссылке:

&НаКлиенте

Процедура ОткрытьКарточку(Команда)

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

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

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

Форма.Открыть();

КонецПроцедуры

Если имя формы не указано явно, можно запросить форму по умолчанию — платформа сама подставит основную форму объекта. Однако в коде с неявными именами сложнее отлаживать ошибки, поэтому в прикладных решениях имя формы обычно указывают полностью.

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

1c
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
Форма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
Форма.Открыть();

ОткрытьФорму: когда достаточно показать форму

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

&НаКлиенте

Процедура ПоказатьДокумент(Команда)

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

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

КонецПроцедуры

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

Сравнение вариантов

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

Когда нужно программно настроить форму перед показом: установить заголовок, изменить доступность элементов, передать дополнительные данные. Требует явного вызова Открыть().

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

Когда нужно просто показать форму по ссылке или организовать выбор с оповещением о закрытии. Меньше кода, но нет доступа к форме до её открытия.

ПоказатьЗначение

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

Получение формы в обычном приложении

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

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

Форма.УстановитьСсылку(ТекущаяСсылка);

Форма.Открыть();

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

Форма нового объекта на основании существующего

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

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

ПараметрыФормы.Вставить("Основание", СсылкаНаЗаказ);

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

При таком открытии сработает обработчик ОбработкаЗаполнения документа, и форма откроется уже заполненной по данным основания, но объект в базе ещё не будет записан. Это принципиальное отличие от параметра Ключ: с Ключ вы работаете с существующей записью, с Основание — создаёте новую.

Похожим образом работает параметр ЗначениеКопирования — форма откроется для нового объекта, скопированного с переданной ссылки. Не путайте эти три параметра, иначе получите либо незаполненную форму, либо случайное редактирование чужого документа.

Маршрут решения

Как выбрать параметр

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

Проверка результата и типичные ошибки

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

Наиболее частые причины проблем: передача в Ключ значения не того типа (например, строки вместо ссылки), обращение к несуществующему имени формы (ошибка «Форма не найдена»), вызов методов формы на сервере в управляемом приложении и попытка получить форму объекта, на который у пользователя нет прав — в этом случае сработает механизм разграничения доступа, и форма либо не откроется, либо откроется с ошибкой доступа.

Типичные ошибки
01
Передана пустая или незаполненная структура параметров — открывается форма нового элемента вместо существующего.
02
Вызов ПолучитьФорму без последующего Открыть() — форма создана в памяти, но пользователь её не видит.
03
Вызов ОткрытьФорму в серверной процедуре — ошибка выполнения, формы создаются только на клиенте.
04
Опечатка в полном имени формы — исключение «Форма не найдена»; проверяйте имя в конфигураторе.
05
Передача в «Ключ» значения не-ссылки (строки, числа) — форма открывается пустой или падает с ошибкой приведения типа.

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

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

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

Заголовок открывшейся формы
Норма

Содержит представление существующего объекта (наименование, номер и дату)

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

Показывает «создание» или пустое представление — ключ не передан

Заполненность полей
Норма

Реквизиты соответствуют данным объекта в базе

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

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

Поведение при закрытии
Норма

Форма закрывается без вопроса о записи, если ничего не меняли

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

Предлагает записать «новый» объект — открыта форма создания

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

Форма открывается без сообщений о нарушении прав

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

Ошибка доступа — настройте роли или используйте привилегированный режим на сервере для чтения данных

FAQ

Можно ли получить форму по ссылке, не зная типа объекта?

Да. Используйте ПоказатьЗначение(Неопределено, Ссылка) — платформа сама определит тип ссылки и откроет основную форму объекта. Если нужна конкретная нестандартная форма, тип придётся определить через ТипЗнч(Ссылка) и метаданные, а затем построить имя формы программно.

Почему форма открывается пустой, хотя ссылка передана?

Чаще всего параметр назван неправильно (например, «КлючОбъекта» вместо «Ключ») или в структуре параметров лежит пустая ссылка. Проверьте имя параметра и значение в отладчике. Также убедитесь, что передаёте именно ссылку, а не строковое представление или уникальный идентификатор.

Как открыть форму по уникальному идентификатору, а не по ссылке?

Сначала получите ссылку из идентификатора через менеджер объекта: Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)), затем передайте её в параметре «Ключ» как обычно. Перед открытием желательно проверить, что объект с такой ссылкой существует.

Можно ли получить форму на сервере и заполнить её данными?

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

Как открыть форму по ссылке в модальном режиме?

В управляемом приложении используйте ОткрытьФорму() с параметром РежимОткрытияОкна, установленным в БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс, и обрабатывайте результат через описание оповещения о закрытии. Устаревший метод ОткрытьМодально() в новых разработках применять не рекомендуется.

Итог

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

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