При разработке интерфейсов в 1С:Предприятие 8 часто возникает задача повышения удобства работы пользователя (UX). Одним из таких улучшений является визуальный счетчик символов, который в реальном времени показывает, сколько знаков еще можно ввести в текстовое поле. Это особенно актуально для реквизитов с ограниченной длиной, например, для комментариев, СМС-сообщений или описаний товаров, где лимит жестко задан структурой базы данных или внешними требованиями.
В этой статье мы подробно разберем, как реализовать функционал «как в Word», чтобы при каждом нажатии клавиши цифра остатка обновлялась мгновенно. Мы проанализируем необходимые функции работы со строками, выберем подходящие события формы и рассмотрим технические нюансы, которые могут возникнуть при реализации.
Прежде чем переходить к динамике, вспомним базовый инструментарий 1С для работы с текстом. Для решения нашей задачи нам потребуются следующие функции:
СтрДлина — получает общее количество символов в строке.СокрЛП — удаляет незначащие пробелы слева и справа. Это важно, если мы хотим считать только значащий текст.СтрЗаменить — позволяет удалить пробелы внутри строки, если по условию задачи пробелы символами не считаются.Рассмотрим пример кода, который вычисляет чистую длину текста без учета всех пробелов:
// Очищаем строку от пробелов и считаем длину
ЧистаяДлина = СтрДлина(СтрЗаменить(Объект.Реквизит, " ", ""));
Остаток = 150 - ЧистаяДлина;
Многие начинающие разработчики пытаются использовать событие ПриИзменении. Однако у него есть существенный недостаток для нашей задачи: это событие срабатывает только тогда, когда поле ввода теряет фокус (пользователь нажал Enter или перешел в другое поле). Для реализации «живого» счетчика нам нужно событие, которое реагирует на каждый введенный символ.
Проанализируем ситуацию: если мы напишем код в ПриИзменении, пользователь увидит остаток символов только после завершения ввода. Это лишает счетчик смысла, так как лимит может быть уже превышен. Поэтому нам нужно использовать специализированное событие элемента формы.
Для того чтобы интерфейс обновлялся в процессе набора текста, в 1С предусмотрено событие поля ввода ИзменениеТекстаРедактирования. Оно передает в процедуру-обработчик текущий текст, который находится в поле в данный момент, даже если он еще не записан в реквизит объекта.
Разберем пошагово процесс настройки формы:
ОставшиесяСимволы с типом Строка. Именно его мы будем выводить пользователю в качестве индикатора.ОбновлениеТекстаРедактирования в значение Не использовать. Это критически важно, чтобы система не пыталась программно корректировать текст в процессе ввода, что может привести к «прыжкам» курсора.ИзменениеТекстаРедактирования и создадим клиентскую процедуру.Рассмотрим пример реализации кода для этого события:
&НаКлиенте
Процедура ТекстовоеПолеИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
// Устанавливаем максимальный лимит
МаксДлина = 150;
// Считаем текущую длину (можно использовать СокрЛП для игнорирования концевых пробелов)
ТекущаяДлина = СтрДлина(Текст);
// Вычисляем остаток
Остаток = МаксДлина - ТекущаяДлина;
// Обновляем визуальный индикатор на форме
Если Остаток >= 0 Тогда
ЭтаФорма.ОставшиесяСимволы = "Осталось символов: " + Строка(Остаток);
Иначе
ЭтаФорма.ОставшиесяСимволы = "Лимит превышен на: " + Строка(Абс(Остаток));
КонецЕсли;
КонецПроцедуры
При реализации счетчика важно выяснить, как именно должны учитываться символы. В платформе 1С есть свои особенности:
Учет переносов строк: Если поле ввода многострочное, символ переноса строки в 1С фактически состоит из двух знаков — Символы.ПС (перевод строки) и Символы.ВК (возврат каретки). Функция СтрДлина посчитает их как два символа. Если ваша база данных ограничивает строку длиной 150, то 10 переносов строк заберут 20 позиций лимита. Выясним это заранее, чтобы пользователь не столкнулся с ошибкой записи при визуально «пустом» месте.
Очистка текста: Если задача требует игнорировать пробелы, используйте СтрЗаменить(Текст, " ", ""). Однако помните, что существуют также неразрывные пробелы и знаки табуляции, которые могут попасть в поле при копировании текста из интернета.
Для того чтобы сделать интерфейс еще более дружелюбным, мы можем программно изменять цвет текста счетчика. Например, если осталось менее 10 символов, подсветим надпись красным цветом. Разберем, как это сделать:
&НаКлиенте
Процедура ВывестиСообщениеОбОстатке(ДлинаТекста)
Лимит = 150;
Остаток = Лимит - ДлинаТекста;
ЭлементДекорация = Элементы.ДекорацияСтатус;
ЭлементДекорация.Заголовок = "Осталось: " + Остаток;
// Меняем цвет при приближении к лимиту
Если Остаток < 0 Тогда
ЭлементДекорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст;
ИначеЕсли Остаток <= 10 Тогда
ЭлементДекорация.ЦветТекста = Новый Цвет(255, 165, 0); // Оранжевый
Иначе
ЭлементДекорация.ЦветТекста = ЦветаСтиля.ТекстВторостепеннойНадписи;
КонецЕсли;
КонецПроцедуры
Не забудем про ситуацию, когда пользователь открывает уже существующий документ. В этом случае событие ИзменениеТекстаРедактирования не сработает, пока пользователь не начнет вводить текст. Чтобы счетчик показал актуальное состояние сразу, нужно вызвать расчет в событии ПриОткрытии или ПриЧтенииНаСервере (с последующей передачей на клиент).
Проанализируем пример для процедуры ПриОткрытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Инициализируем счетчик значением из существующего реквизита
ДлинаПриОткрытии = СтрДлина(Объект.ИмяРеквизита);
ВывестиСообщениеОбОстатке(ДлинаПриОткрытии);
КонецПроцедуры
Мы рассмотрели наиболее эффективный способ реализации динамического счетчика символов в 1С. Использование события ИзменениеТекстаРедактирования в сочетании с правильной настройкой свойств элемента формы позволяет добиться плавности работы интерфейса, сравнимой с современными веб-приложениями и текстовыми процессорами. Помните о важности выполнения всех расчетов НаКлиенте, чтобы избежать лишних серверных вызовов и «зависаний» формы при быстром наборе текста.