gifts2017

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

Опубликовал www2000 www2000 (www2000) в раздел Программирование - Практика программирования

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

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

 

Например:

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

См. также

Подписаться Добавить вознаграждение

Комментарии

0. www2000 www2000 (www2000) 08.08.12 13:09
Для поля, у которого установлена маска ввода, перед программной инициализацией необходимо начальное значение преобразовать к значению в соответствии с маской, иначе буду потеряны символы в местах разделителях. В данной публикации приведена функция, которая универсально выполняет данное действие.


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

1. Alexey (zarius) 15.08.12 14:30
А не проще в функциях ЭтоЦифра, ЭтоРусскаяБуква, ЭтоБуква воспользоваться кодом символа? Вроде как побыстрее должно быть...
2. www2000 www2000 (www2000) 15.08.12 15:13
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа