Для поля, у которого установлена маска ввода, перед программной инициализацией необходимо начальное значение преобразовать к значению в соответствии с маской, иначе буду потеряны символы на месте разделителей. В данной публикации приведена функция, которая универсально выполняет данное действие.
Например:
есть поле для ввода номера кредитной карточки с маской 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);
КонецФункции
Для поля, у которого установлена маска ввода, перед программной инициализацией необходимо начальное значение преобразовать к значению в соответствии с маской, иначе буду потеряны символы в местах разделителях. В данной публикации приведена функция, которая универсально выполняет данное действие.
Перейти к публикации
А не проще в функциях ЭтоЦифра, ЭтоРусскаяБуква, ЭтоБуква воспользоваться кодом символа? Вроде как побыстрее должно быть…
Так красивее)