Как при разработке виртуальной клавиатуры в 1С 7.7 переместить курсор в конец поля ввода?

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

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

Разбор причин возникновения проблемы

Когда вы программно обновляете значение поля ввода, например, кодом Поле = Поле + \"Й\", 1С:Предприятие перерисовывает элемент управления. Если в этот же момент вы пытаетесь отправить команду SendKeys, она часто срабатывает раньше, чем форма успевает завершить обновление состояния и вернуть фокус элементу. В результате курсор остается в начале строки или выделение сбрасывается. Чтобы решить эту задачу, необходимо четко разделить момент изменения данных и момент управления визуальным представлением (позицией курсора).

Решение через метод «ложного закрытия» формы

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

Рассмотрим реализацию данного подхода по шагам:

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

Перем Вася;

Функция ПриВыбореЗначения(Об="")
    Если Об = "" Тогда 
        Об = Форма.АктивныйЭлемент(); 
    КонецЕсли; 
    Если Об = "кнЙ" Тогда
        Поле = СокрЛП(Поле) + "Й";
        ПошукПоБукв();
        Вася = Об;
        Форма.Закрыть(0);
    КонецЕсли;
КонецФункции

Процедура ПриЗакрытии()
    Если ПустоеЗначение(Вася) = 0 Тогда
        Вася = "";
        Активизировать("Поле");
        ПроцедураКурсорЕнд();
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Процедура ПроцедураКурсорЕнд()
    Енд = СоздатьОбъект("Wscript.Shell");
    Енд.SendKeys("{END}");  
КонецПроцедуры

Особенности работы со спецсимволами и пробелами

Частой ошибкой при реализации клавиатуры является использование функции СокрЛП(). Она эффективно удаляет пробелы, но делает невозможным ввод текста, состоящего из нескольких слов или содержащего пробелы. Если вы планируете использовать пробелы в своем поле поиска, следуйте этим рекомендациям:

Алгоритм ввода числовых данных

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


Процедура КнопкаЦифра(Цифра)
    Если Поле = 0 Тогда
        Поле = Цифра;
    Иначе
        Поле = Поле * 10 + Цифра;
    КонецЕсли;
    Активизировать("Поле");
КонецПроцедуры

Процедура КнопкаЗабой()
    Поле = Цел(Поле / 10);
КонецПроцедуры

Для реализации ввода дробных чисел необходимо добавить флаг состояния, который будет отслеживать нажатие запятой. При нажатии на запятую, вводимые цифры должны прибавляться не через умножение на 10, а через деление на степени десятки (10, 100, 1000 и так далее), что позволит формировать дробную часть числа корректно.

Практические советы

Работая над интерфейсом для 1С 7.7, помните о следующих моментах:

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

← На главную