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

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

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

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

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

Механика одинакова в большинстве типовых конфигураций (УТ, ERP, БП, ЗУП): в модуле формы создаётся команда, к ней привязывается кнопка, а в обработчике команды вызывается код открытия нужной формы. Различия касаются только того, какая именно форма открывается и какие параметры ей передаются.

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

Как создать кнопку и команду на форме

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

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

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

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

Открытие формы обработки или отчёта

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

&НаКлиенте

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

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма");

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

Имя формы строится по шаблону: вид объекта, имя объекта, слово «Форма» и, при необходимости, имя конкретной формы. Например, "Справочник.Номенклатура.Форма.ФормаЭлемента" или "Документ.РеализацияТоваров.ФормаСписка". Если у объекта несколько форм, явное указание имени исключает неоднозначность.

Для отчётов синтаксис аналогичен: ОткрытьФорму("Отчет.Продажи.Форма"). Если отчёт построен на СКД и использует стандартную форму, можно открыть "Отчет.Продажи.ФормаОбъекта" или передать вариант настроек через параметры.

bsl
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
	ОткрытьФорму("Отчет.Продажи.Форма");
КонецПроцедуры

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

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

&НаКлиенте

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

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

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

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

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

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

Третий параметр — владелец формы. Если указать текущую форму (ЭтотОбъект или уникальный идентификатор), открытая форма будет связана с родительской: при повторном вызове с тем же владельцем и ключом уникальности платформа активирует уже открытую форму вместо создания дубликата.

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

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

&НаКлиенте

Процедура ВыбратьЗначение(Команда)

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

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

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

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

&НаКлиенте

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

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

// обработка выбранного значения

КонецЕсли;

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

В открываемой форме результат возвращается через ЭтотОбъект.Закрыть(ЗначениеРезультата). Если форма закрыта крестиком или по Esc без передачи значения, в обработчик оповещения придёт Неопределено — это нужно учитывать, чтобы не обрабатывать пустой результат как валидный.

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

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

&НаКлиенте

Процедура ОткрытьВнешнюю(Команда)

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма");

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

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

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

Открытие формы в обычном приложении

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

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

ФормаОбработки = Обработки.ЗагрузкаДанных.ПолучитьФорму();

ФормаОбработки.Открыть();

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

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

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

ОткрытьФорму()

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

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

Блокирует родительское окно до закрытия. Не работает при запрете модальности в конфигурации и в веб-клиенте.

ПолучитьФорму() + Открыть()

Только для обычных форм. Позволяет настроить форму до открытия, но недоступен в управляемом приложении.

Оповестить() + обработчик

Подходит, когда форма уже открыта и нужно передать в неё данные, а не создавать новую.

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

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

Вторая группа проблем — параметры. Если переданный параметр не объявлен у формы и не является стандартным, платформа может выдать ошибку о недопустимом параметре. Объявите параметр в свойствах формы (закладка «Параметры») или обрабатывайте только стандартные.

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

Типичные ошибки
01
Опечатка в имени формы — ошибка «недопустимое имя формы» при нажатии кнопки
02
Передача необъявленного параметра — исключение при создании формы
03
Отсутствие владельца — при каждом клике открывается новое окно, плодятся дубликаты
04
Вызов серверного кода из клиентского обработчика без директив — ошибка компиляции модуля формы
05
Использование модального открытия без проверки режима модальности — ошибка в веб-клиенте
Контрольные точки

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

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

Открывается нужная форма без сообщений об ошибках

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

Ошибка «недопустимое имя формы» или молчание — проверьте имя и привязку команды

Повторный клик
Норма

Активируется уже открытая форма (при заданном владельце)

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

Открывается второе окно — задайте владельца и ключ уникальности

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

Отбор или данные применены в открывшейся форме

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

Форма открылась пустой — параметры не объявлены или не обрабатываются

Вопросы и ответы

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

Передайте в ОткрытьФорму имя формы элемента и параметр «Ключ» со ссылкой: ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", Новый Структура("Ключ", СсылкаНаЭлемент)). Без ключа откроется форма создания нового элемента.

Почему при нажатии кнопки ничего не происходит?

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

Можно ли открыть форму другой информационной базы?

Напрямую — нет, ОткрытьФорму работает только внутри текущего сеанса. Для внешней базы используйте COM-соединение или HTTP-сервисы, а пользователю можно передать навигационную ссылку e1cib для открытия в отдельном клиенте.

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

В обработчике кнопки сначала вызовите ОткрытьФорму(), затем ЭтотОбъект.Закрыть(). Учтите, что если форма модифицирована, платформа запросит подтверждение записи — обработайте это через ПоказатьВопрос при необходимости.

Как открыть форму списка с отбором по текущей строке?

Получите значение из текущих данных (Элементы.Список.ТекущиеДанные.Поле), сформируйте структуру отбора и передайте её: ОткрытьФорму("Документ.Заказ.ФормаСписка", Новый Структура("Отбор", Новый Структура("Контрагент", Значение))).

Работает ли ОткрытьФорму на сервере?

Нет, ОткрытьФорму — клиентский метод, доступный только в контексте &НаКлиенте. Сервер может подготовить данные и вернуть их клиенту, который уже выполнит открытие формы.

Итог

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

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