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

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

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

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

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

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

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

Принцип: сначала запись, потом открытие

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

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

&НаСервере

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

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

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

НовыйДок.Контрагент = Контрагент;

НовыйДок.Записать(РежимЗаписиДокумента.Запись);

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

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

&НаКлиенте

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

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

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

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

Способ 1. ОткрытьЗначение — самый простой вариант

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

&НаКлиенте

Процедура ПоказатьДокумент(Ссылка)

ОткрытьЗначение(Ссылка);

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

Ограничения способа: нельзя передать параметры открытия, нельзя задать режим блокировки окна, нельзя обработать закрытие формы. Если требуется хоть что-то из перечисленного — используйте ОткрытьФорму(). Также учтите, что в тонком клиенте ОткрытьЗначение() работает корректно, но в веб-клиенте поведение при повторном открытии того же объекта может отличаться: платформа активирует уже открытое окно вместо создания нового.

Способ 2. ОткрытьФорму с ключом — полный контроль

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

&НаКлиенте

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

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

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

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

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

&НаКлиенте

Процедура ОткрытьСОповещением(Ссылка)

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

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

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеЗакрытияДокумента(Результат, ДопПараметры) Экспорт

Элементы.Список.Обновить();

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

Открытие формы нового документа с заполнением

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

&НаКлиенте

Процедура ОткрытьНовыйЗаполненный()

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Контрагент", Контрагент);

ЗначенияЗаполнения.Вставить("Организация", Организация);

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

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

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

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

Когда какой параметр выбирать

Основание — когда существует документ-источник и в модуле объекта реализована ОбработкаЗаполнения для этого типа. ЗначенияЗаполнения — когда нужно подставить отдельные реквизиты шапки из произвольных данных. Собственные параметры формы — когда стандартных механизмов недостаточно и логика заполнения размещается в форме.

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

ОткрытьЗначение(Ссылка)

Простейший вызов для записанного документа. Не принимает параметры и не поддерживает оповещение о закрытии.

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

Записанный документ с полным контролем: владелец, уникальность, оповещение о закрытии. Требует точного имени формы.

ОткрытьФорму с ЗначенияЗаполнения

Новый незаписанный документ с предзаполненными реквизитами. Решение о записи остаётся за пользователем.

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

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

ПоказатьЗначение и асинхронная модель

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

&НаКлиенте

Процедура ПоказатьДокументАсинхронно(Ссылка)

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

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

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

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

Открытие документа из внешней обработки и по команде

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

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

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

Самая частая проблема — открывается форма нового пустого документа вместо созданного. Причина почти всегда одна: документ не был записан перед получением ссылки, либо запись завершилась исключением, которое «проглотили» через Попытка..Исключение без обработки. Проверяйте НовыйДок.Ссылка.Пустая() после записи и не скрывайте ошибки проведения.

Вторая типичная ошибка — неверное имя формы в ОткрытьФорму(). Если у документа переопределена основная форма объекта, а вы указываете несуществующий путь, платформа выдаст ошибку «Форма не найдена». Безопасный вариант — не указывать имя формы вовсе, а открывать через ОткрытьЗначение(), тогда платформа сама возьмёт форму по умолчанию.

Третья группа проблем — потеря контекста при клиент-серверном взаимодействии: ссылка получена на сервере, но не возвращена в клиентскую процедуру, либо открытие вызывается в теле серверной процедуры. Структурируйте код так, чтобы граница «сервер — клиент» была явной: сервер возвращает ссылку, клиент открывает форму.

Типичные ошибки
01
Открытие формы до Записать() — ссылка пустая, открывается новый пустой документ вместо созданного.
02
Вызов ОткрытьФорму в серверной процедуре — ошибка выполнения, так как интерактивные методы доступны только на клиенте.
03
Передача в параметр Ключ значения Неопределено или пустой ссылки — вместо существующего документа открывается форма нового.
04
Исключение при проведении скрыто через Попытка/Исключение — код продолжает работу с несуществующей ссылкой.
05
Указание несуществующего имени формы в ОткрытьФорму — ошибка 'Форма не найдена' при выполнении.

Проверка результата после открытия

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

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

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

Ссылка после Записать()
Норма

Ссылка не пустая, документ находится запросом и виден в списке

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

Ссылка пустая — запись не выполнена, форма откроется пустой

Открытая форма
Норма

В заголовке номер и дата созданного документа, реквизиты заполнены

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

Форма нового документа без номера — передан неверный ключ

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

Каждый вызов создаёт и открывает новый документ осознанно, дублей нет

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

При каждом нажатии плодятся одинаковые документы без контроля

FAQ: частые вопросы об открытии документов программно

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

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

Почему ОткрытьЗначение не работает на сервере?

Интерактивные методы (ОткрытьЗначение, ОткрытьФорму, ПоказатьЗначение) доступны только в клиентском контексте, потому что им нужен пользовательский интерфейс. На сервере создайте и запишите документ, верните ссылку в клиентскую процедуру и откройте форму там.

Как открыть документ и запретить его изменение?

Откройте форму через ОткрытьФорму, а в самой форме документа предусмотрите режим просмотра. Универсального параметра «только чтение» у ОткрытьФорму нет; обычно используют функциональные опции, роли или обработку параметра в ПриСозданииНаСервере с установкой ТолькоПросмотр = Истина.

Чем Ключ отличается от Основания в параметрах формы?

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

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

Напрямую — никак: у фонового сеанса нет интерфейса. Сохраните ссылку в доступном месте (регистр сведений, параметр сеанса, реквизит формы-инициатора) и при возврате управления на клиент проверьте результат и откройте форму через ОткрытьЗначение.

Почему форма открывается, но табличная часть пустая?

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

Итог

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

Документ сначала записывается на сервере, затем его ссылка передаётся на клиент, где форма открывается через ОткрытьЗначение или ОткрытьФорму с параметром Ключ. Для нового незаписанного документа используются ЗначенияЗаполнения или Основание. Интерактивные методы недоступны на сервере и в фоновых заданиях, а пустая ссылка в параметре Ключ всегда открывает форму нового документа.