При разработке интерфейсов в среде 1С:Предприятие 7.7, особенно в режимах подбора товаров, часто возникает задача управления фокусом ввода. Типичный сценарий: на форме подбора есть основной список справочника (многострочная часть или МнЧ) и «корзина» в виде таблицы значений (ТЗ), куда пользователь добавляет выбранные позиции. Для удобства работы без мыши программисту необходимо реализовать переключение фокуса между этими элементами с помощью горячих клавиш или программных условий. В этой статье мы подробно разберем, как это реализовать, и какие технические нюансы нужно учитывать.
Для управления фокусом в 1С 7.7 используется системный метод Активизировать. Если переключение на таблицу значений обычно не вызывает проблем, то активация многострочной части списка имеет свои особенности. Рассмотрим стандартный подход, который обсуждался в сообществе.
Предположим, у нас есть переменная-флаг флПереключить, которая определяет, какой элемент должен стать активным. Логика переключения в процедуре нажатия кнопки будет выглядеть следующим образом:
Перем флПереключить; // 0 - активизировать МнЧ, 1 - активизировать ТЗ
Процедура кнПереключить()
Если флПереключить = 1 Тогда
// Активизируем таблицу значений по её идентификатору
Активизировать("ТаблицаПодбора");
Иначе
// Активизируем многострочную часть (список справочника)
// Для этого нужно указать идентификатор ОДНОЙ ИЗ КОЛОНОК списка
Активизировать("Наименование", 0);
КонецЕсли;
// Инвертируем флаг для следующего нажатия
флПереключить = 1 - флПереключить;
КонецПроцедуры
Обратите внимание на важный момент: в методе Активизировать для списка справочника мы указываем не идентификатор самого списка, а идентификатор конкретной колонки, входящей в эту многострочную часть. Второй параметр 0 означает, что мы просто устанавливаем фокус на ячейку, не открывая её для редактирования.
Разберем подробнее, почему метод Активизировать может не срабатывать. Основная причина кроется в настройках конфигуратора. Для того чтобы система «поняла», какой элемент нужно сделать активным, у колонки многострочной части обязательно должен быть заполнен «Идентификатор» в свойствах (закладка «Дополнительно»).
Проанализируем шаги по настройке:
Наименование).Активизировать("Наименование", 0);.Если идентификатор не задан, фокус на список просто не перейдет, и программа может не выдать никакой ошибки, что часто вводит разработчиков в заблуждение.
В процессе работы вы можете столкнуться с тем, что штатные средства 1С 7.7 не позволяют легко отследить момент, когда пользователь переключился между элементами при помощи мыши. Функция, размещенная «в тексте» на форме (известный хак для 7.7), не всегда срабатывает мгновенно при клике по списку.
Выясним причину: механизм вызова функций из текстовых полей на форме завязан на перерисовку интерфейса. При простом клике по строке списка полная перерисовка может не инициироваться. Если ваша логика требует точного знания того, где сейчас находится курсор, рассмотрим альтернативные пути.
Иногда штатный метод Активизировать может вести себя нестабильно в сложных модальных формах. В таких случаях программисты прибегают к использованию системных объектов Windows для имитации нажатия клавиши Tab. Это позволяет принудительно «прогнать» фокус по элементам согласно установленному порядку обхода.
Пример реализации через WScript.Shell:
Процедура ПереключитьФокусТабом()
Попытка
Сервис = СоздатьОбъект("WScript.Shell");
// Имитируем нажатие клавиши TAB
Сервис.SendKeys("{TAB}");
Исключение
Сообщить("Ошибка вызова WScript.Shell", "!");
КонецПопытки;
КонецПроцедуры
Этот метод заставляет фокус переместиться на следующий элемент в порядке обхода, который задан в конфигураторе. Однако это менее гибкий способ, так как он зависит от визуального расположения элементов на форме.
Если стандартных возможностей платформы становится недостаточно (например, нужно событие ПриПолученииФокуса или ПриНажатииКнопкиМыши), рекомендуется использовать внешние компоненты, такие как FormEx или 1С++.
Рассмотрим преимущества использования таких расширений:
ПослеПереводаФокуса, что позволяет мгновенно реагировать на действия пользователя.Подводя итог, для реализации переключения фокуса на многострочную часть списка выполните следующие действия:
Активизировать("ИмяКолонки", 0); в программном коде.Используя эти методы, вы сможете создать удобный и быстрый интерфейс подбора, который позволит пользователям эффективно работать с данными без постоянного переключения на мышь.