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

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

Если вы только начинаете работать с , настройка масок может показаться сложной. Однако после прочтения этой статьи вы сможете создавать гибкие решения для любых форматов — от телефонных номеров до банковских реквизитов. А опытные разработчики найдут здесь неочевидные приемы оптимизации и обработки исключений, которые не описаны в стандартной документации.

Что такое маска ввода и зачем она нужна в 1С

Маска ввода — это шаблон, который определяет, какие символы и в каком порядке пользователь может вводить в поле. В 1С:Предприятие маски применяются для:

  • 📞 Телефонных номеров (например, +7 (XXX) XXX-XX-XX)
  • 🆔 Идентификационных номеров (ИНН, СНИЛС, паспортные данные)
  • 💳 Банковских реквизитов (номера счетов, БИК)
  • 📅 Дат и времени в нестандартных форматах
  • 🔢 Серийных номеров оборудования с фиксированной структурой

Основные преимущества использования масок:

  • Снижение ошибок ввода — пользователь физически не может ввести некорректные данные.
  • Упрощение валидации — не нужно писать сложные проверки на стороне сервера.
  • Улучшение пользовательского опыта — подсказки в виде шаблона упрощают заполнение.
  • Стандартизация данных — все номера телефонов или ИНН хранятся в едином формате.

Однако маски имеют и ограничения. Например, они не заменяют полноценную валидацию — пользователь может ввести корректный по формату, но несуществующий ИНН. Также маски могут усложнить ввод, если шаблон слишком строгий или неудобный.

⚠️ Внимание: Маски ввода в работают только на стороне клиента. Это значит, что злоумышленник может обойти их, отправляя данные напрямую через HTTP-запросы или COM-соединение. Всегда дублируйте критичные проверки на сервере.

Способы создания масок ввода в 1С 8.3

В 1С:Предприятие 8.3 есть несколько способов реализовать маски ввода. Выбор метода зависит от версии платформы, типа данных и требуемой гибкости. Рассмотрим основные подходы:

Способ Подходит для Плюсы Минусы
Стандартный реквизит "Маска" Простые шаблоны (телефоны, даты) Простота настройки, нет кода Ограниченная функциональность
Регулярные выражения Сложные форматы (ИНН, СНИЛС) Максимальная гибкость Требует знания синтаксиса RegExp
Обработчик события "ПриИзменении" Динамические маски (изменяющиеся в зависимости от условий) Можно реализовать любую логику Требует программирования
Подсистема "Управляемые формы" Маски в управляемых формах Интеграция с интерфейсом Не работает в обычных формах

Для большинства задач достаточно стандартного реквизита Маска или простого регулярного выражения. Однако если вам нужна динамическая маска (например, формат телефона меняется в зависимости от страны), придется писать обработчик на встроенном языке.

Рассмотрим каждый способ подробнее, начиная с самого простого.

📊 Какой способ создания масок вы используете чаще?
Стандартный реквизит "Маска"
Регулярные выражения
Обработчик "ПриИзменении"
Подсистема управляемых форм
Не использую маски

Создание маски через стандартный реквизит

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

Шаг 1. Откройте конфигуратор и перейдите к объекту, где нужно добавить маску (например, справочник Контрагенты).

Шаг 2. Добавьте новый реквизит типа Строка (например, Телефон) или выберите существующий.

Шаг 3. В палитре свойств реквизита найдите поле Маска и введите шаблон. Примеры:

  • 📱 Для телефона: +7 (000) 000-00-00
  • 📅 Для даты: 00.00.0000
  • 🔢 Для кода: AA-000-AA (где A — буква, 0 — цифра)

Шаг 4. Сохраните конфигурацию и обновите базу данных.

Символы, которые можно использовать в маске:

  • 0 — обязательная цифра
  • 9 — необязательная цифра
  • A — обязательная буква
  • a — необязательная буква
  • \ — экранирование специальных символов
  • ; — разделитель для разных форматов
⚠️ Внимание: Стандартная маска в не поддерживает динамическое изменение формата. Если вам нужно, чтобы шаблон менялся в зависимости от первых введенных символов (например, +7 или +375 для разных стран), используйте регулярные выражения или обработчик события.

Пример маски для ИНН (10 или 12 цифр):

0000000000;000000000000

Здесь ; разделяет два возможных формата. Пользователь может ввести либо 10, либо 12 цифр.

Добавлен реквизит типа "Строка"|Указан корректный шаблон в свойстве "Маска"|Конфигурация сохранена и база обновлена|Маска тестируется в пользовательском режиме-->

Использование регулярных выражений для сложных масок

Если стандартной маски недостаточно (например, нужно проверить контрольную сумму в ИНН или СНИЛС), используйте регулярные выражения. Они позволяют создавать гибкие шаблоны с проверкой логики.

Шаг 1. Добавьте реквизит типа Строка (например, ИНН).

Шаг 2. В модуле формы или модуле объекта создайте обработчик события ПриИзменении для этого реквизита. Пример кода для проверки ИНН (10 или 12 цифр):

Процедура ИННПриИзменении(Элемент)

Если НЕ РегВыражение("^(|\d{10}|\d{12})$", ЭтоОбъект.ИНН) Тогда

Сообщить("Некорректный формат ИНН! Допустимо 10 или 12 цифр.");

ЭтоОбъект.ИНН = "";

КонецЕсли;

КонецПроцедуры

Разберем регулярное выражение:

  • ^ — начало строки
  • | — оператор "ИЛИ"
  • \d{10} — ровно 10 цифр
  • \d{12} — ровно 12 цифр
  • $ — конец строки

Для проверки контрольной суммы в ИНН можно использовать такой код:

Процедура ПроверитьКонтрольнуюСуммуИНН(ЗначениеИНН)

Если СтрДлина(ЗначениеИНН) = 10 Тогда

// Логика проверки для 10-значного ИНН

Коэффициенты = Новый Массив(10);

Коэффициенты[0] = 2; Коэффициенты[1] = 4; Коэффициенты[2] = 10;

Коэффициенты[3] = 3; Коэффициенты[4] = 5; Коэффициенты[5] = 9;

Коэффициенты[6] = 4; Коэффициенты[7] = 6; Коэффициенты[8] = 8;

Коэффициенты[9] = 0;

Сумма = 0;

Для Индекс = 0 По 9 Цикл

Сумма = Сумма + Сред(ЗначениеИНН, Индекс+1, 1) * Коэффициенты[Индекс];

КонецЦикла;

Если Сумма % 11 <> 0 Тогда

Возврат Ложь;

КонецЕсли;

ИначеЕсли СтрДлина(ЗначениеИНН) = 12 Тогда

// Логика проверки для 12-значного ИНН

// ... (аналогично)

КонецЕсли;

Возврат Истина;

КонецПроцедуры

Для СНИЛС можно использовать такое регулярное выражение:

^\d{3}-\d{3}-\d{3} \d{2}$

Оно проверяет формат XXX-XXX-XXX XX.

💡

Для отладки регулярных выражений используйте онлайн-сервисы вроде regex101.com или regexr.com. Они помогают визуализировать шаблон и тестировать его на разных входных данных.

Динамические маски с обработчиком "ПриИзменении"

Если формат маски должен меняться в зависимости от введенных данных (например, международные телефонные номера), используйте обработчик события ПриИзменении. Этот метод требует программирования, но дает максимальную гибкость.

Пример: маска для телефона, которая автоматически подставляет +7 и форматирует номер:

Процедура ТелефонПриИзменении(Элемент)

ТекущееЗначение = ЭтоОбъект.Телефон;

// Удаляем все нецифровые символы

ТолькоЦифры = СтрЗаменить(ТекущееЗначение, "+", "");

ТолькоЦифры = СтрЗаменить(ТолькоЦифры, " ", "");

ТолькоЦифры = СтрЗаменить(ТолькоЦифры, "(", "");

ТолькоЦифры = СтрЗаменить(ТолькоЦифры, ")", "");

ТолькоЦифры = СтрЗаменить(ТолькоЦифры, "-", "");

// Если начинается с 7 или 8, заменяем на +7

Если Лев(ТолькоЦифры, 1) = "8" Тогда

ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);

ИначеЕсли Лев(ТолькоЦифры, 1) = "7" Тогда

ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);

КонецЕсли;

// Форматируем номер

Если СтрДлина(ТолькоЦифры) > 0 Тогда

Результат = "+7 (";

Если СтрДлина(ТолькоЦифры) > 1 Тогда

Результат = Результат + Сред(ТолькоЦифры, 1, 3) + ") ";

Иначе

Результат = Результат + ТолькоЦифры + ") ";

КонецЕсли;

Если СтрДлина(ТолькоЦифры) > 4 Тогда

Результат = Результат + Сред(ТолькоЦифры, 4, 3) + "-";

КонецЕсли;

Если СтрДлина(ТолькоЦифры) > 7 Тогда

Результат = Результат + Сред(ТолькоЦифры, 7, 2) + "-";

КонецЕсли;

Если СтрДлина(ТолькоЦифры) > 9 Тогда

Результат = Результат + Сред(ТолькоЦифры, 9, 2);

КонецЕсли;

ЭтоОбъект.Телефон = Результат;

КонецЕсли;

КонецПроцедуры

Этот код:

  • 📱 Автоматически добавляет +7 для российских номеров.
  • 🔢 Форматирует номер в виде +7 (XXX) XXX-XX-XX.
  • ✅ Работает даже если пользователь вводит номер без форматирования (например, 89123456789).
⚠️ Внимание: При использовании динамических масок следите за производительностью. Если обработчик ПриИзменении выполняет сложные операции (например, обращается к базе данных), форма может начать "тормозить" при вводе. Оптимизируйте код или используйте ОтложенноеВыполнение.
Как ускорить работу динамической маски?

Используйте флаг ОтложенноеВыполнение для тяжелых операций:

Процедура ТелефонПриИзменении(Элемент)

ОтложенноеВыполнение.Добавить("ОбработатьТелефон", ЭтоОбъект);

КонецПроцедуры

Процедура ОбработатьТелефон(Объект) Экспорт

// Ваш код здесь

КонецПроцедуры

Это позволит не блокировать интерфейс во время ввода.

Маски в управляемых формах

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

Шаг 1. Откройте управляемую форму в конфигураторе.

Шаг 2. Добавьте элемент Поле ввода и свяжите его с нужным реквизитом.

Шаг 3. В свойствах поля найдите параметр Маска и укажите шаблон (аналогично обычным формам).

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

&НаКлиенте

Процедура ИННПриИзменении(Элемент)

Значение = Элемент.Значение;

// Проверяем формат с помощью регулярного выражения

Если НЕ РегВыражение("^\d{10,12}$", Значение) Тогда

ПоказатьОповещениеПользователя("Некорректный формат ИНН!", ТипОповещенияПользователя.Ошибка);

Элемент.Значение = "";

КонецЕсли;

КонецПроцедуры

Особенности работы с масками в управляемых формах:

  • 🔄 Маски работают и на тонком клиенте, и в веб-клиенте.
  • 🖥️ Для динамических масок используйте &НаКлиенте или &НаСервере в зависимости от логики.
  • ⚡ Для ускорения работы кэшируйте часто используемые регулярные выражения.

Пример кэширования регулярного выражения:

&НаКлиенте

Перем РегВыражениеИНН;

Процедура ПриСозданииНаКлиенте(Отказ)

РегВыражениеИНН = Новый РегВыражение("^\d{10,12}$");

КонецПроцедуры

Процедура ИННПриИзменении(Элемент)

Если НЕ РегВыражениеИНН.Совпадение(Элемент.Значение) Тогда

ПоказатьОповещениеПользователя("Ошибка!", ТипОповещенияПользователя.Ошибка);

КонецЕсли;

КонецПроцедуры

Типичные ошибки и как их избежать

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

Ошибка Причина Решение
Маска не применяется Не обновлена конфигурация или база данных Выполните Обновить конфигурацию базы данных
Медленный ввод в поле Слишком сложный обработчик ПриИзменении Оптимизируйте код или используйте ОтложенноеВыполнение
Маска сбрасывается при потере фокуса Конфликт с другими обработчиками Проверьте события ПриПотереФокуса и ПередЗаписью
Не работает в веб-клиенте Используется серверный код в клиентском обработчике Перенесите логику в &НаКлиенте процедуру
Маска игнорирует первые символы Неправильный шаблон регулярного выражения Проверьте синтаксис RegExp, используйте ^ и $

Еще несколько неочевидных ошибок:

  • 🔹 Кодировка символов: Если маска содержит кириллицу, убедитесь, что файл конфигурации сохранен в UTF-8.
  • 🔹 Локализация: В некоторых региональных версиях разделители дат и чисел могут отличаться (например, , вместо .).
  • 🔹 Мобильные устройства: На сенсорных экранах маски могут работать медленнее. Тестируйте на разных платформах.

Пример ошибки с кодировкой:

// Не работает, если файл сохранен в ANSI

Маска = "Серия: AA № 000000";

Исправленный вариант:

// Используем Unicode-символы

Маска = "Серия: " + Символ("Буква") + Символ("Буква") + " № " + Символ("Цифра") + "{6}";

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

Всегда тестируйте маски на реальных данных! Даже корректное регулярное выражение может не сработать из-за особенностей ввода (например, пользователь копирует данные из буфера обмена).

Примеры готовых масок для типовых задач

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

1. Телефонный номер (Россия, международный):

Процедура ТелефонПриИзменении(Элемент)

Значение = Элемент.Значение;

ТолькоЦифры = СтрЗаменить(Значение, Новый Строка("+() -"), "");

Если ПустаяСтрока(ТолькоЦифры) Тогда

Возврат;

КонецЕсли;

// Определяем формат по первым символам

Если Лев(ТолькоЦифры, 1) = "8" Тогда

ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);

ИначеЕсли Лев(ТолькоЦифры, 2) = "79" Тогда

ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);

КонецЕсли;

// Форматируем

Если СтрДлина(ТолькоЦифры) = 11 Тогда

Элемент.Значение = "+7 (" + Сред(ТолькоЦифры, 2, 3) + ") " +

Сред(ТолькоЦифры, 5, 3) + "-" +

Сред(ТолькоЦифры, 8, 2) + "-" +

Сред(ТолькоЦифры, 10, 2);

ИначеЕсли СтрДлина(ТолькоЦифры) > 11 Тогда

Элемент.Значение = "+" + ТолькоЦифры;

Иначе

Элемент.Значение = "+7 (" + ТолькоЦифры;

КонецЕсли;

КонецПроцедуры

2. ИНН (с проверкой контрольной суммы):

Функция ПроверитьИНН(ЗначениеИНН)

Если СтрДлина(ЗначениеИНН) = 10 Тогда

Коэффициенты = Новый Массив(10);

Коэффициенты[0] = 2; Коэффициенты[1] = 4; Коэффициенты[2] = 10;

Коэффициенты[3] = 3; Коэффициенты[4] = 5; Коэффициенты[5] = 9;

Коэффициенты[6] = 4; Коэффициенты[7] = 6; Коэффициенты[8] = 8;

Коэффициенты[9] = 0;

Сумма = 0;

Для Индекс = 0 По 9 Цикл

Сумма = Сумма + Сред(ЗначениеИНН, Индекс+1, 1) * Коэффициенты[Индекс];

КонецЦикла;

Если Сумма % 11 <> 0 Тогда

Возврат Ложь;

КонецЕсли;

ИначеЕсли СтрДлина(ЗначениеИНН) = 12 Тогда

Коэффициенты1 = Новый Массив(12);

Коэффициенты1[0] = 7; Коэффициенты1[1] = 2; Коэффициенты1[2] = 4;

Коэффициенты1[3] = 10; Коэффициенты1[4] = 3; Коэффициенты1[5] = 5;

Коэффициенты1[6] = 9; Коэффициенты1[7] = 4; Коэффициенты1[8] = 6;

Коэффициенты1[9] = 8; Коэффициенты1[10] = 0; Коэффициенты1[11] = 0;

Сумма1 = 0;

Для Индекс = 0 По 11 Цикл

Сумма1 = Сумма1 + Сред(ЗначениеИНН, Индекс+1, 1) * Коэффициенты1[Индекс];

КонецЦикла;

КонтрольноеЧисло1 = Сумма1 % 11;

Если КонтрольноеЧисло1 > 9 Тогда

КонтрольноеЧисло1 = КонтрольноеЧисло1 % 10;

КонецЕсли;

Если КонтрольноеЧисло1 <> Сред(ЗначениеИНН, 11, 1) Тогда

Возврат Ложь;

КонецЕсли;

Коэффициенты2 = Новый Массив(12);

Коэффициенты2[0] = 3; Коэффициенты2[1] = 7; Коэффициенты2[2] = 2;

Коэффициенты2[3] = 4; Коэффициенты2[4] = 10; Коэффициенты2[5] = 3;

Коэффициенты2[6] = 5; Коэффициенты2[7] = 9; Коэффициенты2[8] = 4;

Коэффициенты2[9] = 6; Коэффициенты2[10] = 8; Коэффициенты2[11] = 0;

Сумма2 = 0;

Для Индекс = 0 По 11 Цикл

Сумма2 = Сумма2 + Сред(ЗначениеИНН, Индекс+1, 1) * Коэффициенты2[Индекс];

КонецЦикла;

КонтрольноеЧисло2 = Сумма2 % 11;

Если КонтрольноеЧисло2 > 9 Тогда

КонтрольноеЧисло2 = КонтрольноеЧисло2 % 10;

КонецЕсли;

Если КонтрольноеЧисло2 <> Сред(ЗначениеИНН, 12, 1) Тогда

Возврат Ложь;

КонецЕсли;

Иначе

Возврат Ложь;

КонецЕсли;

Возврат Истина;

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

3. СНИЛС (XXX-XXX-XXX XX):

Процедура СНИЛСПриИзменении(Элемент)

Значение = Элемент.Значение;

ТолькоЦифры = СтрЗаменить(Значение, Новый Строка(" -"), "");

Если СтрДлина(ТолькоЦифры) = 11 Тогда

Элемент.Значение = Сред(ТолькоЦифры, 1, 3) + "-" +

Сред(ТолькоЦифры, 4, 3) + "-" +

Сред(ТолькоЦифры, 7, 3) + " " +

Сред(ТолькоЦифры, 10, 2);

КонецЕсли;

КонецПроцедуры

4. Серийный номер оборудования (2 буквы + 6 цифр):

Процедура СерийныйНомерПриИзменении(Элемент)

Значение = Элемент.Значение;

Если НЕ РегВыражение("^[A-Za-z]{2}\d{6}$", Значение) Тогда

Сообщить("Некорректный серийный номер! Формат: AA123456");

Элемент.Значение = "";

КонецЕсли;

КонецПроцедуры

5. Дата в формате ДД.ММ.ГГГГ с проверкой корректности:

Процедура ДатаПриИзменении(Элемент)

Попытка

ДатаЗначение = Дата(Элемент.Значение);

Если ДатаЗначение = '00010101' Тогда

Сообщить("Некорректная дата!");

Элемент.Значение