Как реализовать автоматическое перемещение курсора в числовом поле табличной части 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Способ 1: Изменение единиц измерения (Архитектурное решение)

Проанализируем ситуацию, описанную на форуме. Если пользователь постоянно вводит значения типа 0,250, работая в метрах, то основной проблемой является сам разделитель (запятая). Самый эффективный способ упростить жизнь пользователю — изменить единицу измерения в интерфейсе. Вместо ввода метров (0,015) предложим вводить миллиметры (15).

Разберем по шагам, как это реализовать:

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

Таким образом, пользователю вообще не придется нажимать точку или запятую, что полностью снимает вопрос позиционирования курсора.

Способ 2: Использование системной эмуляции клавиш (WScript.Shell)

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

Посмотрим на пример кода, который можно разместить в модуле формы:


&НаКлиенте
Процедура ТЧТоварыШиринаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    // Используем COM-объект для посылки команд клавиатуры
    Попытка
        WshShell = Новый COMОбъект("WScript.Shell");
        // Клавиша F2 открывает поле, стрелки смещают курсор
        WshShell.SendKeys("{F2}");
        WshShell.SendKeys("{RIGHT}");
        WshShell.SendKeys("{RIGHT}");
    Исключение
        // Ошибка может возникнуть, если права на запуск скриптов ограничены
    КонецПопытки;
КонецПроцедуры

Этот метод заставляет программу «нажать» клавиши за пользователя в момент активации ячейки. Важно помнить, что данный метод работает только под управлением ОС Windows и может блокироваться некоторыми системами безопасности.

Способ 3: Настройка маски ввода

Выясним причину, по которой курсор ведет себя неудобно. Часто это связано с тем, что поле пустое. Использование свойства Маска позволяет жестко задать формат ввода. Например, маска 99.999 зарезервирует позиции под цифры.

Проанализируем плюсы этого подхода:

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

Способ 4: Работа через строковое представление

Рассмотрим продвинутый метод, который часто используют опытные разработчики. Если нам нужен полный контроль над курсором, мы можем временно подменить числовое поле ввода на строковое. Для строковых полей в управляемых формах доступны свойства УстановитьГраницыВыделения().

Алгоритм реализации будет следующим:

  1. При активации ячейки (событие ПриАктивизацииЯчейки) программно переключаем видимость между числовым реквизитом и строковым вспомогательным полем.
  2. Для строкового поля используем метод, который установит курсор после разделителя:

// Пример для строкового поля
Элементы.ВспомогательноеПолеСтрока.УстановитьГраницыВыделения(2, 2); 
// Установит курсор после второго символа (например, после "0.")
  1. После завершения ввода преобразуем строку обратно в число командой Число() и сохраняем в базу.

Способ 5: Отключение выделения текста при входе

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

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

Резюме

Мы проанализировали несколько подходов к решению задачи. Оптимальным решением с точки зрения архитектуры является переход на более мелкие единицы измерения (целые числа вместо дробных). Если же это невозможно, использование WScript.Shell или временная подмена поля строкой позволят добиться нужного поведения курсора программным путем.

← На главную