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

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

Как открыть форму при нажатии на кнопку в 1С

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

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

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

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

Создание команды и кнопки в форме

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

После создания команды перетащите её из списка команд в дерево элементов формы — в командную панель или в нужную группу. Платформа автоматически создаст кнопку, связанную с этой командой. Альтернатива — добавить кнопку вручную через «Добавить → Кнопка» и указать ей имя команды в свойстве ИмяКоманды.

Для команды обязательно создайте обработчик действия: в свойствах команды нажмите кнопку с лупой у события «Действие». Платформа предложит тип обработчика — выбирайте «На клиенте», если открытие формы не требует обращения к серверу. Это быстрее и не создаёт лишних серверных вызовов.

Открытие формы методом ОткрытьФорму

Основной способ — глобальный метод ОткрытьФорму(). В простейшем виде обработчик выглядит так:

&НаКлиенте

Процедура ОткрытьНастройки(Команда)

ОткрытьФорму("Обработка.НастройкиОбмена.Форма.ФормаНастроек");

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

Первый параметр — полное имя формы. Оно строится по шаблону: <ТипОбъекта>.<ИмяОбъекта>.Форма.<ИмяФормы>. Для основной формы достаточно "Справочник.Номенклатура.Форма.ФормаЭлемента", а для формы по умолчанию можно указать "Справочник.Номенклатура.ФормаОбъекта" или "Справочник.Номенклатура.ФормаСписка".

Частая задача — открыть форму элемента по текущей строке списка. Тогда в параметры передаётся ключ:

&НаКлиенте

Процедура ОткрытьТекущийЭлемент(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат;

КонецЕсли;

ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта",

Новый Структура("Ключ", ТекущиеДанные.Ссылка));

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

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

Порядок действий
  1. 1
    Откройте форму в конфигураторе и добавьте команду на вкладке «Команды»
  2. 2
    Перетащите команду в дерево элементов формы — появится кнопка
  3. 3
    Создайте клиентский обработчик действия команды
  4. 4
    В обработчике вызовите ОткрытьФорму с именем формы и параметрами
  5. 5
    Обновите конфигурацию базы данных и проверьте работу кнопки в режиме 1С:Предприятие

Передача параметров в открываемую форму

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

&НаКлиенте

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

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

ПараметрыФормы.Вставить("Отбор",

Новый Структура("Контрагент", Объект.Контрагент));

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

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

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

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

Модальное открытие и получение результата

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

&НаКлиенте

Процедура ВыбратьСклад(Команда)

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

ОткрытьФорму("Справочник.Склады.ФормаВыбора", , ЭтотОбъект, , , ,

ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

Процедура ПослеВыбораСклада(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Склад = Результат;

КонецЕсли;

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

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

Открываемая форма возвращает результат через метод Закрыть(ЗначениеРезультата) или оповещение ОповеститьОВыборе(Значение). Проверяйте результат на Неопределено: пользователь мог просто закрыть форму крестиком, и тогда присваивать значение нельзя.

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

ОткрытьФорму без параметров

Простой переход к списку или обработке; результата нет, форма живёт независимо

ОткрытьФорму с оповещением и блокировкой владельца

Нужен результат выбора или ввода; работает в тонком и веб-клиенте, рекомендуемый вариант

ОткрытьФормуМодально

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

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

Кнопки нередко добавляют для запуска внешних обработок. В управляемом приложении для этого предусмотрен механизм дополнительных отчётов и обработок (БСП), но программно файл можно открыть так: поместить обработку во временное хранилище, подключить через менеджер внешних обработок и вызвать ОткрытьФорму("ВнешняяОбработка." + ИмяПодключения + ".Форма"). Подключение выполняется на сервере, поэтому обработчик кнопки будет клиент-серверным.

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

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

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

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

Вторая группа ошибок связана с контекстом: обращение к Объект в форме, где этого реквизита нет, использование серверных вызовов в клиентском обработчике без директивы &НаСервере, чтение Элементы.Список.ТекущиеДанные, когда элемент называется иначе. Директивы компиляции проверяйте в первую очередь — платформа сообщит об ошибке ещё при сохранении модуля.

Третья группа — логические ошибки: форма открывается, но пустая или без отбора. Значит, параметры не дошли: проверьте, что нестандартные параметры объявлены в свойствах формы с признаком «Ключевой параметр» при необходимости, и что в ПриСозданииНаСервере они реально читаются и применяются.

Типичные ошибки
01
Не объявлен параметр в свойствах открываемой формы — переданное значение молча игнорируется
02
Обращение к ТекущиеДанные без проверки на Неопределено — ошибка при пустом списке
03
Серверный код в клиентском обработчике — ошибка компиляции или недоступность контекста
04
Открытие формы в цикле без ключа уникальности — открывается десяток одинаковых окон
05
Использование ОткрытьФормуМодально в веб-клиенте — ошибка при отключённом режиме модальности

Проверка результата и отладка

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

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

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

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

Нажатие кнопки
Норма

Форма открывается без сообщений об ошибках

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

Ошибка «форма не найдена» или нарушение прав доступа

Передача параметров
Норма

В открывшейся форме установлен отбор или заполнены реквизиты

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

Форма пустая, параметры не применились

Модальный выбор
Норма

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

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

При закрытии крестиком данные затираются пустым значением

Повторное нажатие
Норма

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

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

Плодятся дубликаты одного окна

FAQ

Как открыть форму нового элемента с заполненными реквизитами?

Передайте в ОткрытьФорму структуру с ключом ЗначенияЗаполнения, например: Новый Структура("ЗначенияЗаполнения", Новый Структура("Организация", ТекОрганизация)). Форма нового объекта применит эти значения при создании. Не передавайте Ключ — иначе откроется существующий элемент.

Почему кнопка видна, но не нажимается (недоступна)?

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

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

Передайте в параметрах ключ записи — структуру с измерениями (и периодом для периодического регистра): Новый Структура("Ключ", КлючЗаписи). Ключ формируется через РегистрыСведений.ИмяРегистра.СоздатьКлючЗаписи() на сервере, поэтому обработчик будет клиент-серверным.

Можно ли открыть форму в новом окне, а не в текущей вкладке?

Да. Укажите в параметрах ОткрытьФорму режим окна через последние аргументы: РежимОткрытияОкнаФормы.Независимый открывает форму в отдельном окне, БлокироватьВесьИнтерфейс — поверх всех окон. Также вариант окна можно задать в свойствах самой формы в конфигураторе.

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

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

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

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

Итог

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

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