Технологии Blogger.

Поиск ошибок наименования (нелатинские символы среди латинских)

>> 10 октября 2013 г.

Возникла проблема, когда люди в наименовании товара указывают вместо латинских символов - русские (вспомним букву С в начале набора слова!). К сожалению, если наименование содержит по своей природе не только латинские символы, то выполнить проверку не так просто - не достаточно просто выловить все символы с кодом меньше/равно 127.


Можно немного ухитриться, и при проверке символа, определять не только то, что он не принадлежит "нормальным" символам, но и проверять его соседей. Лично я установил условие чтобы соседний символ не был сточной, либо прописной латинской буквой (согласитесь, странно выглядит русская буква в соседстве с латинской).
При это нужно указать два диапазона, чтобы исключить слэши, тире и остальные спецсимволы, так как они могут иметь место в паре с русскими.
Числа могу так же быть вместе с русскими символами, но это уже нужно обращать внимание на специфику наименования - если что, и эта проверка будет не лишней.

Как результат, мне удалось не только найти ошибки символьные, но и не прописанные пробелы между русскими и английскими словами в наименовании.

И что еще интереснее, удалось выделить английские символы, которые "затерялись" среди русских слов (выделялся русский символ, соседом которого был латинский).



Таблица символов ASCII



Процедура ДействияФормыПроверкаНаименования(Кнопка)
 
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   | Номенклатура.Наименование КАК Наименование,
   | Номенклатура.Код
   |ИЗ
   | Справочник.Номенклатура КАК Номенклатура
   |ГДЕ
   | (НЕ Номенклатура.ПометкаУдаления)
   |
   |УПОРЯДОЧИТЬ ПО
   | Наименование";
 
   Выборка = Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
      ОбработкаПрерыванияПользователя();
      Индекс = обПроверитьСимволыЛатиницы(Выборка.Наименование);
      Если Индекс > 0 Тогда
         Символ = Сред(Выборка.Наименование,Индекс,1);
  НовоеИмя = Лев(Выборка.Наименование, Индекс-1)+"{"+Символ+"}"+Прав(Выборка.Наименование, СтрДлина(Выборка.Наименование)-Индекс);
  Сообщить(Формат(Выборка.Код, "ЧГ=")+"  =>  "+НовоеИмя);
      КонецЕсли;
   КонецЦикла;
 
КонецПроцедуры

Функция обПроверитьСимволыЛатиницы(Строка)
   Для Индекс = 1 По СтрДлина(Строка) Цикл
      Символ = Сред(Строка,Индекс,1);
      Если НЕ обЭтоСимволЛатиницы(Символ) Тогда
 // --------------------------------------------
 // проверим соседние символы
 Если Индекс>1 Тогда
    Символ = Сред(Строка,Индекс-1,1);
    Если обЭтоСимволЛатиницы(Символ, Истина) Тогда
       Возврат Индекс;
    КонецЕсли;
 КонецЕсли;
 Если Индекс<СтрДлина(Строка) Тогда
    Символ = Сред(Строка,Индекс+1,1);
    Если обЭтоСимволЛатиницы(Символ, Истина) Тогда
       Возврат Индекс;
    КонецЕсли;
 КонецЕсли;
 // --------------------------------------------
      КонецЕсли; 
   КонецЦикла; 
   Возврат 0;
КонецФункции

Функция обЭтоСимволЛатиницы(Символ, ТолькоБуквы=Ложь)
   Код = КодСимвола(Символ);
   Если (Код < 128) Тогда // нелатинский символ
      Если ТолькоБуквы Тогда // исключим специальные символы
 Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда //(Код >= 48 И Код <= 57)
    Возврат Истина;
 Иначе
    Возврат Ложь;
 КонецЕсли;
      КонецЕсли;
      Возврат Истина;
   Иначе
      Возврат Ложь;
   КонецЕсли; 
КонецФункции 

Отправить комментарий

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP