Как программно переключить фокус на многострочную часть списка в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Базовый метод активации элементов формы

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

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


Перем флПереключить; // 0 - активизировать МнЧ, 1 - активизировать ТЗ

Процедура кнПереключить()
    Если флПереключить = 1 Тогда
        // Активизируем таблицу значений по её идентификатору
        Активизировать("ТаблицаПодбора"); 
    Иначе
        // Активизируем многострочную часть (список справочника)
        // Для этого нужно указать идентификатор ОДНОЙ ИЗ КОЛОНОК списка
        Активизировать("Наименование", 0);
    КонецЕсли;
    
    // Инвертируем флаг для следующего нажатия
    флПереключить = 1 - флПереключить;
КонецПроцедуры

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

Критически важное условие: Идентификатор колонки

Разберем подробнее, почему метод Активизировать может не срабатывать. Основная причина кроется в настройках конфигуратора. Для того чтобы система «поняла», какой элемент нужно сделать активным, у колонки многострочной части обязательно должен быть заполнен «Идентификатор» в свойствах (закладка «Дополнительно»).

Проанализируем шаги по настройке:

  1. Откройте форму списка справочника в конфигураторе.
  2. Выберите колонку в многострочной части (например, ту, где отображается наименование).
  3. Зайдите в свойства колонки и убедитесь, что поле «Идентификатор» заполнено (например, значением Наименование).
  4. Именно эту строку мы используем в коде: Активизировать("Наименование", 0);.

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

Проблема отслеживания смены фокуса

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

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

Использование имитации нажатия клавиш (SendKeys)

Иногда штатный метод Активизировать может вести себя нестабильно в сложных модальных формах. В таких случаях программисты прибегают к использованию системных объектов Windows для имитации нажатия клавиши Tab. Это позволяет принудительно «прогнать» фокус по элементам согласно установленному порядку обхода.

Пример реализации через WScript.Shell:


Процедура ПереключитьФокусТабом()
    Попытка
        Сервис = СоздатьОбъект("WScript.Shell");
        // Имитируем нажатие клавиши TAB
        Сервис.SendKeys("{TAB}");
    Исключение
        Сообщить("Ошибка вызова WScript.Shell", "!");
    КонецПопытки;
КонецПроцедуры

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

Профессиональное решение: Внешние компоненты

Если стандартных возможностей платформы становится недостаточно (например, нужно событие ПриПолученииФокуса или ПриНажатииКнопкиМыши), рекомендуется использовать внешние компоненты, такие как FormEx или 1С++.

Рассмотрим преимущества использования таких расширений:

Резюме по реализации

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

  1. Назначьте уникальный Идентификатор колонке в свойствах формы.
  2. Используйте команду Активизировать("ИмяКолонки", 0); в программном коде.
  3. Если требуется циклическое переключение, используйте переменную-флаг для хранения текущего состояния.
  4. При необходимости сложной обработки событий рассмотрите возможность подключения внешней компоненты FormEx.

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

← На главную