При создании пользовательских интерфейсов для сенсорных экранов или специализированных клавиатур в 1С:Предприятии 7.7 разработчики часто сталкиваются с тем, что стандартные методы управления полем ввода работают не так, как ожидается. Основная проблема заключается в потере фокуса или сбросе позиции курсора в начало строки при программном обновлении значения реквизита.
Когда вы программно обновляете значение поля ввода, например, кодом Поле = Поле + \"Й\", 1С:Предприятие перерисовывает элемент управления. Если в этот же момент вы пытаетесь отправить команду SendKeys, она часто срабатывает раньше, чем форма успевает завершить обновление состояния и вернуть фокус элементу. В результате курсор остается в начале строки или выделение сбрасывается. Чтобы решить эту задачу, необходимо четко разделить момент изменения данных и момент управления визуальным представлением (позицией курсора).
Одним из самых надежных способов управления курсором в 7.7 является перехват процесса закрытия формы. Этот метод позволяет дождаться полной отрисовки элемента перед тем, как применять команды позиционирования.
Рассмотрим реализацию данного подхода по шагам:
ПриВыбореЗначения при нажатии на кнопку клавиатуры вместо прямой активизации используйте команду Форма.Закрыть(0).ПриЗакрытии отмените закрытие через СтатусВозврата(0), установите фокус и выполните команду эмуляции нажатия клавиши.
Перем Вася;
Функция ПриВыбореЗначения(Об="")
Если Об = "" Тогда
Об = Форма.АктивныйЭлемент();
КонецЕсли;
Если Об = "кнЙ" Тогда
Поле = СокрЛП(Поле) + "Й";
ПошукПоБукв();
Вася = Об;
Форма.Закрыть(0);
КонецЕсли;
КонецФункции
Процедура ПриЗакрытии()
Если ПустоеЗначение(Вася) = 0 Тогда
Вася = "";
Активизировать("Поле");
ПроцедураКурсорЕнд();
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ПроцедураКурсорЕнд()
Енд = СоздатьОбъект("Wscript.Shell");
Енд.SendKeys("{END}");
КонецПроцедуры
Частой ошибкой при реализации клавиатуры является использование функции СокрЛП(). Она эффективно удаляет пробелы, но делает невозможным ввод текста, состоящего из нескольких слов или содержащего пробелы. Если вы планируете использовать пробелы в своем поле поиска, следуйте этим рекомендациям:
СокрЛП() при формировании значения в поле.Симв(160) для хранения значения в переменной, если необходимо предотвратить автоматическую обрезку пробелов системой.СтрЗаменить(Поле, Симв(160), " ").Для создания цифровой виртуальной клавиатуры, которая работает как калькулятор, эффективнее использовать математический подход, а не текстовое добавление символов. Это позволяет избежать проблем с форматированием чисел и запятыми.
Процедура КнопкаЦифра(Цифра)
Если Поле = 0 Тогда
Поле = Цифра;
Иначе
Поле = Поле * 10 + Цифра;
КонецЕсли;
Активизировать("Поле");
КонецПроцедуры
Процедура КнопкаЗабой()
Поле = Цел(Поле / 10);
КонецПроцедуры
Для реализации ввода дробных чисел необходимо добавить флаг состояния, который будет отслеживать нажатие запятой. При нажатии на запятую, вводимые цифры должны прибавляться не через умножение на 10, а через деление на степени десятки (10, 100, 1000 и так далее), что позволит формировать дробную часть числа корректно.
Работая над интерфейсом для 1С 7.7, помните о следующих моментах:
FormEx. Она позволяет программно изменять шрифты, управлять размерами элементов и отправлять системные команды окнам, что значительно расширяет возможности по созданию кастомных клавиатур.ТаблицаЗначений для отображения результатов поиска — это классическая и наиболее стабильная архитектура для систем поиска на платформе 7.7.Применяя данные методы, вы сможете создать отзывчивый и удобный интерфейс виртуальной клавиатуры, который будет работать стабильно, не теряя фокус ввода и корректно позиционируя курсор при каждом нажатии.