Форма в 1С не открывается или теряет фокус: способы открыть её и сделать активной

· 9 мин

Содержание

Пользователь открывает форму в 1С через командный интерфейс раздела, через Главное меню → Все функции или по навигационной ссылке. Разработчик открывает её методом ОткрытьФорму(), а активирует уже открытое окно методом Активизировать() у объекта формы. Если форма не включается совсем, причина почти всегда одна из трёх: у роли нет прав, команда скрыта в интерфейсе или в коде указано неверное имя формы.

Ниже способы для управляемых форм платформы 8.3 в интерфейсе «Такси». Они общие для платформы и не зависят от конфигурации: в Бухгалтерии, ЗУП и УТ работают одинаково.

Что такое форма и как она проходит путь от создания до закрытия

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

Форма «оживает» в строгом порядке. Понимать его нужно, чтобы код включения видимости или активного поля стоял в правильном обработчике.

ЭтапОбработчикГде выполняетсяЧто здесь делают
СозданиеПриСозданииНаСервере(Отказ, СтандартнаяОбработка)СерверЗаполняют реквизиты, настраивают видимость, могут отказать в открытии
Чтение объектаПриЧтенииНаСервере(ТекущийОбъект)СерверДочитывают данные из объекта в реквизиты формы
ОткрытиеПриОткрытии(Отказ)КлиентСтавят активный элемент, запускают обработчики ожидания
Повторное открытиеПриПовторномОткрытии()КлиентСрабатывает, когда уже открытую форму вызывают снова
Перед закрытиемПередЗакрытием(...)КлиентСпрашивают «Сохранить изменения?», отменяют закрытие
ЗакрытиеПриЗакрытии(ЗавершениеРаботы)КлиентОсвобождают ресурсы, оповещают другие формы

Если поставить Отказ = Истина в ПриСозданииНаСервере, форма вообще не появится. Это штатный способ не пускать пользователя в окно по своему условию, без ошибок на экране.

Как открыть форму в режиме пользователя

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

СпособКогда выбиратьОграничение
Раздел → панель навигации или действийФорма выведена в командный интерфейсКоманду мог скрыть администратор или роль
Главное меню → Все функцииКоманды нет в разделахПункт надо сначала включить в параметрах
Навигационная ссылкаКоллега прислал ссылку на объект или списокНужны права на этот объект
Избранное и историяФорма открывается частоРаботает только для уже открытых раньше окон

Через разделы

  1. Выберите раздел на панели слева: «Продажи», «Справочники», «Зарплата и кадры» и т.д.
  2. Нажмите команду в панели навигации. Откроется форма списка.
  3. Двойной щелчок по строке откроет форму объекта, кнопка «Создать» — новую карточку.

Через «Все функции»

Здесь собраны все объекты конфигурации, к которым у пользователя есть права, даже если в разделах их нет.

  1. Откройте Главное меню (кнопка с тремя полосками в левом верхнем углу).
  2. Выберите Сервис → Параметры и включите флажок «Отображать команду “Все функции”».
  3. Снова откройте Главное меню → Все функции.
  4. Разверните ветку («Справочники», «Документы», «Обработки», «Отчёты») и дважды щёлкните по объекту.

Через навигационную ссылку

У каждой открытой формы в заголовке есть значок ссылки. Он копирует адрес вида e1cib/data/Справочник.Контрагенты?ref=.... Коллега вставляет эту ссылку через команду перехода по ссылке в главном меню, и у него открывается та же карточка.

Ссылку на список можно собрать вручную: e1cib/list/Документ.РеализацияТоваровУслуг. Для обработки: e1cib/app/Обработка.ИмяОбработки. Имя объекта пишется так, как оно задано в Конфигураторе, а не как синоним в интерфейсе.

Переключение между открытыми окнами

Открытые формы в «Такси» висят вкладками в панели открытых окон над рабочей областью. Чтобы сделать нужную форму активной, щёлкните по её вкладке. С клавиатуры окна перебирают сочетанием Ctrl+Tab, а Ctrl+F4 закрывает текущее.

Программное открытие и активация формы в коде

Формы открывают только на клиенте, в процедурах с директивой &НаКлиенте. С сервера вызвать окно нельзя: сервер ничего не показывает пользователю.

ОткрытьФорму: основной способ

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

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

Параметр Ключ говорит, какой элемент показать. Если та же карточка уже открыта, платформа не создаёт второе окно, а активирует существующее. В этот момент в форме срабатывает ПриПовторномОткрытии.

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

&НаКлиенте
Процедура ПоказатьОстатки(Команда)
	ОткрытьФорму("Отчет.ОстаткиТоваров.Форма", , ЭтаФорма, "ОстаткиОсновной");
КонецПроцедуры

ПолучитьФорму и Активизировать()

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

&НаКлиенте
Перем ФормаПодбора;

&НаКлиенте
Процедура ПоказатьПодбор(Команда)
	Если ФормаПодбора = Неопределено Тогда
		ФормаПодбора = ПолучитьФорму("Обработка.ПодборТоваров.Форма", , ЭтаФорма);
	КонецЕсли;
	Если ФормаПодбора.Открыта() Тогда
		ФормаПодбора.Активизировать();
	Иначе
		ФормаПодбора.Открыть();
	КонецЕсли;
КонецПроцедуры

Метод Активизировать() переводит фокус на окно, которое уже открыто. Для закрытой формы он не поможет, поэтому сначала проверяют Открыта().

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

Открытие с ожиданием результата вместо модального окна

В новых конфигурациях свойство «Режим использования модальности» стоит в значении «Не использовать». Тогда старый ОткрытьФормуМодально() падает с ошибкой Использование модальных окон в данном режиме запрещено!. Правильный путь — открыть форму с блокировкой владельца и получить результат в процедуре оповещения.

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

&НаКлиенте
Процедура ВыборПериодаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Неопределено Тогда
		Объект.ПериодОтчета = Результат;
	КонецЕсли;
КонецПроцедуры

Вызываемая форма возвращает значение командой Закрыть(Значение). Процедура-обработчик обязана быть экспортной, иначе платформа её не найдёт.

Режимов открытия окна три:

  • 🪟 Независимый — форма живёт сама по себе, владелец доступен;
  • 🔒 БлокироватьОкноВладельца — заблокирована только вызвавшая форма;
  • ⛔ БлокироватьВесьИнтерфейс — пользователь не может работать ни с чем, пока не закроет окно. Применяйте редко.

Открытие по ссылке из кода

Если имя формы неизвестно, а адрес есть, используйте ПерейтиПоНавигационнойСсылке("e1cib/list/Справочник.Номенклатура"). Метод откроет то же, что открыл бы пользователь, вставив ссылку вручную.

Видимость, доступность и активный элемент формы

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

У каждого элемента в коллекции Элементы есть три свойства, которые путают:

СвойствоЧто делаетПример
ВидимостьСкрывает элемент полностьюБлок льгот виден только кадровику
ДоступностьЭлемент виден, но серый и не нажимаетсяКнопка «Отправить» до заполнения полей
ТолькоПросмотрЗначение видно, выделяется, но не меняетсяКомментарий в проведённом документе

Настраивают их в ПриСозданииНаСервере, чтобы форма сразу открылась в нужном виде, без мигания:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Элементы.ГруппаЛьготы.Видимость = РольДоступна("ПолныеПрава");
	Элементы.Комментарий.ТолькоПросмотр = Объект.Проведен;
КонецПроцедуры

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

Как сделать нужное поле активным

Активный элемент задаёт свойство формы ТекущийЭлемент. Его ставят на клиенте при открытии:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ТекущийЭлемент = Элементы.Количество;
КонецПроцедуры

Для табличной части или списка дополнительно указывают строку: Элементы.Список.ТекущаяСтрока = НужнаяСсылка. Курсор встанет на неё, и пользователь продолжит работу с клавиатуры.

Для оформления по условию («красным, если сумма больше лимита») код не нужен. Используйте условное оформление формы: оно работает без лишних вызовов сервера.

Права доступа и роли: почему форма есть, но не открывается

Форма не имеет отдельного права «открыть». Пользователь открывает её, если у его ролей есть права на сам объект метаданных:

  • 📋 справочники, документы, регистры — право «Просмотр», а для изменения — «Редактирование» или «Изменение»;
  • 📊 отчёты и обработки — право «Использование» и «Просмотр»;
  • 🧩 общие формы — право «Просмотр» на эту общую форму.

Если права нет, пользователь видит ошибку Нарушение прав доступа!, а команда может пропасть из интерфейса вовсе.

Где настраивают

В типовых конфигурациях на БСП права раздают не в Конфигураторе, а в режиме предприятия: Администрирование → Настройки пользователей и прав → Группы доступа. Пользователя добавляют в группу с профилем, где есть нужные роли.

В Конфигураторе роль правят в ветке Общие → Роли: открывают роль, находят объект и ставят флажки прав. После изменения роли конфигурацию нужно сохранить и обновить базу данных.

Не меняйте роли типовой конфигурации напрямую: при следующем обновлении изменения придётся переносить вручную. Своё право лучше добавить в расширении конфигурации или в отдельной новой роли.

Права внутри формы

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

Форма не открывается: диагностика по симптомам

Начните с проверки под администратором. Если у него форма открывается, а у пользователя нет — проблема в правах. Если не открывается ни у кого — в коде или в кэше.

Диагностика: выберите симптом

Сброс кэша клиента

Параметр /ClearCache добавляют в окне запуска: выберите базу, нажмите Изменить, на последнем шаге впишите его в поле дополнительных параметров запуска. Либо запустите из командной строки, подставив свой номер платформы и путь к файловой базе:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /ClearCache

Перед очисткой кэша закройте программу у этого пользователя: незаписанные данные в открытых формах пропадут. На другие сеансы этот параметр не влияет.

Отладка

Если форма не открывается у всех, поставьте точку останова в первой строке ПриСозданииНаСервере и ПриОткрытии. Отладчик покажет, доходит ли выполнение до формы и где срабатывает отказ. Для серверного кода отладку на сервере нужно разрешить в параметрах информационной базы или кластера.

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

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