Устранение проблемы при работе с полем, которое ограничено маской ввода

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

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

 

Например:

есть поле для ввода номера кредитной карточки с маской 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);
КонецФункции 

3 Comments

  1. www2000

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

    Перейти к публикации

    Reply
  2. zarius

    А не проще в функциях ЭтоЦифра, ЭтоРусскаяБуква, ЭтоБуква воспользоваться кодом символа? Вроде как побыстрее должно быть…

    Reply
  3. www2000

    Так красивее)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *