Как определить активную таблицу значений на форме в 1С 7.7 без внешних компонент

Программист 1С v7.7
← На главную

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

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

Разберем ситуацию: у нас есть внешняя обработка, на которой размещены две таблицы значений, например, ТЗ_Товары и ТЗ_Услуги. Нам необходимо, чтобы при нажатии на определенную кнопку программа понимала, с какой именно таблицей сейчас взаимодействует пользователь. Программисты старой школы знают классический прием мониторинга активного элемента: создание на форме текстового поля с вызовом функции.

Обычно это выглядит так. На форму помещается текст, в поле «Формула» которого прописывается функция Мониторинг(). В модуле пишется код:


Функция Мониторинг()
    Перем ТекЭлемент;
    ТекЭлемент = Форма.АктивныйЭлемент();
    // Пытаемся поймать ТЗ
    Возврат ТекЭлемент;
КонецФункции

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

Решение через использование формул в колонках таблицы

Проанализируем наиболее эффективный метод, который не требует установки внешних компонент вроде FormEx или 1С++. Этот способ основан на использовании свойства «Формула», которое есть у каждой колонки таблицы значений на форме.

Посмотрим на алгоритм реализации этого метода по шагам:

  1. Откроем свойства таблицы значений на форме.
  2. Перейдем к списку колонок таблицы.
  3. Для каждой колонки (или хотя бы для одной, самой широкой) в поле «Формула» пропишем вызов специальной функции, передавая в нее имя нашей таблицы. Например, для первой таблицы это будет УстановитьАктивнуюТЗ("ТЗ1"), для второй — УстановитьАктивнуюТЗ("ТЗ2").

Теперь разберем, как должен выглядеть код в модуле формы. Нам понадобится переменная модуля для хранения состояния:


Переменная АктивнаяТЗ;

Процедура УстановитьАктивнуюТЗ(ИмяТЗ)
    // Эта процедура вызывается каждый раз, когда пользователь
    // кликает по строке или перемещается стрелками по ТЗ
    АктивнаяТЗ = ИмяТЗ;
КонецПроцедуры

Важный нюанс: формула в колонке таблицы значений в 1С 7.7 вычисляется при каждом изменении текущей строки. Это означает, что как только пользователь выберет строку в таблице, наша переменная АктивнаяТЗ тут же обновится. Это дает нам практически мгновенную реакцию на действия пользователя.

Создание комплексного монитора активности

Чтобы система работала безупречно, мы можем объединить стандартный мониторинг элементов и наш новый метод для таблиц значений. Проанализируем ситуацию: когда Форма.АктивныйЭлемент() возвращает пустую строку, это может означать либо фокус на текстовом поле, либо фокус на таблице значений. Мы можем использовать это для уточнения.

Создадим функцию для отображения текущего статуса на форме (в текстовом поле):


Функция ОбновитьСтатусФокуса()
    ТекЭлемент = Форма.АктивныйЭлемент();
    
    Если ПустаяСтрока(ТекЭлемент) = 1 Тогда
        // Возможно, фокус на одной из ТЗ, которую мы поймали через формулу колонки
        Возврат "Активна таблица: " + СокрЛП(АктивнаяТЗ);
    Иначе
        // Фокус на обычном поле ввода, кнопке или другом элементе
        АктивнаяТЗ = ""; // Сбрасываем ТЗ, так как ушли на другой элемент
        Возврат "Активен элемент: " + ТекЭлемент;
    КонецЕсли;
КонецФункции

Альтернативный метод: эмуляция через невидимые кнопки

Рассмотрим еще один «хакерский» способ, который иногда применялся, если формулы в колонках по каким-то причинам использовать неудобно (например, если таблицы очень «тяжелые» и лишние вычисления тормозят прокрутку). Это метод «ловушек фокуса».

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

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

Особенности и предостережения

Проанализируем возможные побочные эффекты. Использование функций в формулах объектов формы в 1С 7.7 — это мощный инструмент, но он требует осторожности:

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

← На главную