Имя: Пароль:
1C
1С v8
Определить с чего начинается строка с цифры или буквы
0 shock3r
 
25.10.12
11:54
Подскажите как в 1С пределить с чего начинается строка с цифры или буквы, есть ли такая функция?
1 Wobland
 
25.10.12
11:54
код символа определи для начала
2 1Страх
 
25.10.12
11:55
нет, но можно написать
3 drcrasher
 
25.10.12
11:55
(0) Число() не предлагать?
4 Wobland
 
25.10.12
11:55
а функции такой нет
5 Reset
 
25.10.12
11:55
Функция называется "Лев", а что считать цифрой или буквой - это твое дело
6 Wobland
 
25.10.12
11:56
(3) навеяло..
Если СтрДлина(Строка(ч))=1 Тогда //проверка на <10
7 Wobland
 
25.10.12
11:56
(6) это я вчера китайский код изучал. термин такой в смысле
8 Reset
 
25.10.12
11:57
(6) Реально было на мисте - Найти(Число,"-")>0 - проверка на отрицательность
9 shock3r
 
25.10.12
11:57
(3) спасибо, должно взлететь!
10 Wobland
 
25.10.12
11:58
(8) реально было пару дней назад. ресурсы у регистра: Размер42, Размер44...
11 Reset
 
25.10.12
11:58
(10) матьь
12 Wobland
 
25.10.12
11:58
(9) то есть, автор всё-таки выбрал китайский путь...
13 Ayvengo
 
25.10.12
11:58
(9) одна беда, через попытку нужно делать.
14 Classic
 
25.10.12
11:59
(8)
А че, нормально
15 1Страх
 
25.10.12
11:59
Симв = Лев(Стр,1);
ЭтоБуква = (НРег(Симв)<>ВРег(Симв));
16 Wobland
 
25.10.12
12:00
+(10) а, не, не пару. наверное, в писькомерной ветке отметилась. v8: Запрос. Упорядочивание по артикулу
17 Ayvengo
 
25.10.12
12:00
(15) интересный вариант ;)
18 Азат
 
25.10.12
12:00
ну или Найти("0123456789", Лев(Стр,1) = 0
19 Ayvengo
 
25.10.12
12:00
(15) не прокатит для знаков препинания и т.п. правда
20 Reset
 
25.10.12
12:01
Ну знак препинания он и не буква :)
21 cawokru
 
25.10.12
12:01
лев() + КодСимвола >= 48 И КодСимвола <= 57
22 1Страх
 
25.10.12
12:01
(19) это только для букв
правад слышал, что в грузинском прописных букв нет
23 Wobland
 
25.10.12
12:02
(21) алилуйя!
24 cawokru
 
25.10.12
12:02
+(1)
25 Ayvengo
 
25.10.12
12:03
(22) есть ;) но в других языках, возможно нет.
26 shock3r
 
25.10.12
12:04
(15) Сам бы до такого не додумался))) очень интересный вариант
27 shock3r
 
25.10.12
12:06
(21) а можно немного расшифровать? что за 48, 57? КодСимвола?
28 Мимо Проходил
 
25.10.12
12:06
(21) Настоящий 1С-ник соорудит конструкцию Если (Лев(Стр,1)="0") Или (Лев(Стр,1)="1")... И т.д. :))
29 cawokru
 
25.10.12
12:06
(27) цифры
30 cawokru
 
25.10.12
12:07
код цифер
31 Ayvengo
 
25.10.12
12:07
(27) от 0 до 9 цифры, видимо ;)
32 shock3r
 
25.10.12
12:07
(28) настоящий индус)
33 cawokru
 
25.10.12
12:07
ы, цифЕр
34 Wobland
 
25.10.12
12:09
(32) китаец. различай понятия
35 Wobland
 
25.10.12
12:10
36 ptiz
 
25.10.12
12:10
Функция НачинаетсяСЦифры(Парам)

   Запрос = Новый Запрос("ВЫБРАТЬ 1 ГДЕ &Парам ПОДОБНО ""[0-9]%""");
   Запрос.УстановитьПараметр("Парам", Парам);
   
   Возврат НЕ Запрос.Выполнить().Пустой();

КонецФункции // НачинаетсяСЦифры()
37 Wobland
 
25.10.12
12:11
(36) понеслось...
38 shock3r
 
25.10.12
12:15
Ребята вообщем написал по первому символу по коду (15), но это не фонтан, т.к. есть один косяк!!!

Если строка имеет такое значение "315Матрац", то по логике кода - это тоже будет цифра)))) а надо отмониторить, чтобы всё в строке были цифрами... сейчас имею след код:

Если КодСимвола(СтрПолучитьСтроку(строка, 2), 1) >= 48 И КодСимвола(СтрПолучитьСтроку(строка, 2), 1) <= 57 Тогда
           НоваяСтрока.Серия = "Цифра!"    
           КонецЕсли;
39 Reset
 
25.10.12
12:27
используй китайскую(по классификации чуть выше) методику:

Если КодСимвола(СтрПолучитьСтроку(строка, 2), 2) >= 48 И КодСимвола(СтрПолучитьСтроку(строка, 2), 2) <= 57 Тогда
           НоваяСтрока.Серия = "Цифра!"    
           КонецЕсли;

Если КодСимвола(СтрПолучитьСтроку(строка, 2), 3) >= 48 И КодСимвола(СтрПолучитьСтроку(строка, 2), 2) <= 57 Тогда
           НоваяСтрока.Серия = "Цифра!"    
           КонецЕсли;
Если КодСимвола(СтрПолучитьСтроку(строка, 2), 3) >= 48 И КодСимвола(СтрПолучитьСтроку(строка, 2), 1) <= 57 Тогда
           НоваяСтрока.Серия = "Цифра!"    
           КонецЕсли;

И тд
40 Reset
 
25.10.12
12:27
в последнем копипасте ошибка :(
41 Reset
 
25.10.12
12:27
и во втором. ну идея понятна
42 Reset
 
25.10.12
12:28
и в первом
да блин, как я умудрился
43 Ayvengo
 
25.10.12
12:30
ЭтоЧисло = Ложь;
НомерСимвола = 1;
Пока Не ЭтоЧисло Цикл
   Если КодСимвола(Строка, НомерСимвола) > =48 и КодСимвола(Строка, НомерСимвола) <= 57 Тогда
       ЭтоЧисло = Истина;
   Иначе
       Прервать;
   КонецЕсли;
   НомерСимвола = НомерСимвола + 1;
КонецЦикла;
44 Ayvengo
 
25.10.12
12:32
ДлинаСтроки = СтрДлина(Строка);
Для НомерСимвола = 1 По ДлинаСтроки Цикл
   Если КодСимвола(Строка, НомерСимвола) > =48 и КодСимвола(Строка, НомерСимвола) <= 57 Тогда
       // Что там тебе нужно сделать ;)
   КонецЕсли;
КонецЦикла;
45 drcrasher
 
25.10.12
12:37
Общий модуль ОбщегоНазначения

Функция ЕстьНеЦифрыВСтроке(Знач СтрокаПроверки) Экспорт
   
   Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
       КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
       Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда
           Возврат Истина;
       КонецЕсли;
   КонецЦикла;

   Возврат Ложь;
   
КонецФункции
46 Reset
 
25.10.12
12:38
(45) Писатели общего модуля не читают СП на предмет параметров КодСимвола!
47 ptiz
 
25.10.12
12:39
Функция ТолькоЦифры(Парам)

   RegExp = Новый COMОбъект("VBScript.RegExp");
   RegExp.Pattern = "^[0-9]+$";
   
   Возврат RegExp.test(Парам);

КонецФункции // ТолькоЦифры()
48 Classic
 
25.10.12
12:40
СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Число,"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9","") = ""
49 Ayvengo
 
25.10.12
12:40
(48) охтвоюжмать :D
50 Ayvengo
 
25.10.12
12:40
(48) в цикле для по будет красивее :Р
51 Ayvengo
 
25.10.12
12:42
(48) и еще, косяк.. ведь надо убирать только первые цифры, а не в середине или где-то еще ;)
52 Classic
 
25.10.12
12:44
(51)
Читай (38)
53 drcrasher
 
25.10.12
12:45
(46) этточно
(47) клёвый подход, уважаю =)
54 Ayvengo
 
25.10.12
12:47
(52) ну фиг знает, я понял что только первые, тут нас рассудит только ТС :)
55 shock3r
 
25.10.12
15:25
Спасибо ребята)) информации предостаточно)
56 vmv
 
25.10.12
15:29
кушойте не обляпуйтесь - все рабочее

мини-лексический анализатор на 1С вчера напсало для просморта ВТ, удаления ВТ из Пакетов, и пр., хотя ему по фик с чем работать и мне плевать на вопли "можно красивше"

а на фига красивше?


//
// Add_ComM_ОтчетыКС.СтрокаБукв_Ru();
//
Функция СтрокаБукв_Ru() Экспорт
   Возврат "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ";
КонецФункции
//
// Add_ComM_ОтчетыКС.Буква_Ru(С);
//
Функция Буква_Ru(С) Экспорт
   Возврат Найти(СтрокаБукв_Ru(), ВРег(С)) <> 0;
КонецФункции

//
// Add_ComM_ОтчетыКС.СтрокаБукв_En();
//
Функция СтрокаБукв_En() Экспорт
   Возврат "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
КонецФункции
//
//Add_ComM_ОтчетыКС.Буква_En(С);
//
Функция Буква_En(С) Экспорт
   Возврат Найти(СтрокаБукв_En(), ВРег(С)) <> 0;    
КонецФункции

//
// Add_ComM_ОтчетыКС.СтрокаЦифр();
//
Функция СтрокаЦифр() Экспорт
   Возврат "0123456789";
КонецФункции
//
//Add_ComM_ОтчетыКС.Цифра(С);
//
Функция Цифра(С) Экспорт
  Возврат Найти(СтрокаЦифр(), ВРег(С)) <> 0;
КонецФункции

//
//Add_ComM_ОтчетыКС.Буква_Ru_ИлиБуква_En(С);
//
Функция Буква_Ru_ИлиБуква_En(С) Экспорт
   Возврат Найти(СтрокаБукв_Ru()+СтрокаБукв_En(), ВРег(С)) <> 0;
КонецФункции

//
//Add_ComM_ОтчетыКС.Буква_Ru_ИлиБуква_En_ИлиЦифра(С);
//
Функция Буква_Ru_ИлиБуква_En_ИлиЦифра(С) Экспорт
   Возврат Найти(СтрокаБукв_Ru()+СтрокаБукв_En()+СтрокаЦифр(), ВРег(С)) <> 0;
КонецФункции
 

//
//Add_ComM_ОтчетыКС.ПолучитьДлинуИдВСтрокеСПозиции(СтрокаСимволов, НачПозИд);
//
Функция ПолучитьДлинуИдВСтрокеСПозиции(СтрокаСимволов, НачПозИд, ШаблонПоиска) Экспорт

   ИсходнаяНачПоз = НачПозИд;
   Если ИсходнаяНачПоз <= СтрДлина(СтрокаСимволов) Тогда
       ПредшествующийСимвол = Сред(СтрокаСимволов, ИсходнаяНачПоз-1, 1);
       ПредшествующийСимволБуква_Ru_ИлиБуква_En_Или_ = (Буква_Ru_ИлиБуква_En(ПредшествующийСимвол) ИЛИ ПредшествующийСимвол = "_");
   Иначе    
       ПредшествующийСимволБуква_Ru_ИлиБуква_En_Или_ = Ложь;
   КонецЕсли;
   
   Ид           = "";
   СтрокаДлина  = СтрДлина(СтрокаСимволов);
   
   Для ТекущаяПозиция = НачПозИд По СтрокаДлина Цикл
       
       ИдДлина  = СтрДлина(Ид);
       ТкСимвол = Сред(СтрокаСимволов, ТекущаяПозиция, 1);
       
       Если Найти(ШаблонПоиска, ВРег(ТкСимвол)) Тогда
           
           Если ИдДлина Тогда
               Ид = Ид + ТкСимвол;
           Иначе
               
               Если ПредшествующийСимволБуква_Ru_ИлиБуква_En_Или_ И ИсходнаяНачПоз = ТекущаяПозиция Тогда
                   Прервать;  // С первого же символа Ид происходит слияние со словом, которое содержит терм - это не Ид.
               КонецЕсли;
               
               Если Буква_Ru_ИлиБуква_En(ТкСимвол) ИЛИ ТкСимвол = "_" Тогда
                   НачПозИд = ТекущаяПозиция;    // Смещаем НачПозИд для первого сивола Ид, вероятно перед ней были пробелы
                   Ид = Ид + ТкСимвол;
               Иначе    
                   Прервать;  // В первом же символе Ид цифра - это ошибка написания идентификатора
               КонецЕсли;
           КонецЕсли;
           
       Иначе
           
           Если ИдДлина Тогда
               Прервать;      // Ид уже содержит символы и текущий символ не в шаблоне, значит это конец Ид.          
           КонецЕсли;
           
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат СтрДлина(Ид);
   
КонецФункции
 
//
// Варианты вызова:
//
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "Поместить", Истина);  // имена временных таблиц запроса
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "ПОМЕСТИТЬ", Истина);  // ...
//
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "Уничтожить", Истина); // имена уничтожаемых временных таблиц запроса
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "УНИЧТОЖИТЬ", Истина); // ...
//
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "&", Истина);          // имена параметров запроса
//
// Add_ComM_ОтчетыКС.ПолучитьМассивИдВСтрокеПослеТермов(ЗапросТекст, "Поместить", Истина, Истина);
// В этом вызове получим массив ид с термами точно так как они сформированы в строке т.е.
// "ПОМЕСТИТЬ Вт1"
// "ПОМЕСТИТЬ    Вт2"
// ...
//
Функция ПолучитьМассивИдВСтрокеПослеТермов(Знач СтрокаСимволов, СтрокаТерма, Уникальные = Истина, ВключаяТерм = Ложь) Экспорт
   
   СтрокаСимволовИсходная = СтрокаСимволов;
   мИдентификаторы        = Новый Массив;
   
   СтрокаСимволовВРег = ВРег(СтрокаСимволов);
   СтрокаТермаВРег    = ВРег(СтрокаТерма);
   СтрокаТермаДлина   = СтрДлина(СтрокаТерма);
   
   // Находим позицию первого символа терма, далее с (НачПозИд + СтрокаТермаДлина) - это позиции поиска идентификатора
   НачПозТерма = Найти(СтрокаСимволовВРег, СтрокаТермаВРег);
   Если НачПозТерма Тогда
       НачПозИд = НачПозТерма + СтрокаТермаДлина;
   Иначе
       Возврат мИдентификаторы;
   КонецЕсли;  
   
   ШаблонПоиска = СтрокаБукв_Ru() + СтрокаБукв_En() + СтрокаЦифр();
   
   Пока НачПозИд Цикл
       
       ИдДлина = ПолучитьДлинуИдВСтрокеСПозиции(СтрокаСимволовВРег, НачПозИд, ШаблонПоиска);
       
       Если ИдДлина > 0 Тогда
           Ид = Сред(СтрокаСимволовИсходная, НачПозИд, ИдДлина);
           КонПозИд = НачПозИд + ИдДлина;
           Если ВключаяТерм Тогда
               ИдВключаяТерм = Сред(СтрокаСимволовИсходная, НачПозТерма, КонПозИд-НачПозТерма);
               Если Уникальные Тогда
                   Если мИдентификаторы.Найти(ИдВключаяТерм) = Неопределено Тогда
                       мИдентификаторы.Добавить(ИдВключаяТерм);
                   КонецЕсли;
               Иначе    
                   мИдентификаторы.Добавить(ИдВключаяТерм);
               КонецЕсли;
           Иначе    
               Если Уникальные Тогда
                   Если мИдентификаторы.Найти(Ид) = Неопределено Тогда
                       мИдентификаторы.Добавить(Ид);
                   КонецЕсли;
               Иначе    
                   мИдентификаторы.Добавить(Ид);
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       
       Если КонПозИд >= СтрДлина(СтрокаСимволовИсходная) Тогда
           Прервать;
       КонецЕсли;
       
       // Сокращаем СтрокаСимволовИсходная и СтрокаСимволовИсходнаяВРег
       СтрокаСимволовИсходная = Сред(СтрокаСимволовИсходная, КонПозИд);
       СтрокаСимволовВРег     = Сред(СтрокаСимволовВРег    , КонПозИд);
       
       // Готовим следующую итерацию поска очередного Ид по терму
       НачПозТерма = Найти(СтрокаСимволовВРег, СтрокаТермаВРег);
       Если НачПозТерма Тогда
           НачПозИд = НачПозТерма + СтрокаТермаДлина;
       Иначе
           Прервать;  // Выход итак будет по условию итерации цикла, но выходим сразу
       КонецЕсли;  
       
   КонецЦикла;
   
   Возврат мИдентификаторы;
   
КонецФункции