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