Маска поля ввода в 1С 8.3: от свойства в конфигураторе до проверки значения

· 9 мин

Содержание

Маску ввода в 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
!любой символ с переводом в верхний регистр
\экранирует следующий символ: он выводится как разделитель

Несколько правил, на которых спотыкаются чаще всего:

  1. Служебные символы чувствительны к раскладке и регистру. X и N — латинские заглавные. Кириллическая «Х» в маске — это просто буква-разделитель.
  2. Знаки ? и * в 1С не означают «любой символ», как в Access или Excel. В маске они выведутся как обычные разделители.
  3. Если в разделителе нужна сама девятка или буква N, её экранируют: маска \N 999 даст неизменяемую «N» и три цифры после неё.
  4. Пробел в маске — тоже разделитель. Шаблон 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. Откройте форму и выделите поле

  1. В дереве конфигурации раскройте объект, например справочник Контрагенты, ветку Формы.
  2. Двойным щелчком откройте нужную форму.
  3. В дереве элементов слева вверху найдите поле. Ищите по имени, оно обычно совпадает с именем реквизита.
  4. Нажмите Alt+Enter или выберите Свойства в контекстном меню — откроется палитра свойств.

Шаг 3. Впишите маску

Найдите в палитре свойство Маска. Быстрее всего переключить палитру на сортировку по алфавиту: свойства на «М» окажутся рядом. Впишите шаблон без кавычек: +7 (999) 999-99-99.

Шаг 4. Проверьте в режиме предприятия

Запустите отладку (F5), откройте форму и попробуйте ввести букву в поле телефона. Курсор не должен её принять. Затем введите номер, запишите элемент и откройте его снова: значение должно сохраниться полностью.

Маску можно задать и в свойствах самого реквизита объекта метаданных. Тогда новые формы, где поле создаётся по этому реквизиту, получат её автоматически, а свойство элемента формы позволяет переопределить шаблон для конкретной формы.

Шаг 5. Если форма типовая — используйте расширение

Править форму типовой конфигурации напрямую не стоит: при обновлении изменение придётся переносить вручную. Правильный путь — расширение конфигурации :

  1. Конфигурация → Расширения конфигурации, создайте новое расширение.
  2. В дереве расширения заимствуйте нужную форму объекта.
  3. В модуле заимствованной формы создайте обработчик ПриСозданииНаСервере с вызовом после типового.
  4. В обработчике присвойте маску элементу.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура РасширениеПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Элементы.Телефон.Маска = "+7 (999) 999-99-99";
КонецПроцедуры

Имя элемента Телефон здесь условное. Точное имя посмотрите в дереве элементов заимствованной формы.

Маска из кода: когда шаблон зависит от данных

Свойство Маска доступно для записи из модуля формы. Это нужно, когда шаблон меняется по ходу работы. Классический пример — ИНН: у организации 10 цифр, у ИП и физлица 12.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УстановитьМаскуИНН();
КонецПроцедуры

&НаКлиенте
Процедура ВидЛицаПриИзменении(Элемент)
	УстановитьМаскуИНН();
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция МаскаИНН(ЭтоЮрЛицо)
	Возврат ?(ЭтоЮрЛицо, "9999999999", "999999999999");
КонецФункции

&НаКлиентеНаСервере
Процедура УстановитьМаскуИНН()
	Элементы.ИНН.Маска = МаскаИНН(Объект.ЭтоЮрЛицо);
КонецПроцедуры

Реквизит ЭтоЮрЛицо и элемент ВидЛица — для примера, у вас имена будут свои. Процедура с директивой &НаКлиентеНаСервере работает и при открытии формы на сервере, и при переключении на клиенте.

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

Тот же приём работает в обычных формах: у элемента «Поле ввода» есть свойство Маска, его тоже можно менять из модуля формы.

Где маска работает, а где нет

Маска есть не у всех элементов формы. Таблица поможет понять, куда её ставить.

ЭлементМаскаКомментарий
Поле ввода реквизита-строкиработаетосновной случай
Колонка таблицы формы (поле ввода)работаетмаска задаётся у поля-колонки, действует в каждой строке
Поле ввода с типом «Число»не используетсявместо неё ФорматРедактирования, например ЧДЦ=2
Поле ввода с типом «Дата»не используетсявместо неё ФорматРедактирования с ДФ=
Поле надписи, поле флажканетвводить в них нечего
Поле с составным типомненадёжношаблон рассчитан на строку, лучше разделить реквизит

Для колонки табличной части порядок тот же: выделите в дереве элементов поле внутри таблицы и задайте ему Маска. Шаблон действует на каждую строку при редактировании ячейки.

Для многострочных полей маска неудобна: она задаёт фиксированное число позиций и ломает перенос строк. Длинные тексты проверяйте кодом при записи.

Готовые шаблоны для реквизитов

Шаблоны для типовых российских реквизитов. Длину строки реквизита берите не меньше длины маски.

Что вводимМаскаДлина строки
ИНН организации999999999910
ИНН ИП, физлица99999999999912
КПП9999UU9999
ОГРН999999999999913
ОГРНИП99999999999999915
СНИЛС999-999-999 9914
БИК9999999999
Расчётный и корреспондентский счёт9999999999999999999920
Мобильный телефон+7 (999) 999-99-9918
Серия и номер паспорта РФ99 99 99999912
Почтовый индекс9999996
Время «чч:мм» в строке99:995
Цвет в HEX\#hhhhhh7

Пояснения к спорным строкам:

  • 📌 КПП. С 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 для шести знаков. Если нужен любой символ в верхнем регистре, используйте !.
Можно ли хранить номер без скобок и дефисов, а показывать с ними?
Маска так не умеет: что видно в поле, то и сохраняется. Для хранения «чистых» цифр заведите служебный реквизит и заполняйте его в ПередЗаписью из значения с маской.
Работает ли маска в веб-клиенте и тонком клиенте?
Да, свойство относится к элементу управляемой формы и действует во всех клиентах, которые показывают эту форму.
Нужно ли обновлять конфигурацию базы после изменения маски?
Если поменяли только свойство элемента формы, реструктуризации не будет: изменение применится после обновления конфигурации без перестройки таблиц. Если вместе с маской увеличили длину реквизита — таблицы перестроятся.