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