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