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