Почему при открытии документа в 1С автоматически меняется активная страница панели и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке и кастомизации интерфейсов в конфигурациях 1С:Предприятие на обычных формах (таких как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») программисты часто сталкиваются с загадочным поведением платформы. Одним из таких сюрпризов является самопроизвольное переключение вкладок (страниц панели) при открытии существующего или нового документа.

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

Выясняем истинную причину: как работает фокус в обычных формах

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

Эта процедура обычно называется АктивизироватьРеквизитВФорме и располагается в общем модуле РаботаСДиалогами. Давайте разберем по шагам, что происходит внутри этого алгоритма:

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

ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Плательщик;

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

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

Способы решения проблемы

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

Способ 1. Принудительный возврат фокуса в конце процедуры ПриОткрытии

Самый надежный программный метод — дописать собственную логику в модуль формы документа. Нам необходимо принудительно вернуть фокус на нужную вкладку или элемент в самом конце процедуры ПриОткрытии. Важно делать это после того, как отработают все типовые вызовы общих модулей.

Проанализируем пример кода, который решает эту задачу:


Процедура ПриОткрытии()
    // [Здесь находится типовой код инициализации формы]
    
    // Вызов типового механизма, который может сбить фокус:
    РаботаСДиалогами.АктивизироватьРеквизитВФорме(ЭтотОбъект, ЭтаФорма);
    
    // Наш код для восстановления фокуса:
    // Вариант А: Переключаем активную страницу панели на "Товары"
    ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = ЭлементыФормы.ОсновнаяПанель.Страницы.Товары;
    
    // Вариант Б: Принудительно активизируем табличную часть товаров
    ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Товары;
КонецПроцедуры

Использование этого кода гарантирует, что даже если типовые механизмы попытаются увести фокус на вкладку с плательщиком, форма все равно откроется на нужной нам странице с товарами.

Способ 2. Управление свойствами доступности элемента

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

Для этого выполним следующие действия в конфигураторе:

  1. Откроем свойства элемента управления Плательщик на форме.
  2. Установим свойство ТолькоПросмотр в значение Истина.
  3. Или установим свойство Доступность в значение Ложь.

Типовая процедура АктивизироватьРеквизитВФорме проверяет доступность элементов перед тем, как передать им фокус. Заблокированные поля или поля в режиме "Только просмотр" будут успешно проигнорированы алгоритмом, и вкладка останется на своем месте.

Способ 3. Использование свойства «Активизировать по умолчанию»

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

В панели свойств этого элемента найдем параметр АктивизироватьПоУмолчанию и установим его в значение Истина. Обратите внимание, что этот метод может не сработать, если в общем модуле жестко прописана принудительная перезапись значения ТекущийЭлемент, но в простых формах это отличное превентивное решение.

Резюме

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

← На главную