Как получить количество набранных символов в поле ввода формы 1С во время набора текста?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При реализации интерфейсов для отправки SMS-сообщений или работы с полями ограниченной длины часто возникает задача отображать пользователю количество уже введенных или оставшихся символов прямо в процессе набора текста. Обычное событие ПриИзменении для этой цели не подходит, поскольку оно срабатывает только после потери фокуса элементом управления или при нажатии клавиши Enter.

Разберем, почему попытки реализовать подсчет через механизм автоподбора часто приводят к неожиданной очистке поля ввода, и рассмотрим правильные варианты решения этой задачи в 1С.

Почему сбрасывается текст и курсор при использовании события «АвтоПодбор»?

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

  1. Перезапись входного параметра события: Параметр Текст в процедуре автоподбора содержит текущую строку, введенную пользователем. Если присвоить этому параметру число (например, результат вычисления СтрДлина(Текст)), система попытается подставить это число в поле ввода или вовсе сбросит буфер ввода.
  2. Включенная стандартная обработка: Механизм автоподбора спроектирован для поиска ссылочных данных («ввод по строке») и формирования выпадающего списка. Если свойство СтандартнаяОбработка остается равным Истина, платформа при паузе в наборе пытается сопоставить текст с элементами базы данных и, не найдя совпадений, сбрасывает введенную строку к исходному значению реквизита.
  3. Перерисовка формы и серверные вызовы: Попытка вызывать серверные процедуры (контекстные серверные вызовы) или обращаться к свойствам формы через обработчики ожидания инициирует синхронизацию состояния с сервером. В результате контекст редактирования теряется, а свойство ТекстРедактирования очищается.

Способ 1. Использование события «ИзменениеТекстаРедактирования» (рекомендуемый вариант)

Для отслеживания ввода символов в реальном времени в управляемых формах 1С предусмотрено штатное событие поля ввода — ИзменениеТекстаРедактирования. В отличие от автоподбора, оно срабатывает моментально при каждом нажатии клавиши или вставке фрагмента текста без ожидания паузы.

Посмотрим на пример правильной реализации обработчика:


&НаКлиенте
Процедура ТекстСмсИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
    
    // Получаем текущее количество набранных символов
    КоличествоСимволов = СтрДлина(Текст);
    
    // Выводим информацию пользователю (например, в надпись на форме)
    Элементы.НадписьКоличествоСимволов.Заголовок = "Символов: " + Строка(КоличествоСимволов) + " из 70";
    
КонецПроцедуры

Важные правила при работе с этим событием:

  1. Процедура должна выполняться строго на клиенте директивой &НаКлиенте.
  2. Нельзя внутри обработчика выполнять вызовы &НаСервере, иначе фокус слетит с поля редактирования.
  3. Параметр Текст предназначен только для чтения текущего состояния строки, не перезаписывайте его другими типами данных.

Способ 2. Корректная настройка события «АвтоПодбор»

Если по каким-либо причинам используется событие АвтоПодбор, необходимо явно отключить системное поведение платформы, чтобы избежать очистки строки.

Разберем по шагам правильный код обработчика:


&НаКлиенте
Процедура ТекстСмсАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    // Отключаем стандартный поиск ссылочных значений
    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = Неопределено;
    
    // Рассчитываем длину набранного текста
    КоличествоСимволов = СтрДлина(Текст);
    
    // Обновляем информационный элемент формы
    Элементы.НадписьКоличествоСимволов.Заголовок = "Осталось символов: " + Строка(70 - КоличествоСимволов);
    
КонецПроцедуры

Способ 3. Ограничение длины строки на уровне реквизита

Если задача заключается исключительно в том, чтобы не позволить пользователю ввести больше определенного количества знаков (например, не более 70 символов для одного SMS-сообщения), самым надежным и простым решением является установка жесткого ограничения на тип данных реквизита.

Рассмотрим порядок действий:

  1. Открываем свойства реквизита формы или объекта, к которому привязано поле ввода.
  2. В типе данных выбираем Строка и задаем фиксированную длину (например, 70 знаков).
  3. Снимаем флаг Неограниченная длина.

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

Способ 4. Дополнительный контроль при завершении редактирования

Для гарантированной проверки текста перед выполнением целевого действия (например, перед отправкой сообщения) рекомендуется добавить валидацию в событие ПриИзменении или в процедуру нажатия командной кнопки:


&НаКлиенте
Процедура ОтправитьСМС(Команда)
    
    Если СтрДлина(Объект.ТекстСмс) > 70 Тогда
        ПоказатьПредупреждение(, "Длина сообщения превышает допустимый лимит в 70 символов!");
        Возврат;
    КонецЕсли;
    
    // Вызов процедуры отправки
    ОтправитьСообщениеНаСервере();
    
КонецПроцедуры
← На главную