Как реализовать пропуск группы при вводе в 1С:Предприятие 8.3

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

В процессе разработки управляемых форм в 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартные свойства элементов ведут себя неочевидно. Одной из таких проблем является свойство ПропускатьПриВводе (SkipOnInput) для элементов типа Группа. Рассмотрим подробнее, почему это происходит и какими способами можно добиться желаемого поведения формы, чтобы пользователь не «застревал» на заголовках групп при нажатии клавиши Enter или Tab.

Анализ проблемы: почему свойство есть, но оно не работает

Многие разработчики замечают странную особенность: если открыть отладчик и проанализировать свойства элемента типа ГруппаФормы, то в списке доступных параметров можно обнаружить ПропускатьПриВводе. Однако попытка установить его интерактивно в конфигураторе заканчивается неудачей — этого свойства просто нет в палитре свойств. Попытка программной установки Элементы.Группа1.ПропускатьПриВводе = Истина также не приносит результата: платформа либо игнорирует команду, либо это не влияет на поведение фокуса.

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

Когда заголовок группы мешает вводу данных

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

  1. Свертываемая группа: Заголовок такой группы становится интерактивным элементом, на который можно нажать, чтобы скрыть или показать содержимое.
  2. Всплывающая группа: Аналогично свертываемой, заголовок служит кнопкой для вызова окна.
  3. Обычная группа с отображением заголовка: В некоторых темах оформления заголовок может принимать фокус.

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

Способ 1: Интерактивная настройка порядка обхода

Самый правильный и «чистый» метод решения проблемы без написания программного кода — это использование штатного инструмента конфигуратора. Разберем по шагам, как это сделать:

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

Важный нюанс: Ручной порядок обхода требует поддержки при добавлении новых элементов на форму. Если вы добавите новое поле, оно может оказаться в самом конце очереди, и вам придется снова заходить в этот редактор.

Способ 2: Программное управление фокусом через событие активизации

Если нам нужно более гибкое решение, проанализируем ситуацию программно. Мы можем перехватить момент, когда фокус попадает на группу, и мгновенно перебросить его дальше. Для этого используется свойство формы ТекущийЭлемент.

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

Рассмотрим пример реализации:


&НаКлиенте
Процедура ПриАктивизацииЭлемента(Элемент)
    Если Элемент = Элементы.ГруппаГруз Тогда
        // Перебрасываем фокус на следующее осмысленное поле
        ТекущийЭлемент = Элементы.НоменклатураГруза;
    КонецЕсли;
КонецПроцедуры

Этот метод работает мгновенно и незаметно для пользователя, создавая эффект того, что группа действительно пропускается при вводе.

Способ 3: Использование свойства «ТолькоПросмотр» или «Доступность»

В некоторых случаях мы можем ограничить интерактивность группы целиком. Если установить свойство Доступность = Ложь для группы, она и все её дочерние элементы будут исключены из обхода. Однако это часто не подходит, так как поля внутри группы должны оставаться редактируемыми.

Более тонкий вариант — использование свойства ТолькоПросмотр. Для некоторых типов групп в последних версиях платформы 8.3 установка Группа.ТолькоПросмотр = Истина позволяет оставить вложенные элементы доступными для редактирования, но исключает заголовок группы из цепочки навигации клавишей Tab.

Способ 4: Программный «костыль» с имитацией нажатия клавиш

Рассмотрим ситуацию, описанную в сообщениях форума, где предлагается использовать WScript.Shell для имитации нажатия клавиши Tab. Мы проанализируем этот метод, но настоятельно не рекомендуем использовать его в современных конфигурациях.


&НаКлиенте
Процедура ОбработкаОжиданияПропуска()
    Если ТекущийЭлемент = Элементы.ГруппаГруз Тогда
        Shell = Новый COMОбъект("WScript.Shell");
        Shell.SendKeys("{TAB}");
    КонецЕсли;
КонецПроцедуры

Почему это плохое решение:

Резюме и рекомендации

Проанализировав все возможности, мы можем сделать следующие выводы:

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

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

← На главную