Как программно открыть форму существующего документа в 1С 8.3 без использования модальности?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Почему возникают ошибки при открытии формы?

Разберем типичные ошибки, которые допускаются при решении этой задачи:

  1. Использование устаревшего метода ОткрытьЗначение: Если в свойствах конфигурации параметр Режим использования модальности установлен в значение Не использовать (стандарт для большинства современных конфигураций на базе БСП), вызов метода ОткрытьЗначение приводит к ошибке выполнения.
  2. Неверное имя параметра в структуре параметров формы: Платформа 1С определяет, какой именно объект нужно загрузить в форму, по системному параметру Ключ. Если передать ссылку с произвольным именем (например, Объект или ДокументСсылка), форма не найдет параметра Ключ и инициализирует новый пустой документ.
  3. Использование устаревшего метода ПолучитьФорму: Данный метод не рекомендуется использовать в управляемом приложении, так как он создает избыточный экземпляр формы и усложняет клиент-серверное взаимодействие. Основным методом является глобальная функция ОткрытьФорму.

Способ 1. Использование безмодального метода «ПоказатьЗначение»

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

Посмотрим на пример его использования на клиенте:


ТекущаяСтрока = Элементы.ЗаявкиНаПередачу.ТекущиеДанные;

Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Заявка) Тогда
    ПоказатьЗначение(, ТекущаяСтрока.Заявка);
КонецЕсли;

Особенности метода ПоказатьЗначение:

  1. Метод работает асинхронно и не блокирует интерфейс.
  2. Первым параметром можно передать ОписаниеОповещения, если после закрытия окна необходимо выполнить дальнейшую обработку.
  3. Метод всегда открывает основную форму объекта, заданную в метаданных по умолчанию.

Способ 2. Рекомендуемый стандарт: метод «ОткрытьФорму» с параметром «Ключ»

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

Разберем по шагам правильный программный код:


ТекущаяСтрока = Элементы.ЗаявкиНаПередачу.ТекущиеДанные;

Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Заявка) Тогда
    ПараметрыФормы = Новый Структура("Ключ", ТекущаяСтрока.Заявка);
    ОткрытьФорму("Документ.ПередачаОСАрендатору.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;

Рассмотрим подробнее преимущества данного способа:

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

Способ 3. Открытие через навигационную ссылку

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

Посмотрим на реализацию этого варианта:


ТекущаяСтрока = Элементы.ЗаявкиНаПередачу.ТекущиеДанные;

Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Заявка) Тогда
    НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(ТекущаяСтрока.Заявка);
    ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);
КонецЕсли;

Этот метод также полностью поддерживает работу без модальности и активирует основную форму объекта в рабочей области пользователя.

Важные проверки перед вызовом

При обращении к данным интерфейсных элементов (табличных частей или динамических списков) на клиенте обязательно следует выполнять предварительные проверки:

  1. Проверка на наличие активной строки: Свойство ТекущиеДанные возвращает Неопределено, если список пуст или фокус установлен вне строк таблицы.
  2. Проверка заполненности ссылки: Если реквизит содержит пустую ссылку или не заполнен, передача такого значения в параметр Ключ приведет к открытию формы создания нового документа. Всегда используйте функцию ЗначениеЗаполнено перед вызовом формы.
← На главную