Как активизировать таблицу на форме отчета в 1С 7.7 после заполнения

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

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

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

Разберем причины такого поведения платформы и подробно рассмотрим варианты программного переключения фокуса на область таблицы.

Почему штатный метод Активизировать() не срабатывает для таблицы

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

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

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

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

Решение с использованием эмуляции клавиши F6 через WScript.Shell

Наиболее простое решение задачи без привлечения тяжелых сторонних библиотек заключается в отправке системного нажатия клавиши F6 с помощью COM-объекта WScript.Shell.

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


Процедура Сформировать()
    // Основной алгоритм формирования и вывода данных в таблицу
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Шапка");
    // ... заполнение строк ...
    Таб.Показать();
    
    // Передача фокуса на область таблицы через отправку клавиши F6
    Попытка
        WSS = СоздатьОбъект("WScript.Shell");
        WSS.SendKeys("{F6}");
    Исключение
        // Обработка возможной ошибки создания COM-объекта
    КонецПопытки;
КонецПроцедуры

Разберем важные нюансы работы данного метода:

  1. Синтаксис клавиш: Функциональные клавиши в объекте WScript.Shell передаются в фигурных скобках, например "{F6}". Попытка передать строку "F6" или коды без скобок приведет к отправке обычных символов текста.
  2. Активность окна: Метод SendKeys посылает нажатие в текущее активное окно Windows. Если во время длительного расчета отчета пользователь переключился в другое приложение, нажатие уйдет в фоновое окно.
  3. Асинхронность интерфейса: Если таблица имеет большой объем и перерисовывается с задержкой, переключение фокуса может выполниться до завершения отрисовки. В таком случае отправку команды можно вынести в процедуру однократного таймера ОбработкаОжидания.

Альтернативные способы управления фокусом

Если решение через WScript.Shell неприменимо из-за политик безопасности или ограничений среды, рассмотрим другие подходы:

  1. Использование внешних компонент (FormEx, 1С++): Специализированные библиотеки расширения возможностей интерфейса 1С 7.7 предоставляют прямой доступ к дескрипторам окон (HWND). С их помощью можно программно найти дочернее окно таблицы и вызвать функцию SetFocus напрямую, гарантируя передачу фокуса нужному элементу без риска перехвата сторонними программами.
  2. Отказ от диалоговой кнопки: Перенос элементов управления непосредственно в саму таблицу. В ячейках табличного документа можно настроить гиперссылки и расшифровку (событие ОбработкаЯчейкиТаблицы). При таком подходе пользователь сразу работает только в пространстве таблицы, и необходимость программного переключения фокуса между секциями окна отпадает.
← На главную