При разработке интерфейсов в системе «1С:Предприятие» перед программистом часто возникает задача: ограничить ввод данных в определенное поле так, чтобы пользователь мог вводить исключительно цифры. Классическим примером является поле для ввода номера телефона, ИНН, СНИЛС, артикула или ОГРН. Если данные заносятся с лишними символами (пробелами, дефисами, буквами), это гарантированно приводит к сбоям при интеграциях, отправке SMS, сверке контрагентов или поиске записей в базе данных.
В этой статье мы подробно проанализируем, почему стандартные подходы вроде маски ввода или смены типа реквизита на числовой часто не подходят для реальных задач бизнеса. Мы рассмотрим современные и классические способы очистки строк «на лету» и по завершении ввода, изучим работу с регулярными выражениями в платформе 1С и разберем готовые механизмы Библиотеки Стандартных Подсистем (БСП).
Первое, что приходит в голову начинающему разработчику — это использование стандартного свойства поля ввода Маска. Например, для ввода 12-значного номера телефона устанавливается маска вида 999999999999. Однако на практике такой интерфейс вызывает сильное раздражение у пользователей и приводит к ошибкам заполнения:
Таким образом, маска ввода подходит только для строго фиксированных документов (например, серии и номера паспорта), но крайне нежелательна для гибких текстовых полей.
На форумах часто предлагают альтернативный вариант: сделать реквизит формы с типом Число, а при записи объекта преобразовывать его значение в строку. Мы настоятельно рекомендуем избегать этого метода из-за следующих архитектурных проблем:
ЧГ=0, что создает лишнюю работу и увеличивает риск ошибок при ручной настройке форм.Следовательно, правильный путь — хранить данные в текстовом реквизите и контролировать ввод программно.
Рассмотрим вариант фильтрации текста «на лету», когда платформа анализирует каждый символ в момент его нажатия на клавиатуре. Для этого у поля ввода на управляемой форме существует событие ИзменениеТекстаРедактирования.
Этот метод позволяет пользователю физически не вводить некорректные символы — буквы и спецсимволы просто не будут отображаться при нажатии. Давайте разберем по шагам, как это реализовать.
Однако помните о важном нюансе: динамическая перезапись текста в процессе редактирования может приводить к смещению курсора (каретки) в самый конец текстового поля, что мешает редактированию середины строки. Данный метод следует применять аккуратно.
Гораздо более стабильным, надежным и удобным для пользователя подходом является очистка строки в момент завершения ввода. Пользователь может вставить скопированный текст в любом формате (например, "+7 (999) 123-45-67"), а система при потере фокуса полем ввода автоматически отбросит все лишнее, оставив только чистые цифры: "79991234567".
Для реализации этого подхода мы используем событие поля ввода ПриИзменении.
Если ваша информационная база работает на современной платформе версии 8.3.23 и выше, вам доступен мощный встроенный механизм регулярных выражений. Это самый производительный и элегантный способ очистить строку.
Проанализируем пример кода, который решает задачу всего в одну строчку:
&НаКлиенте
Процедура НомерТелефонаПриИзменении(Элемент)
// Получаем текущее значение из реквизита
ИсходныйТекст = Объект.НомерТелефона;
// Регулярное выражение [^0-9] находит любой символ, не являющийся цифрой от 0 до 9
// Функция СтрЗаменитьПоРегулярномуВыражению заменяет все такие символы на пустую строку
ОчищенныйТекст = СтрЗаменитьПоРегулярномуВыражению(ИсходныйТекст, "[^0-9]", "");
// Записываем очищенный результат обратно в реквизит
Объект.НомерТелефона = ОчищенныйТекст;
КонецПроцедуры
Этот код работает на стороне клиента мгновенно и без лишней нагрузки на сервер.
Если вам приходится поддерживать конфигурации, работающие на более старых версиях платформы 1С:Предприятие, регулярные выражения встроенного языка недоступны. В этом случае мы можем применить альтернативные проверенные алгоритмы.
Вариант А. Высокопроизводительный трюк со «СтрРазделить» и «СтрСоединить» (начиная с 1С 8.3.6)
Классический посимвольный перебор строки в цикле работает достаточно медленно на длинных строках. Мы можем использовать оригинальный метод разделения строки, который работает на уровне платформенных C++ алгоритмов чрезвычайно быстро:
&НаКлиенте
Функция ОчиститьСтрокуТолькоЦифры(Знач ИсходнаяСтрока)
// Шаг 1: Получаем все нецифровые символы из исходной строки
МассивЛишнихСимволов = СтрРазделить(ИсходнаяСтрока, "0123456789", Ложь);
СтрокаЛишнихСимволов = СтрСоединить(МассивЛишнихСимволов, "");
// Шаг 2: Разделяем исходную строку по найденным нецифровым символам
МассивТолькоЦифр = СтрРазделить(ИсходнаяСтрока, СтрокаЛишнихСимволов, Ложь);
// Шаг 3: Соединяем фрагменты обратно в единую строку
Возврат СтрСоединить(МассивТолькоЦифр, "");
КонецФункции
Этот алгоритм работает без единого цикла Для, что делает его оптимальным выбором для оптимизации производительности мобильных клиентов и слабых рабочих станций.
Вариант Б. Использование регулярных выражений через COM (VBScript.RegExp)
Если ваши пользователи работают исключительно под управлением операционной системы Windows (тонкий или толстый клиент), вы можете обратиться к системному движку регулярных выражений Microsoft Active Scripting через COM-объект:
&НаКлиенте
Функция ОчиститьСтрокуЧерезCOM(Знач ИсходнаяСтрока)
Попытка
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "[^0-9]";
Возврат RegExp.Replace(ИсходнаяСтрока, "");
Исключение
// На случай запуска на Linux или macOS клиенте, используем резервный метод
Возврат ОчиститьСтрокуТолькоЦифры(ИсходнаяСтрока);
КонецПопытки;
КонецФункции
Вариант В. Использование готовых функций БСП
Разработчикам типовых конфигураций нет необходимости изобретать велосипед. Библиотека Стандартных Подсистем уже содержит готовые оптимизированные функции. Например, общий модуль УправлениеКонтактнойИнформациейКлиентСервер предоставляет готовую экспортную функцию:
&НаКлиенте
Процедура НомерТелефонаПриИзменении(Элемент)
Объект.НомерТелефона = УправлениеКонтактнойИнформациейКлиентСервер.ОставитьТолькоЦифрыВСтроке(Объект.НомерТелефона);
КонецПроцедуры
Если же перед вами стоит задача не очистить строку, а просто проверить, состоит ли она целиком из цифр, используйте функцию из строкового модуля БСП:
Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Объект.НомерТелефона) Тогда
// Обработка ошибки заполнения поля
КонецЕсли;
Если конечной целью вашей разработки является хранение и обработка контактных данных контрагентов, партнеров или физических лиц, наилучшим решением будет использование типового механизма контактной информации БСП.
Этот подход решает проблему ввода на системном уровне:
Резюмируя, для простых кастомных полей ввода на формах используйте событие ПриИзменении в связке с регулярными выражениями или функциями очистки строки. Для сложных бизнес-задач ведения базы телефонов всегда внедряйте подсистему контактной информации БСП.