Маска поля ввода в 1С 8.3: от свойства в конфигураторе до проверки значения
Содержание
Маску ввода в 1С 8.3 указывают в свойстве Маска у элемента формы «Поле ввода». Откройте форму в конфигураторе, выделите поле, в палитре свойств впишите шаблон, например +7 (999) 999-99-99. Кодом то же самое делается одной строкой: Элементы.Телефон.Маска = "+7 (999) 999-99-99";.
Типичная ситуация: менеджеры вносят телефоны контрагентов как попало — «8912…», «+7-912», «912 123 45 67». Потом рассылка не находит половину номеров, а поиск по базе не находит дубли. Маска заставляет вводить данные в одном виде с первого символа. Ниже — какие символы работают, как настроить поле, где маска не сработает и как это проверить.
Что маска умеет и чего не умеет
Маска — это шаблон, который платформа накладывает на поле при вводе. В каждую позицию шаблона можно ввести только символ своего класса: цифру, букву, любой знак. Разделители (скобки, дефисы, пробелы) подставляются сами, пользователь их не набирает.
Что даёт маска:
- ✅ пользователь физически не может ввести букву туда, где ждут цифру;
- ✅ разделители стоят на своих местах во всех записях;
- ✅ видна длина: пустые позиции подсказывают, сколько символов осталось;
- ✅ можно сразу переводить буквы в верхний регистр.
Чего маска не делает:
- ❌ не проверяет контрольную сумму ИНН, СНИЛС или номера счёта;
- ❌ не требует заполнить поле целиком — недобитый номер сохранится;
- ❌ не работает
как формат вывода для чисел и дат (для них есть свойства
ФорматиФорматРедактирования); - ❌ не защищает данные, пришедшие из обмена, загрузки или обработки: маска живёт только в форме.
Маска рассчитана на строковые реквизиты. Если у поля тип «Число» или «Дата», шаблон либо не подействует, либо будет мешать. Для таких полей настраивают формат редактирования, например ДФ=dd.MM.yyyy для даты.
Символы маски и как их читать
В маске 1С есть набор служебных символов. Всё, что не входит в этот набор, считается разделителем и выводится как есть.
| Символ | Что можно ввести в эту позицию |
|---|---|
9 | только цифру |
# | цифру, знак +, знак - или пробел |
N | любую букву или цифру |
U | букву или цифру, буква переводится в верхний регистр |
@ | букву или цифру в верхнем регистре либо пробел |
X | любой символ (латинская X) |
^ | любой символ, кроме символов-разделителей |
h | шестнадцатеричную цифру: 0–9, A–F |
! | любой символ с переводом в верхний регистр |
\ | экранирует следующий символ: он выводится как разделитель |
Несколько правил, на которых спотыкаются чаще всего:
- Служебные символы чувствительны к раскладке и регистру.
XиN— латинские заглавные. Кириллическая «Х» в маске — это просто буква-разделитель. - Знаки
?и*в 1С не означают «любой символ», как в Access или Excel. В маске они выведутся как обычные разделители. - Если в разделителе нужна сама девятка или буква N, её экранируют: маска
\N 999даст неизменяемую «N» и три цифры после неё. - Пробел в маске — тоже разделитель. Шаблон
99 99даст «12 34», а не «1234».
Маска считает позиции, а не смысл. Шаблон 99.99.9999 пропустит дату «45.19.0000». Для дат используйте тип «Дата», а не строку с маской.
Как указать маску в конфигураторе: пошагово
Порядок для управляемой формы на платформе 8.3 с интерфейсом «Такси».
Шаг 1. Проверьте тип и длину реквизита
Откройте реквизит в дереве метаданных или в списке реквизитов формы. Тип должен быть «Строка». Длина — не меньше длины маски вместе с разделителями.
Посчитаем на примере. Маска +7 (999) 999-99-99 содержит 18 символов: десять цифр и восемь разделителей. Если длина строки 10, в базу ляжет обрезанный номер «+7 (912) 1». Это самая частая причина «маска сломала данные».
Шаг 2. Откройте форму и выделите поле
- В дереве конфигурации раскройте объект, например справочник
Контрагенты, веткуФормы. - Двойным щелчком откройте нужную форму.
- В дереве элементов слева вверху найдите поле. Ищите по имени, оно обычно совпадает с именем реквизита.
- Нажмите
Alt+Enterили выберитеСвойствав контекстном меню — откроется палитра свойств.
Шаг 3. Впишите маску
Найдите в палитре свойство Маска. Быстрее всего переключить палитру на сортировку по алфавиту: свойства на «М» окажутся рядом. Впишите шаблон без кавычек: +7 (999) 999-99-99.
Шаг 4. Проверьте в режиме предприятия
Запустите отладку (F5), откройте форму и попробуйте ввести букву в поле телефона. Курсор не должен её принять. Затем введите номер, запишите элемент и откройте его снова: значение должно сохраниться полностью.
Маску можно задать и в свойствах самого реквизита объекта метаданных. Тогда новые формы, где поле создаётся по этому реквизиту, получат её автоматически, а свойство элемента формы позволяет переопределить шаблон для конкретной формы.
Шаг 5. Если форма типовая — используйте расширение
Править форму типовой конфигурации напрямую не стоит: при обновлении изменение придётся переносить вручную. Правильный путь — расширение конфигурации :
Конфигурация → Расширения конфигурации, создайте новое расширение.- В дереве расширения заимствуйте нужную форму объекта.
- В модуле заимствованной формы создайте обработчик
ПриСозданииНаСерверес вызовом после типового. - В обработчике присвойте маску элементу.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура РасширениеПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Телефон.Маска = "+7 (999) 999-99-99";
КонецПроцедуры
Имя элемента Телефон здесь условное. Точное имя посмотрите в дереве элементов заимствованной формы.
Маска из кода: когда шаблон зависит от данных
Свойство Маска доступно для записи из модуля формы. Это нужно, когда шаблон меняется по ходу работы. Классический пример — ИНН: у организации 10 цифр, у ИП и физлица 12.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьМаскуИНН();
КонецПроцедуры
&НаКлиенте
Процедура ВидЛицаПриИзменении(Элемент)
УстановитьМаскуИНН();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция МаскаИНН(ЭтоЮрЛицо)
Возврат ?(ЭтоЮрЛицо, "9999999999", "999999999999");
КонецФункции
&НаКлиентеНаСервере
Процедура УстановитьМаскуИНН()
Элементы.ИНН.Маска = МаскаИНН(Объект.ЭтоЮрЛицо);
КонецПроцедуры
Реквизит ЭтоЮрЛицо и элемент ВидЛица — для примера, у вас имена будут свои. Процедура с директивой &НаКлиентеНаСервере работает и при открытии формы на сервере, и при переключении на клиенте.
Если поменять маску, когда в поле уже есть значение другой длины, лишние символы пользователь увидит как хвост, а недостающие — как пустые позиции. Очищайте поле или предупреждайте пользователя при смене вида лица.
Тот же приём работает в обычных формах: у элемента «Поле ввода» есть свойство Маска, его тоже можно менять из модуля формы.
Где маска работает, а где нет
Маска есть не у всех элементов формы. Таблица поможет понять, куда её ставить.
| Элемент | Маска | Комментарий |
|---|---|---|
| Поле ввода реквизита-строки | работает | основной случай |
| Колонка таблицы формы (поле ввода) | работает | маска задаётся у поля-колонки, действует в каждой строке |
| Поле ввода с типом «Число» | не используется | вместо неё ФорматРедактирования, например ЧДЦ=2 |
| Поле ввода с типом «Дата» | не используется | вместо неё ФорматРедактирования с ДФ= |
| Поле надписи, поле флажка | нет | вводить в них нечего |
| Поле с составным типом | ненадёжно | шаблон рассчитан на строку, лучше разделить реквизит |
Для колонки табличной части порядок тот же: выделите в дереве элементов поле внутри таблицы и задайте ему Маска. Шаблон действует на каждую строку при редактировании ячейки.
Для многострочных полей маска неудобна: она задаёт фиксированное число позиций и ломает перенос строк. Длинные тексты проверяйте кодом при записи.
Готовые шаблоны для реквизитов
Шаблоны для типовых российских реквизитов. Длину строки реквизита берите не меньше длины маски.
| Что вводим | Маска | Длина строки |
|---|---|---|
| ИНН организации | 9999999999 | 10 |
| ИНН ИП, физлица | 999999999999 | 12 |
| КПП | 9999UU999 | 9 |
| ОГРН | 9999999999999 | 13 |
| ОГРНИП | 999999999999999 | 15 |
| СНИЛС | 999-999-999 99 | 14 |
| БИК | 999999999 | 9 |
| Расчётный и корреспондентский счёт | 99999999999999999999 | 20 |
| Мобильный телефон | +7 (999) 999-99-99 | 18 |
| Серия и номер паспорта РФ | 99 99 999999 | 12 |
| Почтовый индекс | 999999 | 6 |
| Время «чч:мм» в строке | 99:99 | 5 |
| Цвет в HEX | \#hhhhhh | 7 |
Пояснения к спорным строкам:
- 📌 КПП. С 2019 года пятый и шестой знаки КПП могут быть заглавными латинскими буквами (порядок формирования КПП утверждает ФНС). Поэтому на этих позициях стоит
U, а не9. Шаблон из одних девяток отсечёт такие КПП. - 📌 Цвет. Знак
#— служебный, поэтому для разделителя «решётка» его экранируют:\#hhhhhh. - 📌 Телефон. Маска с фиксированным «+7» не подходит для иностранных номеров. Если они бывают, лучше отдельное поле или проверка кодом без маски.
- 📌 Госномер автомобиля маской описывать неудобно: регион бывает из двух и трёх цифр. Одна маска на оба варианта даст пустой хвост у двузначных регионов.
Проверка значения перед записью
Маска не мешает записать недобитое значение. Если поле обязательно должно быть заполнено полностью, проверьте это в обработчике ОбработкаПроверкиЗаполнения модуля объекта или ПередЗаписью формы.
Функция ниже считает цифры в строке. Её удобно вызывать для любого поля с маской из девяток.
Функция КоличествоЦифр(Знач Строка) Экспорт
Счетчик = 0;
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти("0123456789", Символ) > 0 Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Возврат Счетчик;
КонецФункции
Пример использования в модуле объекта справочника:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЗначениеЗаполнено(Телефон) И КоличествоЦифр(Телефон) <> 11 Тогда
ОбщегоНазначения.СообщитьПользователю(
"Телефон заполнен не полностью", ЭтотОбъект, "Телефон", , Отказ);
КонецЕсли;
КонецПроцедуры
Почему 11, а не 10: в маске +7 (999) 999-99-99 семёрка — разделитель, но в строке она хранится как цифра. Десять цифр номера плюс семёрка дают 11.
ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на Библиотеке стандартных подсистем. В самописной базе без БСП используйте объект СообщениеПользователю и установите Отказ = Истина.
Контрольные суммы ИНН и СНИЛС проверяйте отдельно, уже после проверки длины. В конфигурациях на БСП для этого есть готовые функции в модулях регламентированных данных — найдите их глобальным поиском по слову «ИНН» в общих модулях, прежде чем писать свою.
Почему маска не работает: разбор типовых случаев
Пара технических моментов, которые не видны в форме:
- 🔧 Разделители сохраняются в базе. В реквизите лежит строка «+7 (912) 345-67-89», а не «79123456789». Учитывайте это в запросах: условие
Телефон = "79123456789"такую запись не найдёт. - 🔧 Обмен и загрузка обходят маску. Данные из EnterpriseData, загрузки из Excel или COM-соединения пишутся напрямую в объект. Если формат важен, приводите значение к виду маски в
ПередЗаписьюмодуля объекта. - 🔧 Изменение длины реквизита требует обновления конфигурации базы данных. Делайте это вне рабочего времени: для реструктуризации нужен монопольный доступ, пользователей придётся попросить выйти.
Частые вопросы
Можно ли в 1С задать маску для числового поля?
Как сделать, чтобы в поле вводились только заглавные буквы?
U на каждую позицию, например UUUUUU для шести знаков. Если нужен любой символ в верхнем регистре, используйте !.Можно ли хранить номер без скобок и дефисов, а показывать с ними?
ПередЗаписью из значения с маской.