Есть справочник номенклатура с указанными артикулами.
Артикулы необходимо вывести в штрихкод Code128 и печатать на этикетках. Но Code128 не поддерживает кириллицу.
Решил просто запрещать печатать этикетки для номенклатуры с кириллицей в артикуле.
Как можно проверить строку на наличие кириллицы, кроме метода Найти(<Строка>, <Подстрока поиска>)?
А то не хочется писать поиск под каждую букву алфавита.
Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
ЕстьКириллица=истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Показать
Так вам не нужно будет каждый раз прогонять функцию по всей строке, будет достаточно первого найденного символа.
Функция ЕстьКириллица(ИсходнаяСтрока) Экспорт
ЕстьКириллица=ложь;
ИсходнаяСтрока=СокрЛП(ИсходнаяСтрока);
Если СтрДлина(ИсходнаяСтрока)>0 Тогда
Для Сч=1 по СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Сч, 1));
Если Найти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", Символ) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Как один из вариантов решения, несколько специфический, т.к. заточен по другую задачу. В контексте этой - обрабатываем строку в процедуре и сравниваем с тем что было до обработки. Но (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",
"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ","Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э","Я","Ч","С","М","И","Т","Ь","Б","Ю","Ё");
Для Каждого Символ Из ЛишниеСимволы Цикл
Стр = СтрЗаменить(Стр, Символ.Значение, "");
КонецЦикла;
КонецПроцедуры // ВыпилитьКирилицу(Стр)
я бы рекомендовал изменить эту строку на примерно такой вариант
ИсходнаяСтрокаБезЛП=СокрЛП(ИсходнаяСтрока);
потому что ИсходнаяСтрока в функцию передается по ссылке, это нужно на случай если при вызове функции в нее передадут не строку а например СправочникХХХ.Ссылка.Наименование
итак, во-первых, Code128 не "не поддерживает кириллицу". он поддерживает только символы цифр, буквы латинского алфавита и некоторые спецсимволы. http://ru.wikipedia.org/wiki/Code_128 поэтому ограниченно проверять только на кириллицу не совсем верно.
во-вторых - просто запрещать печать ШК для такой номенклатуры, на мой взгляд, не совсем хорошо. ведь можно просто перевести артикул в транслит, а потом формировать ШК.
(9) для преобразования в транслит можно пойти чуть более коротким путем: преобразовать, например, в код OEM. на инфостарте есть статейка про это: https://infostart.ru/public/313317/ В коде OEM как раз можно закодировать кириллицу любого регистра, символы и цифры.
(9) Тема стара, но чертовски полезна. Для формирования CODE128 транслит - имхо лучшее и универсальное решение: при транслите не нужно "выкидывать" ни каких символов и букв, кроме того ни во всех магазинах используются артикулы, а транслит позволит создать уникальный штрихкод на основе наименования номенклатуры. Так же при наличии артикулов, если артикулы содержат кириллические буквы, то, при их "выкидывании", может оказаться две номенклатуры с одинаковым штрихкодом.
Понимаю, что тема ужасно стара, но легче всего пойти через ПОПЫТКУ преобразовать Строку в Число.
Попытка
НашеЧисло = Число(Артикул);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Карл, только цифры нужны!";
Сообщение.Сообщить();
КонецПопытки;
Можно более быстро проверку сделать через код символов. Таким образом будут исключаться все символы кроме цифр.
Функция ПроверкаНаСимволыКромеЦифр(СтрокаПроверки) Экспорт
РезультатПроверки=Ложь;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если Не (КодСимвола >= 48 И КодСимвола <= 57) Тогда
РезультатПроверки=Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат РезультатПроверки;
КонецФункции
сам не пробовал, но если работает эта функция, то быстрее
Функция ТолькоЦифрыВСтроке(СН)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА &СН ПОДОБНО ""%[^0-9]%""
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК ТолькоЦифрыВСтроке";
Запрос.УстановитьПараметр("СН", СН);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ТолькоЦифры = ложь;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ТолькоЦифры = ВыборкаДетальныеЗаписи.ТолькоЦифрыВСтроке;
КонецЦикла;
возврат ТолькоЦифры;
КонецФункции // ()
(25) Чуви.
Твоё "гениальное" СтрРазделить(НРег(ИсходнаяСтрока) возвращает массив, элементами которого являются символы нижнего регистра. Хоть ты там потом обсоединяйся их обратно.
Коллеги!
Уже давно есть в общем модуле процедура - решающая эту задачу.
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(Результат,,"0123456789"); - это было точно в УПП 1.2
Коллеги!
Уже давно есть в общем модуле процедура - решающая эту задачу.
СтроковыеФункцииКлиентСервер.ТолькоЛатиницаВСтроке(Результат,,"0123456789"); - это было точно в УПП 1.2