Открыть форму 1С программно: ОткрытьФорму и примеры

Дата: 19.09.2026 04:42:56
управляемая форма
ОткрытьФорму
параметры формы
ОписаниеОповещения
модальность
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

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

Где встречается задача

  • Диалог с ответом. Нужно спросить у пользователя дату, причину отмены или комментарий и продолжить работу с ответом. Раньше для этого был ОткрытьФормуМодально, но в типовых конфигурациях на 8.3 модальность, как правило, отключена.
  • Выбор значения. Подбор номенклатуры в табличную часть, выбор договора из списка.
  • Переход к связанным данным. Из документа открыть список документов того же контрагента или запись регистра сведений.

Иногда код не нужен вовсе. В редакторе формы на панели команд есть раздел «Глобальные команды»: оттуда можно перетащить на форму команду открытия списка или создания элемента. Код понадобится, когда форме нужно передать параметры или получить от неё ответ.

Как открыть форму 1С: синтаксис ОткрытьФорму

Метод работает только на клиенте, поэтому его вызывают из процедур с директивой &НаКлиенте. Полная сигнатура в 8.3:

ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)

ПараметрЧто передавать
ИмяФормыСтрока с полным именем формы, например "Справочник.Контрагенты.ФормаОбъекта". Единственный обязательный параметр.
ПараметрыСтруктура: ключ — имя параметра формы, значение — то, что передаёте. Стандартные параметры (Ключ, Отбор, ЗначенияЗаполнения и другие) объявлять не нужно, свои — нужно.
ВладелецФорма или элемент формы, откуда открываете, обычно ЭтотОбъект. Владельцу приходит событие ОбработкаВыбора, а режим БлокироватьОкноВладельца блокирует именно его окно.
УникальностьКлюч уникальности. Если форма с тем же именем и тем же ключом уже открыта, платформа активирует её вместо открытия второй копии.
ОкноОкно клиентского приложения, в котором показать форму. В прикладном коде почти всегда пропускают.
НавигационнаяСсылкаНавигационная ссылка, которую получит форма. Обычно не заполняют.
ОписаниеОповещенияОЗакрытииПроцедура, которую платформа вызовет после закрытия формы; в неё придёт результат закрытия.
РежимОткрытияОкнаЗначение РежимОткрытияОкнаФормы: Независимый, БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс. Если не указан, берётся из свойства самой формы.

Два последних параметра появились вместе с режимом работы без модальных окон (платформа 8.3.3). Функция возвращает открытую форму или Неопределено, если форма не открылась — например, в её ПриСозданииНаСервере установлен Отказ. Главное: вызов не ждёт, пока пользователь закроет окно. Код после ОткрытьФорму выполняется сразу, а ответ пользователя приходит только в процедуру оповещения.

Имена форм

Имя собирается по схеме «вид объекта в единственном числе.имя объекта.стандартная форма». Для произвольной формы объекта перед её именем ставится слово Форма.

Что открытьИмя формы
Карточку элемента или документСправочник.Контрагенты.ФормаОбъекта, Документ.ЗаказКлиента.ФормаОбъекта
Группу справочникаСправочник.Номенклатура.ФормаГруппы
Список, выбор элемента, выбор группы…ФормаСписка, …ФормаВыбора, …ФормаВыбораГруппы
Запись регистра сведенийРегистрСведений.КурсыВалют.ФормаЗаписи
Основную форму обработки или отчётаОбработка.ЗагрузкаЦен.Форма, Отчет.ОстаткиТоваров.Форма
Конкретную форму объектаДокумент.ЗаказКлиента.Форма.ФормаПечати
Общую формуОбщаяФорма.ВводКомментария

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

Готовые шаблоны кода

Все примеры — процедуры модуля управляемой формы. Имена объектов взяты из типовых конфигураций для наглядности, а структура данных в них различается: например, в БП 3.0 договор подчинён контрагенту, а в УТ 11 и ERP — нет. Имена объектов и реквизитов замените на свои.

По кнопке открыть форму обработки

Создайте команду формы, вынесите её на командную панель и назначьте обработчик:

&НаКлиенте
Процедура ОткрытьЗагрузкуЦен(Команда)

	ОткрытьФорму("Обработка.ЗагрузкаЦен.Форма", , ЭтотОбъект);

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

Если нужно несколько одинаковых окон, например два экземпляра обработки с разными настройками, передайте новый ключ уникальности. Каждый вызов с Новый УникальныйИдентификатор открывает отдельное окно:

&НаКлиенте
Процедура НовоеОкноЗагрузки(Команда)

	// Новый идентификатор при каждом вызове = всегда новое окно
	ОткрытьФорму("Обработка.ЗагрузкаЦен.Форма", , , Новый УникальныйИдентификатор);

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

Открыть карточку по ссылке и создать новый объект

&НаКлиенте
Процедура ОткрытьКарточкуКонтрагента(Команда)

	Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
		Возврат;
	КонецЕсли;

	ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта",
		Новый Структура("Ключ", Объект.Контрагент), ЭтотОбъект);

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

&НаКлиенте
Процедура СоздатьДоговор(Команда)

	ЗначенияЗаполнения = Новый Структура;
	// Схема БП 3.0: договор подчинён контрагенту. В УТ 11/ERP вместо Владелец - реквизиты Контрагент/Партнер
	ЗначенияЗаполнения.Вставить("Владелец", Объект.Контрагент);
	// Заполнится автоматически, только если у реквизита включено «Заполнять из данных заполнения»
	ЗначенияЗаполнения.Вставить("Организация", Объект.Организация);

	ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаОбъекта",
		Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения), ЭтотОбъект);

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

&НаКлиенте
Процедура СоздатьРеализацию(Команда)

	Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		ПоказатьПредупреждение(, "Сначала запишите заказ.");
		Возврат;
	КонецЕсли;

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

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

Разбор параметров:

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

Для документа по ссылке есть и короткий путь — ПоказатьЗначение(, Ссылка). Варианты и подводные камни собраны в статье про открытие формы документа по ссылке.

Список с отбором и курсором на нужной строке

&НаКлиенте
Процедура ЗаказыКонтрагента(Команда)

	Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", Объект.Контрагент));
	ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Ссылка);

	// Ключ уникальности - контрагент: одно окно списка на каждого контрагента
	ОткрытьФорму("Документ.ЗаказКлиента.ФормаСписка", ПараметрыФормы, ЭтотОбъект, Объект.Контрагент);

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

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

Выбрать значение и получить его в коде

&НаКлиенте
Процедура ПодобратьНоменклатуру(Команда)

	Оповещение = Новый ОписаниеОповещения("ПодобратьНоменклатуруЗавершение", ЭтотОбъект);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , ЭтотОбъект, , , ,
		Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте
Процедура ПодобратьНоменклатуруЗавершение(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт

	Если ВыбранноеЗначение = Неопределено Тогда
		Возврат; // окно закрыли без выбора
	КонецЕсли;

	НоваяСтрока = Объект.Товары.Добавить();
	НоваяСтрока.Номенклатура = ВыбранноеЗначение;
	Модифицированность = Истина;

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

В обработчик оповещения придёт выбранная ссылка, если пользователь выбрал значение, и Неопределено, если он закрыл окно. Раньше этот сценарий решали через событие ОбработкаВыбора формы-владельца. Оно по-прежнему работает, но с оповещением код вызова и код обработки результата лежат рядом, и форме не нужно разбирать ИсточникВыбора, когда она запрашивает несколько разных значений.

Своя форма, которая возвращает результат

Это замена ОткрытьФормуМодально для конфигураций без модальности. Код вызывающей формы:

&НаКлиенте
Процедура ЗаполнитьКомментарий(Команда)

	Оповещение = Новый ОписаниеОповещения("ЗаполнитьКомментарийЗавершение", ЭтотОбъект);
	ПараметрыФормы = Новый Структура("ТекстПоУмолчанию", Объект.Комментарий);

	ОткрытьФорму("ОбщаяФорма.ВводКомментария", ПараметрыФормы, ЭтотОбъект, , , ,
		Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте
Процедура ЗаполнитьКомментарийЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат; // закрыли крестиком или по Esc
	КонецЕсли;

	Объект.Комментарий = Результат;
	Модифицированность = Истина;

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

Модуль вызываемой общей формы. Параметр ТекстПоУмолчанию добавляют на вкладке «Параметры» редактора формы:

// Модуль общей формы ВводКомментария
// Реквизит формы: Текст (Строка). Параметр формы: ТекстПоУмолчанию (Строка).

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Текст = Параметры.ТекстПоУмолчанию;

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

&НаКлиенте
Процедура Готово(Команда)

	Закрыть(Текст); // значение уйдёт в обработчик оповещения вызывающей формы

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

Разбор ключевых строк:

  • Закрыть(Текст) — значение, переданное в Закрыть, становится результатом закрытия и приходит в первый параметр обработчика. Если окно закрыли крестиком, придёт Неопределено.
  • БлокироватьОкноВладельца — пока диалог открыт, документ не отредактировать, но остальные окна программы доступны. Для вопросов, которые касаются всей программы, подходит БлокироватьВесьИнтерфейс.
  • Третий параметр конструктора ОписаниеОповещенияДополнительныеПараметры. Туда удобно положить, например, идентификатор строки табличной части, которую нужно обновить после ответа.
  • Обработчик объявлен с директивой &НаКлиенте и словом Экспорт. Имя процедуры задаётся строкой, поэтому опечатку компилятор не заметит: ошибка появится только при закрытии формы.

ПолучитьФорму: настроить форму до открытия

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

&НаКлиенте
Процедура ОткрытьЗагрузкуСОповещением(Команда)

	Форма = ПолучитьФорму("Обработка.ЗагрузкаЦен.Форма", , ЭтотОбъект, Новый УникальныйИдентификатор);
	Форма.ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ЗагрузкаЦенЗавершение", ЭтотОбъект);
	Форма.Открыть();

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

&НаКлиенте
Процедура ЗагрузкаЦенЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Элементы.Список.Обновить(); // вызывающая форма здесь - форма списка: перечитать данные

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

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

Обычные формы

В обычном приложении (толстый клиент, конфигурации вроде УТ 10.3) формы чаще открывают через менеджеры и методы объектов: ПолучитьФормуНовогоЭлемента, ПолучитьФорму и затем Открыть() или ОткрытьМодально(). Модальность там, как правило, разрешена, и результат возвращает сам ОткрытьМодально().

// Обычное приложение, модуль обычной формы документа (толстый клиент)

Процедура КнопкаКарточкаКонтрагентаНажатие(Элемент)

	Если ЗначениеЗаполнено(Контрагент) Тогда
		ОткрытьЗначение(Контрагент); // реквизиты документа в модуле обычной формы доступны напрямую
	КонецЕсли;

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

Процедура КнопкаНовыйКонтрагентНажатие(Элемент)

	Форма = Справочники.Контрагенты.ПолучитьФормуНовогоЭлемента();
	Форма.Открыть();

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

Типичные ошибки

  • Вызов на сервере. ОткрытьФорму внутри процедуры &НаСервере не компилируется: на сервере нет интерфейса. Модуль не пройдёт проверку с ошибкой вида «Процедура или функция с указанным именем не определена (ОткрытьФорму)». Серверная функция должна вернуть данные на клиент, а форму открывает клиентская процедура.
  • Модальный вызов при отключённой модальности. ОткрытьФормуМодально в конфигурации со свойством «Режим использования модальности» = «Не использовать» даёт «Использование модальных окон в данном режиме запрещено!». Замените его на ОткрытьФорму с оповещением и блокирующим режимом окна.
  • Ожидание результата на следующей строке. Код, который сразу после ОткрытьФорму читает данные из открытой формы, получит их до того, как пользователь что-то ввёл. Всё, что зависит от ответа, переносите в обработчик оповещения.
  • Неверное имя формы. Множественное число (Справочники.Контрагенты.ФормаОбъекта), пропущенное слово Форма перед именем произвольной формы, старое имя после переименования. Имя — обычная строка, компилятор его не проверяет, ошибка возникнет при выполнении.
  • Свой параметр не объявлен в форме. Если ТекстПоУмолчанию не добавлен в параметры формы, значение до неё не дойдёт, а обращение Параметры.ТекстПоУмолчанию завершится ошибкой «Поле объекта не обнаружено (ТекстПоУмолчанию)».
  • Форма уже открыта, а параметры новые. Повторный вызов с тем же ключом уникальности активирует старое окно: ПриСозданииНаСервере не выполняется, новые параметры не применяются. Передавайте осмысленный ключ — например, ссылку, для которой открываете форму.
  • Код из обычных форм в управляемой. Справочники.Контрагенты.ПолучитьФормуНовогоЭлемента() в клиентской процедуре управляемой формы не скомпилируется: менеджеры объектов на тонком клиенте недоступны, будет «Переменная не определена (Справочники)».

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

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

Передайте ОписаниеОповещенияОЗакрытии и режим БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс. Для пользователя окно ведёт себя как модальное, а код продолжается в обработчике оповещения, а не на следующей строке.

Чем ОткрытьФорму отличается от ПолучитьФорму?

ОткрытьФорму создаёт форму и сразу показывает её. ПолучитьФорму только создаёт объект формы: его можно донастроить и открыть методом Открыть(). В большинстве задач хватает первого варианта с параметрами.

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

Нет, интерфейс существует только на клиенте. Серверная процедура готовит данные, клиентская открывает форму. Если форму нужно показать после записи документа, делайте это в клиентском событии ПослеЗаписи формы объекта.

Как в 1С открыть другую форму того же объекта?

Укажите её имя через слово Форма: "Документ.ЗаказКлиента.Форма.ФормаПечати". Стандартные имена ФормаОбъекта и ФормаСписка открывают формы, которые назначены основными в свойствах объекта.

Почему форма открывается пустой, хотя я передал ссылку?

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

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.