Маски ввода в 1С:Предприятие 8.3 — это мощный инструмент для контроля формата данных, который экономит время пользователей и снижает количество ошибок. Без них поля для телефонов, ИНН или серийных номеров превращаются в источник головной боли: пользователи вводят данные в произвольном формате, а программисту приходится писать сложные проверки. Но как правильно реализовать маску, чтобы она работала стабильно и не мешала пользователям?
В этой статье вы найдете пошаговые инструкции по созданию масок от простых шаблонов до сложных регулярных выражений, а также типичные ошибки, которые допускают разработчики. Мы разберем не только техническую сторону, но и пользовательский опыт — как сделать так, чтобы маска помогала, а не раздражала.
Если вы только начинаете работать с 1С, настройка масок может показаться сложной. Однако после прочтения этой статьи вы сможете создавать гибкие решения для любых форматов — от телефонных номеров до банковских реквизитов. А опытные разработчики найдут здесь неочевидные приемы оптимизации и обработки исключений, которые не описаны в стандартной документации.
Что такое маска ввода и зачем она нужна в 1С
Маска ввода — это шаблон, который определяет, какие символы и в каком порядке пользователь может вводить в поле. В 1С:Предприятие маски применяются для:
- 📞 Телефонных номеров (например,
+7 (XXX) XXX-XX-XX) - 🆔 Идентификационных номеров (ИНН, СНИЛС, паспортные данные)
- 💳 Банковских реквизитов (номера счетов, БИК)
- 📅 Дат и времени в нестандартных форматах
- 🔢 Серийных номеров оборудования с фиксированной структурой
Основные преимущества использования масок:
- ✅ Снижение ошибок ввода — пользователь физически не может ввести некорректные данные.
- ✅ Упрощение валидации — не нужно писать сложные проверки на стороне сервера.
- ✅ Улучшение пользовательского опыта — подсказки в виде шаблона упрощают заполнение.
- ✅ Стандартизация данных — все номера телефонов или ИНН хранятся в едином формате.
Однако маски имеют и ограничения. Например, они не заменяют полноценную валидацию — пользователь может ввести корректный по формату, но несуществующий ИНН. Также маски могут усложнить ввод, если шаблон слишком строгий или неудобный.
⚠️ Внимание: Маски ввода в 1С работают только на стороне клиента. Это значит, что злоумышленник может обойти их, отправляя данные напрямую через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— необязательная буква\— экранирование специальных символов;— разделитель для разных форматов
⚠️ Внимание: Стандартная маска в 1С не поддерживает динамическое изменение формата. Если вам нужно, чтобы шаблон менялся в зависимости от первых введенных символов (например,+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. - 🔹 Локализация: В некоторых региональных версиях 1С разделители дат и чисел могут отличаться (например,
,вместо.). - 🔹 Мобильные устройства: На сенсорных экранах маски могут работать медленнее. Тестируйте на разных платформах.
Пример ошибки с кодировкой:
// Не работает, если файл сохранен в 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' Тогда
Сообщить("Некорректная дата!");
Элемент.Значение