Функция - Формат государственного номера автомобиля

23.12.19

Разработка - Универсальные функции

Возникла необходимость в приведении к единому формату хранящихся, и вводимых вновь, автомобильных Регистрационных знаков - Гос.номер.

Возникла необходимость в приведении к единому формату хранящихся, и вводимых вновь, автомобильных Регистрационных знаков - Гос.номер.

Понятно, что нужно было оттолкнуться от какого-то стандарта. По-google-в по интересующему вопросу, стало очевидным, что Гос.номера можно систематизировать по буквенно-цифровым последовательностям, из которых состоят номера. К тому же, эти буквенно-цифровые последовательности,  оказались относительно уникальными. В редких случаях были замечены совпадения, но это оказалось вполне допустимым:) 

Было принято решение прибегнуть к условному кодированию Типа Гос.номера и его Формата, т.е. местоположения и типа разделителей. 

 

1. Код Типа Гос.номера, или его буквенно-цифровой последовательности:

Описывает последовательность парами цифр,
 Первая цифра - Количество символов в последовательности
 Вторая цифра - Тип символа: 0 - Буква; 1 - Цифра;

Пример: Гос.номер "С 065 МК 78" - имеет последовательность: одна(1)буква(0), три(3)цифры(1), две(2)буквы(0), две(2)цифры(1).

В итоге получаем - 10312021 - Код типа номера для "С 065 МК 78"

 

2. КодФормата

Описывает непрерывные буквенно-цифровые блоки, отделённые друг от друга условным разделителем.
Каждый такой блок описывается одной цифрой, и содержит информацию о количество символов в блоке.
2.1. Разделителем по-умолчанию является пробел.
2.2. Можно задать любой разделитель, в любом месте.
            
            Пример 1:
            Формат вывода для Гос.номера "С 065 МК 78" можно описать так:
            Один(1)символ [пробел] Три(3)символа [пробел] Два(2)символа [пробел] Два(2)символа
            т.е. - "1322"
                        
            Пример 2:
            На входе имеем последовательность - "1234АВ 7" - Белорусский номер общего назначения.
            Соответственно её Код - "412011"
            Нам нужен "КодФормата" с раделителем "тире", отделяеющим последнюю цифру:
            Четыре(4)символа [пробел] Два(2)символа Тире[-] Один(1)символ
            т.е. - "42-1" - На выходе получим: "1234 АВ-7":
            
            Пример 3:
            Необходимо представить Гос.номер "А 733 АН 152" слитно, отделив пробелом только цифры региона - "А733АН 152"
            "КодФормата" будет таким - "63"             

 

Примечания:

            Примечание 1:
            Сумма чисел в "КодФормата" соответствует количеству символов в Гос.Номере
            
            Примечание 2:
            Во входящей строке игнорируются любые символы кроме букв (принятых для использования в Гос.номерах) и цифр.
                
            Примечание 3.
            Если функция не может отформатировать строку, она вернет не форматированную строку так, как она была передана в функцию.
            
            Примечание 4.
            Все буквенные символы в возвращаемой строке по-умолчанию приводятся к Верхнему регистру.
            В качестве необязательного параметра можно передать Булево - Ложь
            В этом случае буквенные символы будут приведены к Нижнему регистру.
            
            Примечание 5:            
            Ниже приведена таблица, которая положена в основу работы этой функции.
            В таблице перечислены те типы Гос.номеров, которые вошли в круг внимания.
            Соответственно она может быть легко дополнена.
            
            Описание Колонок:
            
            "Принадлежность" - Общие сведения, Страна, Струкрура ets.
            "Описание" - Дополнительные сведения о формате номера
            "Стандарт" - Формат Гос.Номера, как он описан в нормативных документах
            "Код" - Код буквенно-цифровой последовательности Гос.Номера
            "ФорматВид" - Представление формата выходной строки (шаблон)
            "КодФормата"- Код, описывающий формат Строки
            
            Для получения дополнительной информации о "распознанном" Гос.номере, Таблицу можно обернуть в Справочник или иное, пополняемое/редактируемое хранилище. 
            В данной реализации дело обошлось "Соответствием".
 

Принадлежность Описание Стандарт Код ФорматВид КодФормата
Беларусь Общие 1234 АВ-7 412011 1234 АВ-7 42-1
Дипломатические T — для транспортных средств сотрудников дипломатического представительства без дипломатического статуса
D — для транспортных средств сотрудников дипломатического представительства имеющих дипломатический статус.
002 Т003 78 311051 002 Т003 78 342
Дипломатические посла или других глав дипломатического представительства 002 CD1 78 312031 002 CD1 78 332
Италия Общие CZ 898 NF 203120 CZ 898 NF 232
Казахстан Общие R 123 KMN 103130 R 123 KMN 133
Россия МВД России А 1234 78 1061 А1234 78 52
Россия такси и общественный транспорт АО 365 78 2051 АО365 78 52
Россия прицепы ОА 1234 78 2061 ОА1234 78 62
Россия военные 0245 ОК 43 412021 0245 ОК 43 422
Россия Общие С 065 МК 78 10312021 С065МК 78 62
Россия Общие А 733 АН 147 10312031 А733АН 147 63
Россия МВД России прицепы 123 А 39 311021 123 А 39 312
Транзитные Транзитный транспорт СМ 655 К 78 20311021 СМ 655 К 78 2312
Узбекистан Общие 00 А123NN UZ 21103140 00 А123NN UZ 262
Украина Общие АК 1234 АВ 204120 АК 1234 АВ 242
Экпортные Экспортируемый транспорт Т АО 002 78 3051 Т АО 002 78 1232

 

// Функция - Формат гос номера автомобиля
//
// Параметры:    
//  Параметр	 - Строка, предположительно содержит Гос.номер автомобиля 
//  ВерхРегистр	 - Булево (необязательный) 
//       Истина - в выходной строке Буквы в верхнем регистри 
//       Ложь   - в выходной строке Буквы в нижнем регистре
// 
// Возвращаемое значение:
//   - Строка - Отформатированный Гос.Номер автомобиля.			
//
// Programmer:	Andrey Arsentev, march 2019
Функция ФорматГосНомераАвтомобиля(Параметр,ВерхРегистр = Истина) Экспорт	
	
	Если НЕ ЗначениеЗаполнено(Параметр) Тогда
		Возврат Параметр;
	Иначе
		Результат = ВРег(СокрЛП(Параметр));
	КонецЕсли; 
	
	// 0. Инициализируем Соответствие Форматов
	ФорматНомера = Новый Соответствие;
	ФорматНомера.Вставить("1061","52");
	ФорматНомера.Вставить("2051","52");
	ФорматНомера.Вставить("2061","62");
	ФорматНомера.Вставить("3051","1232");
	ФорматНомера.Вставить("103130","133");
	ФорматНомера.Вставить("203120","232");
	ФорматНомера.Вставить("204120","242");
	ФорматНомера.Вставить("311021","312");
	ФорматНомера.Вставить("311051","342");
	ФорматНомера.Вставить("312031","332");
	ФорматНомера.Вставить("412011","42-1");
	ФорматНомера.Вставить("412021","422");
	ФорматНомера.Вставить("10312021","62");
	ФорматНомера.Вставить("10312031","63");
	ФорматНомера.Вставить("20311021","2312");
	ФорматНомера.Вставить("21103140","262");
		
	Буфер 	   = "";
	Буквы      = 0;
	Цифры      = 0;
	КодНомера  = "";
	
	// 1. Получаем из Строки Код буквенно-цифровой последовательности
	Для Инд = 1 По СтрДлина(Результат) Цикл

		Симв = Сред(Результат, Инд, 1);
				
		Если Найти("0123456789", Симв) > 0 Тогда
			
			Буфер = Буфер + Симв; 	
			
			Если Буквы > 0 И Цифры = 0 Тогда
				КодНомера = КодНомера + Строка(Буквы)+"0";
				Буквы = 0;
			КонецЕсли; 
			
			Цифры = Цифры + 1;
			
		КонецЕсли;

		Если Найти("АВЕКМНОРСТУХABCDEHKMOPTUXYZ", Симв) > 0 Тогда
			
			Буфер = Буфер + Симв; 	
			
			Если Цифры > 0 И Буквы = 0 Тогда
				КодНомера = КодНомера + Строка(Цифры)+"1";
				Цифры = 0;
			КонецЕсли; 
			
			Буквы = Буквы + 1;
			
		КонецЕсли;
				
	КонецЦикла;

	Если Буквы > 0 Тогда
		КодНомера = КодНомера + Строка(Буквы)+"0";	
	КонецЕсли; 
	
	Если Цифры > 0 Тогда
		КодНомера = КодНомера + Строка(Цифры)+"1";	
	КонецЕсли; 
	
	Если СтрДлина(КодНомера) = 0 Тогда
		// В строке не соделжалось допустимых символов
		Возврат Параметр;	
	КонецЕсли; 
	
	// 2. Получаем по Коду КодФормата
	КодФормата = СокрЛП(ФорматНомера.Получить(КодНомера)); 	
	
	Если НЕ ЗначениеЗаполнено(КодФормата) Тогда		
		// КодФормата не найден - возвращаем входящую Строку
		Возврат Параметр;			
	КонецЕсли; 
		
	// 3. Форматируем Строку по КодуФормата
	Результат = "";
	Позиция   = 1;
	
	Для Инд = 1 По СтрДлина(КодФормата) Цикл
		
		КолСимв = 0;
		Симв    = Сред(КодФормата, Инд, 1);
			
		Если  Найти("0123456789", Симв) = 0 И
			  Найти("АВЕКМНОРСТУХABCDEHKMOPTUXYZ", Симв) = 0 Тогда
			// разделитель пользователя  
			КолСимв   = 1;
			Результат = Результат + Симв;			
		Иначе
			// очередной буквенно-цифровой блок + пробел
			КолСимв   = Число(Симв);
			Результат = Результат + Сред(Буфер, Позиция ,КолСимв)+ " ";
		КонецЕсли; 
				
		Позиция   = Позиция   +	КолСимв;

	КонецЦикла; 	
	
	Результат = СокрЛП(Результат); // отсекаем возможный пробел в конце
	
	// 4. Если второй параметр функции = Ложь - строку к Нижнему регистру
	Если НЕ ВерхРегистр Тогда
		Результат = НРег(Результат);
	КонецЕсли; 
	
	// 5. Возвращаем результат работы функции
	Возврат Результат;
	
КонецФункции

 

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2682    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4614    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3965    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8847    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16154    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. alex-l19041 8 23.12.19 18:48 Сейчас в теме
Поправьте в таблице
Дипломаимческие
2. brooho 191 24.12.19 01:09 Сейчас в теме
3. capitan 2466 24.12.19 10:23 Сейчас в теме
Тогда уж и Кахахстан поправьте, а то будет дипломатический скандал )
А за функцию мерси, попробуем
4. brooho 191 24.12.19 10:59 Сейчас в теме
(3) Спасибо, поправил.
Не за что:)
5. Student1C 57 24.05.21 11:41 Сейчас в теме
Интересно, а как нибудь решали проблемы дублирования, если вместо латинской написали кирилическую?
6. EMelihoff 03.08.22 17:02 Сейчас в теме
МассивЦифр = Новый Массив;
	
	МассивЦифр.Добавить("0");
	МассивЦифр.Добавить("1");
	МассивЦифр.Добавить("2");
	МассивЦифр.Добавить("3");
	МассивЦифр.Добавить("4");
	МассивЦифр.Добавить("5");
	МассивЦифр.Добавить("6");
	МассивЦифр.Добавить("7");
	МассивЦифр.Добавить("8");
	МассивЦифр.Добавить("9");
	
	МассивБукв = Новый Массив;
	МассивБукв.Добавить("А");
	МассивБукв.Добавить("В");
	МассивБукв.Добавить("Е");
	МассивБукв.Добавить("К");
	МассивБукв.Добавить("М");
	МассивБукв.Добавить("Н");
	МассивБукв.Добавить("О");
	МассивБукв.Добавить("Р");
	МассивБукв.Добавить("С");
	МассивБукв.Добавить("Т");
	МассивБукв.Добавить("У");
	МассивБукв.Добавить("Х");
	
	МассивРазрешенныхМасок = Новый Массив;
	МассивРазрешенныхМасок.Добавить("T NNNTT");
	МассивРазрешенныхМасок.Добавить("NNNN TT");
	
	Номер = СтрЗаменить(ВРег(Госномер), " ", "");
	ДлинаНомера = СтрДлина(Номер);
	
	ПоследнийСимволБылЦифрой = Ложь;
	ПоследнийСимволБылБуквой = Ложь;
	
	НовыйГосНомер = "";
	НоваяМаска = "";
	Для Сч = 1 по ДлинаНомера Цикл
		ТекСимвол = Сред(Номер, Сч, 1);
		ТекСимволЦифра = Ложь;
		ТекСимволБуква = Ложь;
		
		Если МассивЦифр.Найти(ТекСимвол) <> Неопределено Тогда
			ТекСимволЦифра = Истина;
			СимволМаски = "N";
		ИначеЕсли МассивБукв.Найти(ТекСимвол) <> Неопределено Тогда
			ТекСимволБуква = Истина;
			СимволМаски = "T";
		Иначе	//для прочих симолов
			ТекСимволБуква = Истина;
			СимволМаски = "";
		КонецЕсли;
		
		Пробел = "";
		//если надо будет разбирать пробелы все между буквами и цифрами
		//Если ((ПоследнийСимволБылЦифрой И ТекСимволБуква) ИЛИ (ПоследнийСимволБылБуквой И ТекСимволЦифра))  Тогда
		//стало
		Если ((ПоследнийСимволБылЦифрой И ТекСимволБуква) ИЛИ (ПоследнийСимволБылБуквой И ТекСимволЦифра)) И Найти(НовыйГосНомер," ") = 0  Тогда 
			Пробел = " ";
		КонецЕсли;
		
		НовыйГосНомер = НовыйГосНомер + Пробел + ТекСимвол;
		НоваяМаска    = НоваяМаска + Пробел + СимволМаски;
		
		ПоследнийСимволБылЦифрой = ТекСимволЦифра;
		ПоследнийСимволБылБуквой = ТекСимволБуква;
	КонецЦикла;
	ГосНомер = НовыйГосНомер;
	Если МассивРазрешенныхМасок.Найти(НоваяМаска) = Неопределено Тогда
		//возможные причины: не буква не в том языке или не разрешенная буква
		Предупреждение("ГОС.НОМЕР НЕ СООТВЕТСТВУЕТ РАЗРЕШЕННОЙ МАСКЕ");
	КонецЕсли; 
Показать
Оставьте свое сообщение