Имя: Пароль:
1C
1С v8
Проверка строки через ПОДОБНО
, ,
0 cons74
 
09.02.16
11:28
Добрый день.
Захотел проверять строку (поле ввода г/номера авто) через ПОДОБНО.

Получился почти монстр для такой простой задачи. Можно как-то проще?


ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Стр", Новый ОписаниеТипов("Строка"));
        стрТЗ = ТЗ.Добавить();
        стрТЗ.Стр = Элемент.Значение;
        Запрос = Новый Запрос;
        //Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ТЗ.Стр КАК Стр
        |ПОМЕСТИТЬ ВТ2
        |ИЗ
        |    &ТЗ КАК ТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ2.Стр
        |ИЗ
        |    ВТ2 КАК ВТ2
        |ГДЕ
        |    ВТ2.Стр ПОДОБНО &Шаблон";
        
        Запрос.УстановитьПараметр("ТЗ", ТЗ);
        Запрос.УстановитьПараметр("Шаблон", "[а-я][0-9][0-9][0-9][а-я][а-я]%");
1 ObjectRelation Model
 
09.02.16
11:30
(0) там не все буквы могут учавствовать, их только 12
2 Волшебник
 
модератор
09.02.16
11:30
(0) Номер региона забыл
3 Sammo
 
09.02.16
11:32
Разве монстр?
+ учти 1 + номер могут быть не российские.
4 cons74
 
09.02.16
11:37
(1) некритично в рамках задачи
(2) не забыл, а пропустил т.к. некритично
6 cons74
 
09.02.16
11:47
я имею в виду, что приходится формировать ТЗ, присваивать тип колонке, потом выбирать данные ТЗ во временную...
7 PiterPrg
 
09.02.16
11:47
(0) Я в последнее время пытаюсь приучить себя использовать регулярные выражения. Порою получается весьма элегантно :-)

Книга знаний: Использование регулярных выражений (RegExp) в 1С
8 cons74
 
09.02.16
11:50
(7) да вот хотелось без них как раз
9 PiterPrg
 
09.02.16
11:54
(8) Тогда можно твой код упростить. Зачем таблица. У тебя-же одно значение.

|ВЫБРАТЬ
| &Параметр ПОДОБНО &Шаблон

Это по-моему с 8.3.7

ВЫБРАТЬ
ВЫБОР КОГДА &Параметр ПОДОБНО &Шаблон ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ
10 Ma3eIIa
 
09.02.16
11:54
(0) норм. главное что бы работало быстро.
11 PRO100 NigGaZ
 
09.02.16
11:54
Сделать строку из всех символов которые нужны, и посимвольно перебирать проверяемую строку и искать символы в строке шаблоне?!
12 cons74
 
09.02.16
11:58
(9) во-во уже читал такое. Но у меня 8.2
13 cons74
 
09.02.16
11:59
(11) сударь знает толк в извращениях
14 PiterPrg
 
09.02.16
12:01
(12) Ну так
|ВЫБРАТЬ
|ВЫБОР КОГДА &Параметр ПОДОБНО &Шаблон ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ

Именно для этого случая. Это весть текст запроса. Запрос вернет 1 строку Там будет истина или ложь
15 rs_trade
 
09.02.16
12:31
(0) Проверяй регулярками. Нафиг запрос.
16 cons74
 
09.02.16
12:35
Регулярка конечно неплохо, но тогда надо давать права на com-соединение.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "[а-я|a-z][0-9][0-9][0-9][а-я|a-z][а-я|a-z][0-9][0-9]";
RegExp.IgnoreCase = Истина;
ИсходнаяСтрока =ПолучитьПараметр("&Параметр1") ;
Результат = RegExp.Test(ИсходнаяСтрока);


так что скорее всего останусь на (14)
17 Defender aka LINN
 
09.02.16
12:38
(14) лучше в Где перенести, не надо в выборку заглядывать будет
18 Tateossian
 
09.02.16
12:47
(8) Будь мужиком, сделай на регулярках! Там шаблон в 10 символов.
19 Tateossian
 
09.02.16
12:47
(16) Работает?
20 cons74
 
09.02.16
13:03
(19) да
21 cons74
 
09.02.16
13:03
(17) пробовал - не получилось. Может писал как-то не так.
22 PiterPrg
 
09.02.16
13:04
(16) Лучшее немного еще почитать про регулярные выражения

Там есть много интересных метасмволов

"[а-я|a-z][0-9][0-9][0-9][а-я|a-z][а-я|a-z][0-9][0-9]"

Например, вот так и короче и учитывает, что регион бывает 3-х символьный
"[а-я|a-z]\d{3}[а-я|a-z]{2}\d{2,3}"
23 cons74
 
09.02.16
13:10
(22) дай нормальный источник, а то фразу "Определяет ни одного или один символ, стоящий перед ним. Эквивалентно {0,1}." я не могу переварить.
24 Timon1405
 
09.02.16
13:41
(22) номера г000гг00 в природе нет, а у вас он подходит
25 cons74
 
09.02.16
13:46
(24) та вы што )))
26 Яплакал
 
09.02.16
14:25
(7) завязываться на виндовый механизм (в данном случаи VBScript) не камельфо. Если конечно ты пилишь какую-то конфу которая только в одной орг. используется и ты уверен что например СП 1С не повесят на линуксовый сервак, тогда можно, а для решений которые будут продаваться, это плохой подход