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

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

При разработке прикладных решений в 1С часто возникает задача ограничить или проверить формат ввода строковых данных — например, когда строка должна строго соответствовать шаблону вида №215 от 01.01.2011г., где номер и дата могут изменяться. Разберем различные способы решения этой задачи: от использования свойств элементов формы до программной валидации через регулярные выражения и строковые функции.

Способ 1. Проверка строки с помощью регулярных выражений

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

Вариант 1. Штатные методы платформы (начиная с версии 8.3.23)

Начиная с версии платформы 8.3.23, доступна встроенная кроссплатформенная функция СтрПодобнаПоРегулярномуВыражению(). Она работает как под Windows, так и под Linux:


Шаблон = "^№\d+\s+от\s+(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d{2}г\.$";
СтрокаКорректна = СтрПодобнаПоРегулярномуВыражению(ВходнаяСтрока, Шаблон);

Если Не СтрокаКорректна Тогда
    Сообщить("Строка не соответствует заданному шаблону!");
КонецЕсли;

Вариант 2. Использование COM-объекта VBScript.RegExp (для предыдущих версий платформы под Windows)

Для более ранних версий платформы 1С для валидации строки по шаблону можно применить объект VBScript.RegExp:


Функция ПроверитьСтрокуПоМаске(СтрокаПроверки) Экспорт

    СтрокаПроверки = СокрЛП(СтрокаПроверки);
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = Ложь;
    RegExp.Global = Ложь;
    RegExp.IgnoreCase = Истина;
    RegExp.Pattern = "^№\d+\s+от\s+(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d{2}г\.$";
    
    Возврат RegExp.Test(СтрокаПроверки);

КонецФункции

Учтем ограничение: создание COM-объектов поддерживается исключительно в операционных системах Windows и не будет работать на сервере или клиенте под управлением Linux.

Способ 2. Установка маски и подсказок на уровне формы

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

Разберем установку маски по шагам:

  1. В палитре свойств нужного элемента формы находим свойство Маска и задаем шаблон, например: №999 от 99.99.9999г..
  2. Если маску необходимо менять динамически из программного кода (например, при выборе определенного типа документа или контрагента), устанавливаем ее через обращение к элементам формы: ЭтаФорма.Элементы.ПолеВвода.Маска = "№999 от 99.99.9999г.";
  3. Для управляемых форм при динамическом переключении формата данных можно также управлять свойством ПодсказкаВвода:
    
    Процедура ВидДокументаПриИзменении(Элемент)
        
        Если Объект.ВидДокумента = "Договор" Тогда
            Элементы.НомерИДата.ПодсказкаВвода = "№123 от 01.01.2023г.";
        Иначе
            Элементы.НомерИДата.ПодсказкаВвода = "Без номера";
        КонецЕсли;
        
    КонецПроцедуры
    

Важно помнить: свойство Маска жестко фиксирует количество символов. Если номер документа может состоять из переменного числа цифр (например, 1, 2 или 5 знаков), маска поля ввода заставит заполнять пустые позиции пробелами или нулями. В таких сценариях надежнее разделять ввод на два поля (номер и дата) либо использовать валидацию кодом.

Способ 3. Программный парсинг и валидация даты

Проверка только регулярным выражением или строковой маской не гарантирует корректность календарной даты (например, строка может содержать несуществующую дату вроде 31.02.2023 или 29.02.2023 для невисокосного года). Выясним, как выполнить полную проверку строковыми функциями и преобразованием в дату.

Посмотрим на пример извлечения даты и ее проверки через конструкцию Попытка ... Исключение:


Функция ПроверитьИПолучитьДату(Знач ТекстСтроки) Экспорт

    // Предположим, строка имеет фиксированную позицию даты: "№215 от 01.01.2011г."
    ПозицияОт = СтрНайти(ТекстСтроки, "от ");
    Если ПозицияОт = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    СтрокаДаты = СокрЛП(Сред(ТекстСтроки, ПозицияОт + 3));
    СтрокаДаты = СтрЗаменить(СтрокаДаты, "г.", "");
    СтрокаДаты = СокрЛП(СтрокаДаты);
    
    // Ожидаемый формат: ДД.ММ.ГГГГ
    ЧастиДаты = СтрРазделить(СтрокаДаты, ".");
    Если ЧастиДаты.Количество() <> 3 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Попытка
        СтрокаДляПреобразования = ЧастиДаты[2] + ЧастиДаты[1] + ЧастиДаты[0]; // ГГГГММДД
        ДатаРезультат = Дата(СтрокаДляПреобразования);
        Возврат ДатаРезультат;
    Исключение
        Сообщить("Введена некорректная календарная дата!");
        Возврат Неопределено;
    КонецПопытки;

КонецФункции

Способ 4. Формирование строки по шаблону

Если задача заключается не в проверке ввода, а в программной сборке строки по заданному формату, рекомендуется использовать метод СтрШаблон() совместно с функцией Формат():


НомерДокумента = 215;
ДатаДокумента = ТекущаяДатаСеанса();

// Формируем результирующую строку по маске
СтрокаДокумента = СтрШаблон("№%1 от %2г.", НомерДокумента, Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));

Такой подход обеспечивает понятность кода, исключает громоздкую строковую конкатенацию и гарантирует правильный вывод даты с лидирующими нулями.

← На главную