При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с необходимостью реализовать «живой» отклик системы на действия пользователя. Например, это может быть счетчик символов, динамический поиск или подсчет количества строк в текстовом поле прямо в процессе набора текста. Для этих целей идеально подходит событие ИзменениеТекстаРедактирования. Однако здесь кроется коварная особенность платформы: как только мы пытаемся обновить какой-либо другой реквизит формы внутри этого обработчика, текст в самом редактируемом поле может внезапно исчезнуть или «откатиться» к предыдущему состоянию. Разберем детально, почему это происходит и как настроить форму правильно.
Давайте проанализируем ситуацию. У нас есть многострочное поле ввода, связанное с реквизитом Реквизит1 (тип Строка), и поле надписи, отображающее данные Реквизит2. Мы пишем код в обработчике события ИзменениеТекстаРедактирования для Реквизит1, который при каждом нажатии клавиши записывает что-то в Реквизит2.
Проблема заключается в специфике работы управляемого приложения. В момент ввода текста в поле данные в самом Реквизит1 еще не обновлены — они обновятся только тогда, когда пользователь закончит ввод и покинет поле (событие ПриИзменении). Пока идет ввод, мы работаем с «визуальным слоем» данных.
Когда мы программно изменяем Реквизит2, платформа 1С инициирует обновление всей формы, чтобы отобразить новые данные. В этот момент система видит, что поле ввода Реквизит1 находится в режиме редактирования, и пытается синхронизировать его визуальное содержимое с данными реквизита. Так как в самом Реквизит1 еще пусто (или старое значение), а настройка обновления стоит по умолчанию, платформа «сбрасывает» введенный пользователем текст. Это стандартное поведение механизма синхронизации данных между клиентом и сервером.
Для управления этим поведением у поля ввода существует специальное свойство — ОбновлениеТекстаРедактирования (в англоязычном варианте EditTextUpdate). Именно оно определяет, как платформа должна реагировать на изменение данных формы во время активного редактирования поля. Рассмотрим три возможных значения этого свойства:
Рассмотрим пошагово, как применить это решение:
Строка).После этой настройки при программном изменении соседних реквизитов внутри события ИзменениеТекстаРедактирования основной текст больше не будет пропадать.
Разберем практический пример, как правильно написать код обработчика, чтобы подсчитывать количество строк в реальном времени. Мы будем использовать параметр Текст, который передается в событие — именно он содержит то, что пользователь видит на экране в данный момент.
&НаКлиенте
Процедура Реквизит1ИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
// Подсчитываем количество строк в переменной Текст
// Используем функцию СтрЧислоСтрок
КоличествоСтрок = СтрЧислоСтрок(Текст);
// Обновляем другой реквизит формы
// Благодаря настройке "Не использовать" в ОбновлениеТекстаРедактирования,
// основной текст в поле ввода останется на месте.
Реквизит2 = "Введено строк: " + Формат(КоличествоСтрок, "ЧГ=0");
КонецПроцедуры
Важно помнить, что событие ИзменениеТекстаРедактирования срабатывает на каждое нажатие клавиши. Проанализируем важные рекомендации по работе с этим событием:
1. Отсутствие серверных вызовов. Категорически не рекомендуется вызывать серверные процедуры (&НаСервере) внутри этого события. Даже самый быстрый серверный вызов создаст заметную задержку (лаг) при вводе текста, что сделает работу пользователя невыносимой. Все вычисления должны быть только на стороне клиента.
2. Позиция курсора (каретки). Если вы попытаетесь внутри этого события не просто прочитать параметр Текст, а перезаписать его (например, для автоматического изменения регистра), вы столкнетесь с тем, что курсор прыгнет в начало строки. Чтобы этого избежать, разработчики иногда используют объект WScript.Shell для эмуляции нажатий клавиш или работают со свойством ВыделенныйТекст, но штатного и элегантного способа управления курсором «в моменте» в 1С практически нет. Поэтому свойство ОбновлениеТекстаРедактирования = Не использовать является самым стабильным инструментом.
3. Использование таймеров для сложных задач. Если логика обработки текста тяжелая (например, сложная проверка по регулярным выражениям), лучше использовать ПодключитьОбработчикОжидания. В событии ИзменениеТекстаРедактирования мы лишь взводим флаг НужноОбновить = Истина, а отдельная процедура раз в 0.5 секунды проверяет этот флаг и выполняет расчеты. Это обеспечит максимальную плавность интерфейса.
Таким образом, мы выяснили, что «магическое» исчезновение текста — это не баг платформы, а штатное поведение системы синхронизации данных. Правильная настройка свойств элемента формы позволяет полностью контролировать этот процесс и создавать интерактивные интерфейсы без потери данных.