Проверка строки на наличие символов кириллицы

1. vithak 29.06.12 10:05 Сейчас в теме
Есть справочник номенклатура с указанными артикулами.
Артикулы необходимо вывести в штрихкод Code128 и печатать на этикетках. Но Code128 не поддерживает кириллицу.
Решил просто запрещать печатать этикетки для номенклатуры с кириллицей в артикуле.
Как можно проверить строку на наличие кириллицы, кроме метода Найти(<Строка>, <Подстрока поиска>)?
А то не хочется писать поиск под каждую букву алфавита.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 29.06.12 10:12 Сейчас в теме
(1) см. функцию КодСимвола(), а коды можно яндексом найти без особых проблем :)
3. rasswet 82 29.06.12 10:21 Сейчас в теме
под каждую отдельно можно не писать
"йцукенгшщзхъ" и так далее.
4. naf2000 29.06.12 10:29 Сейчас в теме
ï это кириллица или нет?
а эта Җ ?
5. Летяга 29.06.12 10:36 Сейчас в теме
Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
ЕстьКириллица=истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Возврат ЕстьКириллица;
КонецФункции
vechiy; muzzombie; oleggio345; SIrina9; user1671936; Serg982; Емельянов Алексей; heavymetal; Parazyte; surr; mamba; Mechanik21; nad0_hto; eact; smit1c; CyberMax; madonov; stupidgamer; IrinaKostroma; Infector; perepetulichka; Larkin; twin; babys; KEV8383; vithak; vlasin; Поручик; +28 Ответить
6. vithak 29.06.12 11:34 Сейчас в теме
(5) Летяга, спасибо большое. сам что-то не допёр до этого)
7. juntatalor 63 29.06.12 14:31 Сейчас в теме
(5)
я бы модифицировал:

Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Возврат Ложь;
КонецФункции
Показать


Так вам не нужно будет каждый раз прогонять функцию по всей строке, будет достаточно первого найденного символа.
Farhat95; Brokenfor; GV.; InJey; Veric; Емельянов Алексей; Mechanik21; heavymetal; alexhummer; romankoav; Parazyte; akimych; nad0_hto; uropek; Летяга; +15 Ответить
17. alexhummer 28.04.20 01:17 Сейчас в теме
(7)
Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Возврат Ложь;
КонецФункции
Показать


Очень удобный и универсальный вариант. :)
12. Infector 201 04.08.17 07:32 Сейчас в теме
Как один из вариантов решения, несколько специфический, т.к. заточен по другую задачу. В контексте этой - обрабатываем строку в процедуре и сравниваем с тем что было до обработки. Но (5) - решение на этот случай более красивое.


Стр = ВРЕГ(Артикул);
ВыпилитьКирилицу(Стр);

Если ВРЕГ(Артикул) <> Стр Тогда

КонецЕсли;

Процедура ВыпилитьКирилицу(Стр) Экспорт
	
	ЛишниеСимволы = Новый Структура("_01,_02,_03,_04,_05,_06,_07,_08,_09,_10,_11,_12,_13,_14,_15,
		|_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33",
		"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ","Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э","Я","Ч","С","М","И","Т","Ь","Б","Ю","Ё");
	
	Для Каждого	Символ Из ЛишниеСимволы Цикл
		Стр = СтрЗаменить(Стр, Символ.Значение, "");
	КонецЦикла;	
	
КонецПроцедуры // ВыпилитьКирилицу(Стр)
Показать
18. prog1c_vl 24 07.04.22 15:41 Сейчас в теме
(5)
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);

я бы рекомендовал изменить эту строку на примерно такой вариант
ИсходнаяСтрокаБезЛП=СокрЛП(ИсходнаяСтрока);
потому что ИсходнаяСтрока в функцию передается по ссылке, это нужно на случай если при вызове функции в нее передадут не строку а например СправочникХХХ.Ссылка.Наименование
33. djsashulik 02.08.23 08:39 Сейчас в теме
(5)уже давно есть в общем модуле процедура - решающая эту задачу.
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(Результат,,"0123456789");

зачем городить велосипед?
8. пользователь 29.06.12 15:31
Сообщение было скрыто модератором.
...
9. andrewks 1370 30.06.12 09:01 Сейчас в теме
итак, во-первых, Code128 не "не поддерживает кириллицу". он поддерживает только символы цифр, буквы латинского алфавита и некоторые спецсимволы. http://ru.wikipedia.org/wiki/Code_128 поэтому ограниченно проверять только на кириллицу не совсем верно.

во-вторых - просто запрещать печать ШК для такой номенклатуры, на мой взгляд, не совсем хорошо. ведь можно просто перевести артикул в транслит, а потом формировать ШК.

транслит можно, например, сделать так:

Функция Транслит(Имя)
    Рез = СокрЛП(Имя);   
    Рез = СтрЗаменить(Рез,"а","a");
    Рез = СтрЗаменить(Рез,"б","b");
    Рез = СтрЗаменить(Рез,"в","v");
    Рез = СтрЗаменить(Рез,"г","g");
    Рез = СтрЗаменить(Рез,"д","d");
    Рез = СтрЗаменить(Рез,"е","e");
    Рез = СтрЗаменить(Рез,"ё","e");
    Рез = СтрЗаменить(Рез,"ж","zh");
    Рез = СтрЗаменить(Рез,"з","z");
    Рез = СтрЗаменить(Рез,"и","i");
    Рез = СтрЗаменить(Рез,"к","k");
    Рез = СтрЗаменить(Рез,"л","l");
    Рез = СтрЗаменить(Рез,"м","m");
    Рез = СтрЗаменить(Рез,"н","n");
    Рез = СтрЗаменить(Рез,"о","o");
    Рез = СтрЗаменить(Рез,"п","p");
    Рез = СтрЗаменить(Рез,"р","r");
    Рез = СтрЗаменить(Рез,"с","s");
    Рез = СтрЗаменить(Рез,"т","t");
    Рез = СтрЗаменить(Рез,"у","u");
    Рез = СтрЗаменить(Рез,"ф","f");
    Рез = СтрЗаменить(Рез,"х","h");
    Рез = СтрЗаменить(Рез,"ч","ch");
    Рез = СтрЗаменить(Рез,"ш","sh");
    Рез = СтрЗаменить(Рез,"щ","sch");
    Рез = СтрЗаменить(Рез,"ъ","");
    Рез = СтрЗаменить(Рез,"ь","");
    Рез = СтрЗаменить(Рез,"э","e");
    Рез = СтрЗаменить(Рез,"ю","yu");
    Рез = СтрЗаменить(Рез,"й","i");
    Рез = СтрЗаменить(Рез,"ц","c");
    Рез = СтрЗаменить(Рез,"я","ya");
    Рез = СтрЗаменить(Рез,"ы","i");
    Рез = СтрЗаменить(Рез,"А","A");
    Рез = СтрЗаменить(Рез,"Б","B");
    Рез = СтрЗаменить(Рез,"В","V");
    Рез = СтрЗаменить(Рез,"Г","G");
    Рез = СтрЗаменить(Рез,"Д","D");
    Рез = СтрЗаменить(Рез,"Е","E");
    Рез = СтрЗаменить(Рез,"Ё","E");
    Рез = СтрЗаменить(Рез,"Ж","ZH");
    Рез = СтрЗаменить(Рез,"З","Z");
    Рез = СтрЗаменить(Рез,"И","I");
    Рез = СтрЗаменить(Рез,"К","K");
    Рез = СтрЗаменить(Рез,"Л","L");
    Рез = СтрЗаменить(Рез,"М","M");
    Рез = СтрЗаменить(Рез,"Н","N");
    Рез = СтрЗаменить(Рез,"О","O");
    Рез = СтрЗаменить(Рез,"П","P");
    Рез = СтрЗаменить(Рез,"Р","R");
    Рез = СтрЗаменить(Рез,"С","S");
    Рез = СтрЗаменить(Рез,"Т","T");
    Рез = СтрЗаменить(Рез,"У","U");
    Рез = СтрЗаменить(Рез,"Ф","F");
    Рез = СтрЗаменить(Рез,"Х","H");
    Рез = СтрЗаменить(Рез,"Ч","CH");
    Рез = СтрЗаменить(Рез,"Ш","SH");
    Рез = СтрЗаменить(Рез,"Щ","SCH");
    Рез = СтрЗаменить(Рез,"Ъ","");
    Рез = СтрЗаменить(Рез,"Ь","");
    Рез = СтрЗаменить(Рез,"Ы","I");
    Рез = СтрЗаменить(Рез,"Ц","C");
    Рез = СтрЗаменить(Рез,"Э","E");
    Рез = СтрЗаменить(Рез,"Ю","YU");
    Рез = СтрЗаменить(Рез,"Я","YA");
    Рез = СтрЗаменить(Рез,"Й","I");
    Возврат(Рез);
КонецФункции
Показать


а вообще, решений уйма в поиске
Емельянов Алексей; nord_semirami; jaroslav.h; sstas007; +4 Ответить
11. nord_semirami 04.08.17 05:31 Сейчас в теме
(9) для преобразования в транслит можно пойти чуть более коротким путем: преобразовать, например, в код OEM. на инфостарте есть статейка про это: https://infostart.ru/public/313317/
В коде OEM как раз можно закодировать кириллицу любого регистра, символы и цифры.
13. nord_semirami 12.10.17 04:24 Сейчас в теме
(9) Тема стара, но чертовски полезна. Для формирования CODE128 транслит - имхо лучшее и универсальное решение: при транслите не нужно "выкидывать" ни каких символов и букв, кроме того ни во всех магазинах используются артикулы, а транслит позволит создать уникальный штрихкод на основе наименования номенклатуры. Так же при наличии артикулов, если артикулы содержат кириллические буквы, то, при их "выкидывании", может оказаться две номенклатуры с одинаковым штрихкодом.
10. Fe9_min 50 19.04.17 17:51 Сейчас в теме
Понимаю, что тема ужасно стара, но легче всего пойти через ПОПЫТКУ преобразовать Строку в Число.

Попытка
	
		НашеЧисло = Число(Артикул);
	
	Исключение
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Карл, только цифры нужны!";
		Сообщение.Сообщить();
		
	КонецПопытки;
Показать
АннаШ; itprogr2; +2 Ответить
14. SergSC 20.03.18 09:27 Сейчас в теме
(10)
Попыткой не удобно, т.к. при отладке с галочкой на остановке по ошибке, постоянно будет там останавливаться, если срабатывает исключение.
15. SergSC 20.03.18 10:07 Сейчас в теме
Можно более быстро проверку сделать через код символов. Таким образом будут исключаться все символы кроме цифр.
Функция ПроверкаНаСимволыКромеЦифр(СтрокаПроверки) Экспорт
	
	РезультатПроверки=Ложь;
	Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
        КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
        Если Не (КодСимвола >= 48 И КодСимвола <= 57) Тогда
            РезультатПроверки=Истина;
			Прервать;
        КонецЕсли; 
    КонецЦикла; 


	Возврат РезультатПроверки;
	
КонецФункции
Показать
Asenka; user1135682; smit1c; user592955_ni_engel; +4 Ответить
16. KEV8383 20 04.06.19 14:23 Сейчас в теме
Функция СтрокаНаписанаПоРусски(Знач СтрокаПараметр) Экспорт
	
	СтрокаПараметр = СокрЛП(СтрокаПараметр);
	
	СписокДопустимыхЗначений = Новый Массив;
	СписокДопустимыхЗначений.Добавить(45); // "-"
	СписокДопустимыхЗначений.Добавить(46); // "."
	СписокДопустимыхЗначений.Добавить(32); // " "
	СписокДопустимыхЗначений.Добавить(48); // "0"
	СписокДопустимыхЗначений.Добавить(49); // "1"
	СписокДопустимыхЗначений.Добавить(50); // "2"
	СписокДопустимыхЗначений.Добавить(51); // "3"
	СписокДопустимыхЗначений.Добавить(52); // "4"
	СписокДопустимыхЗначений.Добавить(53); // "5"
	СписокДопустимыхЗначений.Добавить(54); // "6"
	СписокДопустимыхЗначений.Добавить(55); // "7"
	СписокДопустимыхЗначений.Добавить(56); // "8"
	СписокДопустимыхЗначений.Добавить(57); // "9"
	
	СписокДопустимыхЗначений.Добавить(1105); // седьмая буква алфавита, строчная
	СписокДопустимыхЗначений.Добавить(1025); // седьмая буква алфавита, заглавная
	
	Для Сч = 1 По СтрДлина(СтрокаПараметр) Цикл
		Код = КодСимвола(СтрокаПараметр, Сч);
		Если ((Код < 1040) ИЛИ (Код > 1103)) И (СписокДопустимыхЗначений.Найти(Код) = Неопределено) Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции
Показать
19. dobrynin.i.s 92 27.02.23 17:42 Сейчас в теме
сам не пробовал, но если работает эта функция, то быстрее
Функция ТолькоЦифрыВСтроке(СН)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА &СН ПОДОБНО ""%[^0-9]%""
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ ИСТИНА
	|	КОНЕЦ КАК ТолькоЦифрыВСтроке";
	
	Запрос.УстановитьПараметр("СН", СН);
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	ТолькоЦифры = ложь;
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ТолькоЦифры = ВыборкаДетальныеЗаписи.ТолькоЦифрыВСтроке;
	КонецЦикла;
	возврат ТолькоЦифры;
	
КонецФункции // ()
Показать
32. Dr.HiHi 3 28.02.23 00:52 Сейчас в теме
(19) только немного оптимизировать ;))

    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ИСТИНА
    |ГДЕ
    |    &СН ПОДОБНО ""%[^0-9]%""";
    Запрос.УстановитьПараметр("СН", СН);
    РезультатЗапроса = Запрос.Выполнить();
    Возврат РезультатЗапроса.Пустой();
Показать
20. SlavaKron 27.02.23 20:41 Сейчас в теме
Мимо проходил
Функция ЕстьКириллица(ИсходнаяСтрока)
	Возврат СтрСоединить(СтрРазделить(НРег(ИсходнаяСтрока), "абвгдеёжзийклмнопрстуфхцчшщъыьэюя")) <> ИсходнаяСтрока
КонецФункции
21. user1863362 27.02.23 21:35 Сейчас в теме
(20)
Мимо проходил
НРег от строки никогда не будет равен ей самой, мимо проходящий.
23. SlavaKron 27.02.23 21:42 Сейчас в теме
24. user1863362 27.02.23 21:44 Сейчас в теме
(23)И всё. Твоё ЕстьКириллица === Истина
25. SlavaKron 27.02.23 21:45 Сейчас в теме
27. user1863362 27.02.23 21:47 Сейчас в теме
(25) Чуви.
Твоё "гениальное" СтрРазделить(НРег(ИсходнаяСтрока) возвращает массив, элементами которого являются символы нижнего регистра. Хоть ты там потом обсоединяйся их обратно.
28. Sashares 34 27.02.23 21:50 Сейчас в теме
(27)Да нормальная идея у коллеги, надо только исходную строку справа тоже в Нрег обернуть и будет работать.
Функция ЕстьКириллица(ИсходнаяСтрока)
    Возврат СтрСоединить(СтрРазделить(НРег(ИсходнаяСтрока), "абвгдеёжзийклмнопрстуфхцчшщъыьэюя")) <> Нрег(ИсходнаяСтрока);
КонецФункции
29. SlavaKron 27.02.23 21:51 Сейчас в теме
(27) Извиняюсь за грубость, был не прав.
22. spacecraft 27.02.23 21:41 Сейчас в теме
(20) достаточно будет проверить количество элементов массива.
26. SlavaKron 27.02.23 21:47 Сейчас в теме
(22) Согласен. А еще оптимальнее проверять на допустимые символы.
30. SlavaKron 27.02.23 21:54 Сейчас в теме
Вариант "от обратного". Мимо ушёл
Функция ЭтоКорректнаяСтрока(ИсходнаяСтрока)
	Возврат СтрРазделить(НРег(ИсходнаяСтрока), "abcdefghijklmnopqrstuvwxyz0123456789 ", Ложь).Количество() = 0
КонецФункции
31. user856012 13 27.02.23 22:27 Сейчас в теме
Битва экстранекросенсовпостеров окончена? Нееет, просто отложена... до лучших времен!
34. djsashulik 02.08.23 08:40 Сейчас в теме
Коллеги!
Уже давно есть в общем модуле процедура - решающая эту задачу.
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(Результат,,"0123456789"); - это было точно в УПП 1.2

зачем городить велосипед?
35. user1880116 02.08.23 08:49 Сейчас в теме
Коллеги!
Уже давно есть в общем модуле процедура - решающая эту задачу.
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(Результат,,"0123456789"); - это было точно в УПП 1.2

зачем городить велосипед?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот