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