Как в 1С 7.7 выделить значение в поле ввода при открытии диалога?

Программист 1С v7.7
← На главную

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

Рассмотрим, как можно решить эту задачу и сделать так, чтобы при появлении диалогового окна значение в поле ввода было уже выделено. Это значительно улучшает юзабилити, так как пользователь может сразу начать вводить новые данные, которые заменят старые.

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

Решение 1: Создание собственной формы ввода (рекомендуемый способ)

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

Преимущества этого метода:

Разберем по шагам, как создать и использовать такую форму.

  1. Создание обработки и формы
    В конфигураторе создадим новую обработку, например, с названием "УниверсальныйВвод". Внутри этой обработки создадим новую форму.
  2. Размещение элементов
    На созданную форму поместим следующие элементы:
    • Текстовую метку для отображения подсказки пользователю (например, "Введите число:").
    • Поле ввода с идентификатором, например, ВводимоеЗначение. В его свойствах можно сразу указать тип данных "Число".
    • Две кнопки: "ОК" (с идентификатором ОК) и "Отмена" (с идентификатором Отмена).
  3. Написание кода в модуле формы
    Теперь напишем код, который будет управлять поведением нашей формы.

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

    
    // Переменные модуля формы
    Перем Результат; 
    Перем Отказ;
    
    // Процедура, которая выполняется при открытии формы
    Процедура ПриОткрытии()
        Отказ = 1; // По умолчанию считаем, что пользователь отказался от ввода
        
        // Устанавливаем фокус на поле ввода "ВводимоеЗначение"
        // Это гарантирует, что курсор будет в этом поле при появлении окна.
        Активизировать("ВводимоеЗначение");
    КонецПроцедуры
    
    // Обработка нажатия кнопки "ОК"
    Процедура ОК()
        // Здесь можно добавить любые проверки корректности введенных данных
        Если ТипЗначенияСтр(ВводимоеЗначение) <> "Число" Тогда
            Предупреждение("Введено некорректное значение!");
            Возврат; // Не закрываем форму, даем исправить
        КонецЕсли;
    
        Результат = ВводимоеЗначение;
        Отказ = 0; // Ввод успешен
        Форма.Закрыть(1); // Закрываем форму с положительным результатом
    КонецПроцедуры
    
    // Обработка нажатия кнопки "Отмена"
    Процедура Отмена()
        Отказ = 1; // Пользователь нажал "Отмена"
        Форма.Закрыть(0); // Закрываем форму с отрицательным результатом
    КонецПроцедуры
    
  4. Вызов формы из основного кода
    Чтобы использовать нашу форму, нужно открыть ее модально из того места, где раньше вызывалась функция ВвестиЧисло().
    
    Процедура ОсновнаяЛогика()
        Перем МоеЧисло;
        МоеЧисло = 5;
    
        // Открываем нашу форму модально
        // В параметрах можно передать начальное значение и текст подсказки
        ОткрытьФормуМодально("Обработка.УниверсальныйВвод", МоеЧисло);
    
        // После закрытия формы можно проверить, был ли ввод успешным
        Если МоеЧисло.Отказ = 0 Тогда
            Сообщить("Пользователь ввел число: " + МоеЧисло.Результат);
        Иначе
            Сообщить("Пользователь отказался от ввода.");
        КонецЕсли;
    КонецПроцедуры
    

    Важный момент: Чтобы выделить текст в поле ввода на своей форме, можно использовать следующий, второй метод, но применять его прямо перед вызовом ОткрытьФормуМодально(). Это будет работать гораздо надежнее, чем со стандартным диалогом.

Решение 2: Эмуляция нажатия клавиш через WScript.Shell (обходной путь)

Этот способ является скорее "хаком", чем полноценным решением. Его суть заключается в том, чтобы программно отправить операционной системе команду нажать комбинацию клавиш для выделения текста (например, Shift+End) непосредственно перед тем, как на экране появится диалоговое окно. Система "подумает", что клавиши нажал пользователь, и выделит текст в активном поле ввода.

Для реализации используется COM-объект WScript.Shell.

Пример реализации:


Перем МоеЧисло;
МоеЧисло = 5;

// Создаем COM-объект
Попытка
    WSHShell = СоздатьОбъект("WScript.Shell");
Исключение
    Сообщить("Не удалось создать объект WScript.Shell. Проверьте настройки безопасности ОС.", "!");
    Возврат;
КонецПопытки;

// Отправляем команду на нажатие клавиш Shift+End.
// Плюсик "+" означает Shift, а "{END}" - клавишу End.
// Курсор в диалоге ВвестиЧисло() по умолчанию стоит в начале,
// поэтому эта комбинация выделит всю строку.
WSHShell.SendKeys("+(END)");

// Сразу после отправки команды вызываем диалог.
// Успех зависит от того, успеет ли команда выполниться до появления окна.
ВвестиЧисло(МоеЧисло, "Введите число:", 10, 2);

Сообщить("Введено число: " + МоеЧисло);

Крайне важно понимать недостатки этого метода:

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

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

← На главную