При разработке внешних отчетов и обработок в среде 1С:Предприятие 7.7 нередко используется режим совмещения формы диалога и таблицы (опция формы «Использовать таблицу»). В такой архитектуре на форме одновременно присутствуют управляющие элементы (кнопки, флажки, поля ввода) и область табличного документа.
Часто возникает следующая задача: пользователь нажимает кнопку на форме, запускается алгоритм формирования отчета, таблица заполняется данными, после чего необходимо сразу передать фокус ввода в саму таблицу для дальнейшей навигации стрелками или клавишами. Однако штатно после завершения процедуры фокус ввода операционной системы остается на нажатой кнопке.
Разберем причины такого поведения платформы и подробно рассмотрим варианты программного переключения фокуса на область таблицы.
Проанализируем архитектуру окон формы 1С 7.7. Когда в свойствах формы включен показ таблицы, единое окно визуально делится сплиттером на две секции:
Метод платформы Активизировать() предназначен исключительно для элементов диалога и строк списков. Встроенный табличный документ не является элементом управления диалога и не имеет идентификатора, который можно было бы передать в метод Активизировать(). Попытки вызвать данный метод для имени таблицы приводят к ошибке либо игнорируются платформой.
При этом в интерфейсе 1С 7.7 предусмотрено стандартное горячее сочетание клавиш для циклического переключения между секциями составного окна — клавиша F6 («Активизировать следующую секцию окна»). Нажатие F6 переводит фокус из диалога в таблицу и обратно.
Наиболее простое решение задачи без привлечения тяжелых сторонних библиотек заключается в отправке системного нажатия клавиши F6 с помощью COM-объекта WScript.Shell.
Посмотрим на пример кода, который вызывается в конце процедуры формирования отчета:
Процедура Сформировать()
// Основной алгоритм формирования и вывода данных в таблицу
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
// ... заполнение строк ...
Таб.Показать();
// Передача фокуса на область таблицы через отправку клавиши F6
Попытка
WSS = СоздатьОбъект("WScript.Shell");
WSS.SendKeys("{F6}");
Исключение
// Обработка возможной ошибки создания COM-объекта
КонецПопытки;
КонецПроцедуры
Разберем важные нюансы работы данного метода:
WScript.Shell передаются в фигурных скобках, например "{F6}". Попытка передать строку "F6" или коды без скобок приведет к отправке обычных символов текста.SendKeys посылает нажатие в текущее активное окно Windows. Если во время длительного расчета отчета пользователь переключился в другое приложение, нажатие уйдет в фоновое окно.ОбработкаОжидания.Если решение через WScript.Shell неприменимо из-за политик безопасности или ограничений среды, рассмотрим другие подходы:
HWND). С их помощью можно программно найти дочернее окно таблицы и вызвать функцию SetFocus напрямую, гарантируя передачу фокуса нужному элементу без риска перехвата сторонними программами.ОбработкаЯчейкиТаблицы). При таком подходе пользователь сразу работает только в пространстве таблицы, и необходимость программного переключения фокуса между секциями окна отпадает.