При разработке интерфейсов на платформе «1С:Предприятие 8» часто возникает необходимость строго контролировать формат вводимых пользователем данных. Для этого используется механизм масок. Однако при попытке реализовать сложные сценарии — например, использование нескольких вариантов масок в одном поле или ограничение ввода только латинскими буквами — разработчики сталкиваются с неочевидным поведением системы. В этой статье мы подробно разберем, как работают маски, почему они могут конфликтовать и как реализовать проверку данных программно.
Рассмотрим ситуацию, когда необходимо позволить пользователю вводить данные в двух форматах: коротком (например, 12.34/56) и длинном (12.34.56/78). На первый взгляд, решение кажется простым — указать обе маски через точку с запятой в свойстве Маска: @@.@@/99; @@.@@.@@/99. Однако на практике платформа часто выбирает только одну из масок, игнорируя вторую, или добавляет лишние разделители.
Проанализируем причину такого поведения. Платформа 1С сопоставляет вводимый текст с масками слева направо. Если первая маска по своей структуре является «подмножеством» второй (то есть начало второй маски полностью совпадает по типам символов с первой), алгоритм выбора может давать сбои. В результате, даже если пользователь ввел данные для короткой маски, система пытается «натянуть» их на длинную, добавляя пустые разделители (например, 12.34. /78).
Решение: В таких случаях наиболее надежным подходом будет использование одной, наиболее полной маски, с последующей программной обработкой результата. Мы можем перехватить введенное значение и «подчистить» его, удалив пустые блоки разделителей.
Разберем пример обработки в событии ПриИзменении:
&НаКлиенте
Процедура ПолеВводаПриИзменении(Элемент)
// Допустим, маска установлена как "@@.@@.@@/99"
// Если пользователь ввел данные частично, в строке могут остаться точки перед слэшем
ВведенноеЗначение = Элемент.ТекстРедактирования;
// Удаляем последовательность символов "./", если она образовалась при неполном вводе
ОбработанноеЗначение = СтрЗаменить(ВведенноеЗначение, "./", "/");
// Присваиваем очищенное значение обратно
Объект.НужноеПоле = ОбработанноеЗначение;
КонецПроцедуры
Для эффективной настройки полей ввода нам необходимо четко понимать, за что отвечает каждый символ в строке маски. Посмотрим на основные спецификаторы, которые предоставляет платформа:
Важный нюанс: Если вам нужно использовать один из этих символов как обычный текст (разделитель), перед ним необходимо поставить обратный слэш \.
Часто возникает вопрос: как сделать так, чтобы в поле можно было вводить только латинские буквы? К сожалению, стандартные символы маски (такие как U, @ или N) не различают алфавиты. Они разрешают ввод любых букв, доступных в текущей раскладке клавиатуры.
Чтобы решить эту задачу, нам придется выйти за рамки простых масок и воспользоваться программной проверкой. Рассмотрим два эффективных способа.
Проанализируем ситуацию: если платформа версии 8.3.23 и выше, мы можем использовать встроенный объект РегулярныеВыражения. Если версия старше, можно воспользоваться COM-объектом VBScript.RegExp.
Пример функции для проверки строки на наличие только латинских букв:
&НаКлиенте
Функция ТолькоЛатиница(СтрокаПроверки)
// Шаблон [A-Z]+ означает, что строка должна состоять только из заглавных латинских букв
// Для проверки и нижнего регистра используйте [A-Za-z]+
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
РегВыр = Новый RegExp; // Использование COM-объекта
РегВыр.IgnoreCase = Истина;
РегВыр.Global = Истина;
РегВыр.Pattern = "^[A-Z]+$";
Возврат РегВыр.Test(СтрокаПроверки);
#Иначе
// Для новых платформ (8.3.23+)
Результат = РегулярныеВыражения.Матч(СтрокаПроверки, "^[A-Za-z]+$");
Возврат Результат.Количество() > 0;
#КонецЕсли
КонецФункции
Выясним, как реализовать «очистку» поля от недопустимых символов (например, кириллицы), если регулярные выражения кажутся слишком сложными. Мы можем просто перебрать все символы строки и оставить только те, коды которых соответствуют латинице.
&НаКлиенте
Процедура ОчиститьОтКириллицы(СтрокаТекста)
ДопустимыеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
Результат = "";
Для Индекс = 1 По СтрДлина(СтрокаТекста) Цикл
Символ = Сред(СтрокаТекста, Индекс, 1);
Если СтрНайти(ДопустимыеСимволы, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецПроцедуры
Иногда задача стоит проще: не ограничивать ввод, а автоматически приводить его к нужному регистру после того, как пользователь закончил печатать. Для этого в языке 1С предусмотрены встроенные функции:
ВРег(Текст) — преобразует все символы строки в ВЕРХНИЙ регистр.НРег(Текст) — преобразует все символы строки в нижний регистр.ТРег(Текст) — преобразует текст в Титульный регистр (первая буква каждого слова заглавная).Посмотрим на альтернативу маскам — свойство Формат. Важно понимать разницу:
Маска ввода — это жесткий каркас. Она управляет процессом ввода «посимвольно», не давая пользователю поставить курсор в неположенное место. Это полезно для ИНН, телефонов или жестких кодов.
Формат — это правило отображения. Он срабатывает, когда поле теряет фокус. Для числовых данных (сумм, количеств) или дат лучше использовать именно формат, так как он не мешает пользователю быстро набирать цифры, но «красиво» оформляет их (разделяет триады, добавляет нули) после завершения ввода.
Рассмотрим важный нюанс: при работе через браузер (Веб-клиент) маски могут вести себя нестабильно из-за различий в движках рендеринга и обработки событий клавиатуры. В некоторых случаях курсор может «перепрыгивать» через разделители или некорректно обрабатывать вставку через Ctrl+V. Если ваше приложение активно используется через веб-интерфейс, старайтесь минимизировать использование сложных масок, отдавая предпочтение программной валидации данных в событии ПередЗаписью или ПриИзменении.
Подводя итог, можно сказать, что маска — это отличный инструмент для простых визуальных шаблонов, но для сложной бизнес-логики и проверки состава символов (латиница/кириллица) всегда стоит подкреплять её программным кодом. Сочетание правильно настроенной маски и функций обработки строк позволит вам создать максимально удобный и надежный интерфейс для пользователя. Для интерактивной проверки и настройки свойств элементов формы в режиме 1С:Предприятие можно использовать редактор форм в пользовательском режиме.