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

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

Как открыть форму записанного документа в 1С

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

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

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

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

Основной способ: ОткрытьФорму с параметром Ключ

Универсальный и рекомендуемый метод — глобальный метод ОткрытьФорму(). Он доступен только в клиентском контексте (тонкий, толстый, веб-клиент), потому что открытие формы — это интерактивное действие пользовательского интерфейса. Минимальный вызов выглядит так:

&НаКлиенте

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

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

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

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

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

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

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

Порядок действий
  1. 1
    Убедитесь, что документ записан и у вас есть его ссылка (ДокументСсылка)
  2. 2
    Сформируйте структуру параметров и добавьте ключ "Ключ" со ссылкой
  3. 3
    Вызовите ОткрытьФорму с полным именем формы документа на клиенте
  4. 4
    Проверьте, что открылась форма именно нужного документа — сверьте номер и дату в заголовке

Быстрая альтернатива: ОткрытьЗначение и ПоказатьЗначение

Если не нужно передавать дополнительные параметры, достаточно метода ПоказатьЗначение() (асинхронный, рекомендуемый) или устаревшего модального ОткрытьЗначение(). Платформа сама определит по типу ссылки, какую форму открыть:

&НаКлиенте

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

ПоказатьЗначение(, СсылкаНаДокумент);

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

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

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

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

ОткрытьФорму с Ключ

Полный контроль: параметры, владелец, оповещение о закрытии, уникальность. Подходит для большинства сценариев

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

Быстро и просто, без параметров. Подходит для простого просмотра по ссылке

ОткрытьЗначение

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

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

Даёт доступ к объекту формы до открытия, но сложнее и чаще не нужен

Открытие формы с сервера: почему напрямую нельзя

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

&НаКлиенте

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

НоваяСсылка = СоздатьДокументНаСервере();

Если ЗначениеЗаполнено(НоваяСсылка) Тогда

ПоказатьЗначение(, НоваяСсылка);

КонецЕсли;

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

&НаСервере

Функция СоздатьДокументНаСервере()

Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

Док.Дата = ТекущаяДатаСеанса();

// заполнение реквизитов

Док.Записать();

Возврат Док.Ссылка;

КонецФункции

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

Дополнительные параметры: владелец, уникальность, режим просмотра

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

Первый — описание оповещения о закрытии. Если после закрытия формы документа нужно обновить список или выполнить действие, передайте ОписаниеОповещения:

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);

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

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

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

Типичные ошибки и их диагностика

Большинство проблем при открытии формы документа сводится к нескольким повторяющимся причинам. Знание признаков экономит время отладки.

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

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

Ошибка прав доступа при открытии. У пользователя нет права «Просмотр» на документ. Форма при этом может не открыться вовсе, а в журнале регистрации появится запись о нарушении прав. Проверяйте роли пользователя, а не код.

Форма открывается, но данные устаревшие. Если документ был изменён в другом сеансе после того, как вы получили ссылку, форма покажет актуальные данные из базы — ссылка сама данные не хранит. А вот если вы открываете форму, а она уже была открыта и в ней есть несохранённые изменения, платформа активирует именно её — с незаписанными правками другого окна.

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

Проверка результата и границы самостоятельной работы

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

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

Безопасная граница самостоятельной работы — клиентский код открытия форм и простые серверные функции поиска ссылки. Изменение типовых форм, механизмов блокировки данных и прав доступа лучше выполнять с копией базы и пониманием архитектуры конкретной конфигурации.

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

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

Тип значения в параметре Ключ
Норма

ДокументСсылка нужного вида, ЗначениеЗаполнено = Истина

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

Неопределено, пустая ссылка или ДокументОбъект

Открывшаяся форма
Норма

Заголовок содержит номер и дату нужного документа

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

Форма нового документа без номера

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

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

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

Открываются дубликаты окон одного документа

Работа под ограниченными правами
Норма

Форма открывается или выдаётся понятное сообщение о правах

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

Нефиксируемое падение без записи в журнале регистрации

Итог

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

Форма записанного документа открывается через ОткрытьФорму с параметром Ключ, содержащим ссылку, либо через ПоказатьЗначение для простых случаев. Открытие возможно только на клиенте; сервер должен вернуть ссылку. Проверяйте тип и заполненность ссылки — это устраняет большинство ошибок.

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

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

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

Как открыть форму документа из внешней обработки?

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

Почему ОткрытьФорму не работает в фоновом задании?

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

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

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

Чем отличается ФормаОбъекта от Форма.ФормаДокумента в имени формы?

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

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

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