Как запретить ввод текста в поле и организовать проверку на ввод только цифр в 1С

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

При разработке конфигураций на платформе 1С часто возникает задача строгой валидации вводимых данных. Особенно это актуально для контактной информации, такой как номера телефонов. Если позволить пользователям вводить данные в свободном формате, информационная база быстро превращается в «бардак» из записей вида «8-900-123-45-67», «+7 (900)...» или даже «099-89-0000Мама». Для обеспечения чистоты данных необходимо не только проверять ввод при записи, но и ограничивать возможности пользователя непосредственно в момент редактирования поля.

В этой статье мы подробно рассмотрим, как реализовать запрет на ввод любых символов, кроме цифр, разберем работу с регулярными выражениями, масками и встроенными функциями Библиотеки стандартных подсистем (БСП). Мы также проанализируем ситуацию, когда в базе уже накоплено большое количество некорректных данных, и выясним, как их очистить, не нарушая работу пользователей.

Способ 1. Использование регулярных выражений (Native и COM)

Регулярные выражения — это самый гибкий и мощный способ проверки строк. Начиная с версии платформы 1С 8.3.23, работа с регулярными выражениями стала встроенной (native). Если же вы работаете на более старых версиях платформы, можно воспользоваться объектом операционной системы VBScript.RegExp.

Разберем пример функции, которая проверяет, состоит ли строка только из цифр, используя встроенные возможности новых версий платформы. Проанализируем следующий код:


// Для платформы 8.3.23 и выше
Функция СтрокаСодержитТолькоЦифры(ВходнаяСтрока)
    // Шаблон \d означает любую цифру, {1,} — один и более символов
    // Символы ^ и $ обозначают начало и конец строки соответственно
    Возврат ПроверитьСтроку(ВходнаяСтрока, "^\d+$");
КонецФункции

Если ваша платформа ниже 8.3.23, рассмотрим вариант с использованием COM-объекта. Это универсальное решение, которое будет работать практически на любой системе Windows:


Функция ТолькоЦифрыРегВыражение(Знач Текст)
    РегВыражение = Новый COMОбъект("VBScript.RegExp");
    РегВыражение.IgnoreCase = Истина;
    РегВыражение.Global = Истина;
    РегВыражение.MultiLine = Истина;
    
    // Ищем всё, что НЕ является цифрой
    РегВыражение.Pattern = "[^\d]"; 
    
    // Заменяем все не-цифры на пустую строку
    Результат = РегВыражение.Replace(Текст, "");
    Возврат Результат;
КонецФункции

Этот метод особенно хорош тем, что его можно вызвать в обработчике события ПриИзменении. Как только пользователь закончит ввод, программа мгновенно «вычистит» лишние символы, оставив только цифровой ряд.

Способ 2. Программный перебор строки (Классический метод)

Если по каким-то причинам использование регулярных выражений недоступно или кажется избыточным, можно реализовать проверку простым перебором символов строки. Рассмотрим пример функции, которая сравнивает каждый символ со списком допустимых:


Функция ОставитьТолькоЦифры(ВходнаяСтрока)
    ДопустимыеСимволы = "1234567890";
    ВыходнаяСтрока = "";
    
    Для Позиция = 1 По СтрДлина(ВходнаяСтрока) Цикл
        ТекущийСимвол = Сред(ВходнаяСтрока, Позиция, 1);
        Если Найти(ДопустимыеСимволы, ТекущийСимвол) > 0 Тогда
            ВыходнаяСтрока = ВыходнаяСтрока + ТекущийСимвол;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ВыходнаяСтрока;
КонецФункции

Важный момент: Эту функцию рекомендуется вызывать в процедуре ПриИзменении на форме. Это обеспечит визуальный отклик для пользователя: он ввел «8-900-номер», а в поле сразу осталось «8900». Это гораздо удобнее, чем получать ошибку только в момент записи объекта.

Способ 3. Использование маски ввода

В свойствах элемента формы ПолеВвода существует свойство Маска. Например, маска 9999999999 ограничит ввод ровно десятью цифрами. Однако, как было замечено в обсуждении, у этого метода есть существенный минус при работе с существующими данными. Если в базе уже есть «грязные» данные (например, с буквами или тире), маска может просто обрезать их или отображать некорректно.

Посмотрим на рекомендации опытных разработчиков: если в базе уже 50 000 записей, установку маски нужно делать только после полной очистки данных. Кроме того, маску можно устанавливать динамически. Проанализируем ситуацию: если поле пустое — ставим маску для помощи пользователю, если заполнено старыми данными — временно отключаем её, чтобы не мешать просмотру.

Способ 4. Библиотека стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (что верно для большинства современных решений, таких как Бухгалтерия 3.0, УТ 11, ERP), вам не нужно изобретать велосипед. Программисту доступны готовые инструменты в общем модуле СтроковыеФункцииКлиентСервер.

Рассмотрим применение этой функции:


// Очистка строки от всех нецифровых символов с помощью БСП
ОчищенныйНомер = СтроковыеФункцииКлиентСервер.ТолькоЦифры(Объект.Поле3);

Этот метод является наиболее предпочтительным для типовых конфигураций, так как он оптимизирован и проверен временем. Использование методов БСП делает ваш код более понятным для других разработчиков и упрощает дальнейшее обновление конфигурации.

Способ 5. Работа с подсистемой «Контактная информация»

Если ваше поле является частью стандартного механизма контактной информации 1С, лучше всего использовать настройки в справочнике Виды контактной информации. Для типа «Телефон» предусмотрены флаги:

  1. Запрещать ввод некорректного адреса: активирует жесткую проверку.
  2. Редактирование только в диалоге: заставляет пользователя вводить номер в специальном окне, где уже настроены все проверки и маски.

Выясним причину, почему это иногда не работает: часто разработчики создают свои реквизиты (например, Поле3), игнорируя штатный механизм КИ. В таком случае программная проверка остается единственным выходом.

Как очистить накопленный «бардак» (50 000 записей)

Когда данных уже много, простая установка запрета на ввод заблокирует работу пользователей, так как старые записи не будут проходить валидацию. Разберем по шагам план действий для исправления ситуации:

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

Для массовой проверки записей в клиент-серверном варианте можно использовать запросы. Хотя язык запросов 1С ограничен в плане работы со строками, мы можем найти «подозрительные» записи с помощью оператора ПОДОБНО:


// Поиск записей, содержащих любые символы, кроме цифр
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   КонтактнаяИнформация.Поле3 КАК Номер
    |ИЗ
    |   РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |   КонтактнаяИнформация.Поле3 ПОДОБНО ""%[^0-9]%""";

Важно: Обратите внимание, что поддержка отрицания в квадратных скобках [^0-9] зависит от используемой СУБД и настроек платформы. Если стандартный запрос 1С не справляется, используйте обычную выборку и проверку на стороне сервера.

Резюме

Мы проанализировали несколько подходов к решению задачи. Для мгновенного ограничения ввода лучше всего подходит использование регулярных выражений или функции БСП в событии ПриИзменении. Для обеспечения долгосрочной целостности данных необходимо комбинировать маски ввода с программной проверкой в событии ПередЗаписью. Помните, что чистота данных — это не только запрет на ошибки, но и удобный интерфейс, который помогает пользователю вводить информацию правильно с первого раза.

← На главную