Устранение проблемы при работе с полем, которое ограничено маской ввода
Для поля, у которого установлена маска ввода, перед программной инициализацией необходимо начальное значение преобразовать к значению в соответствии с маской, иначе буду потеряны символы в местах разделителях. В данной публикации приведена функция, которая универсально выполняет данное действие.
- Описание
- Подробнее
Описание
Для поля, у которого установлена маска ввода, перед программной инициализацией необходимо начальное значение преобразовать к значению в соответствии с маской, иначе буду потеряны символы на месте разделителей. В данной публикации приведена функция, которая универсально выполняет данное действие.
Например:
есть поле для ввода номера кредитной карточки с маской 9999-9999-9999-9999
Если у нас есть номер карты
1234123412341234 и мы его запишем в данное поле,
то в результате 1С покажет и самое ужасное, сохранит
1234-2341-3412-34, тем самым заменив некоторые символы нашего номера карты на разделители.
Для того, чтобы этого избежать, перед присваиванием необходимо начальный номер карты преобразовать к номеру, который сответствует шаблону, что и делает предстваленная функция.
Функция ПрименитьМаску(Значение, Маска) // Назначение: Для начальной строки применить маску ввода,
//данныя функция необходима в случае программного заполнения поля, которое вводится по маске// так как 1С хранит информация вместе с значениями разделителей, которые присутвуют в маске// при программном заполнении поля с заданной маской при начале редактирования данного поля //информация в ячейках, которые соответвуют разделителям теряется // Автор www2000 // Тестирована: На маске 9999-9999-9999-9999Результат = ""; ПерЦиклаЗначения = 1; Для ПерЦикла = 1 По СтрДлина(Маска) Цикл
ТекСимволМаски = Сред(Маска, ПерЦикла, 1); Если ПерЦиклаЗначения > СтрДлина(Значение) Тогда
ТекСимволЗначения = " "; Иначе
ТекСимволЗначения = Сред(Значение, ПерЦиклаЗначения, 1); КонецЕсли; Если (ТекСимволМаски = "!") ИЛИ (ТекСимволМаски = "@") Тогда
ТекСимволЗначения = Врег(ТекСимволЗначения); ИначеЕсли ТекСимволМаски = "9" Тогда Если ЭтоЦифра(ТекСимволЗначения) = 0 Тогда
Если ПерЦиклаЗначения <= СтрДлина(Значение) Тогда
ПерЦикла = ПерЦикла - 1; КонецЕсли; КонецЕсли; ИначеЕсли ТекСимволМаски = "#" Тогда Если (ЭтоЦифра(ТекСимволЗначения) = 0) И (ТекСимволЗначения <> "-") И (ТекСимволЗначения <> "+")
И (ТекСимволЗначения <> " ") Тогда
Если ПерЦиклаЗначения <= СтрДлина(Значение) Тогда
ПерЦикла = ПерЦикла - 1; ТекСимволЗначения = ""; КонецЕсли; КонецЕсли; ИначеЕсли ТекСимволМаски = "N" Тогда Если (ЭтоЦифра(ТекСимволЗначения) = 0) И (ЭтоБуква(ТекСимволЗначения) = 0) Тогда
Если ПерЦиклаЗначения <= СтрДлина(Значение) Тогда
ПерЦикла = ПерЦикла - 1; ТекСимволЗначения = ""; КонецЕсли; КонецЕсли; ИначеЕсли ТекСимволМаски = "X" Тогда Иначе
ТекСимволЗначения = ТекСимволМаски; ПерЦиклаЗначения = ПерЦиклаЗначения - 1; КонецЕсли; Результат = Результат + ТекСимволЗначения; ПерЦиклаЗначения = ПерЦиклаЗначения + 1; КонецЦикла; Возврат Результат; КонецФункции
Применение
МаскаНомераКарточки = Форма.НомерКарточки.Маска(); НомерКарточки = ПрименитьМаску(НоыйНомерКарточки,МаскаНомераКарточки);
Дополнительные функции
Функция ЭтоЦифра(С) Экспорт
//Назначение: Проверяет, является ли символ цифрой //ДатаСоздания: 20080101 //Автор: Fixin //Тестирована: Да
Возврат Мин(Найти("0123456789", С), 1);
КонецФункции
Функция ЭтоРусскаяБуква(С) Экспорт
//Назначение: Проверяет, является ли символ русской буквой //ДатаСоздания: 20080101 //Автор: Fixin //Тестирована:Возврат Мин(Найти("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ", ВРег(С)), 1);
КонецФункции Функция ЭтоЛатинскаяБуква(С)Экспорт
//Назначение: Проверяет, является ли символ латинской буквой //ДатаСоздания: 20080101 //Автор: Fixin //Тестирована:Возврат Мин(Найти("ABCDEFGHIJKLMNOPQRSTUVWXYZ", ВРег(С)),1);
КонецФункции
Функция ЭтоБуква(С)Экспорт
//Назначение: Проверяет, является ли символ буквой //ДатаСоздания: 20080101 //Автор: Fixin //Тестирована: ДаВозврат Мин(ЭтоРусскаяБуква(С)+ ЭтоЛатинскаяБуква(С),1);
КонецФункции

