Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Поведение функции СтрНайти(...)

Поведение функции СтрНайти(...)
Я
   kubik_live
 
21.08.21 - 18:57
Поясните: (8.3.17.2231)

Стр="243245344636/01012018/001";

Поз=СтрНайти(Стр,"/",,,3);

Возвращает Поз=22;

А я думал, что Поз будет 0.
Где я не прав?
   kubik_live
 
1 - 21.08.21 - 19:00
(1) Т.е если нет 3-го вхождения в строке поиска в данной ситуации, то должно вернуть 0.

Или что-то я не догоняю?
   Новый1сник2
 
2 - 21.08.21 - 19:03
тоже интересно, думал СтрНайти должно возвращать истину или ложь, по факту возвращала номер найденной строки
   Guk
 
3 - 21.08.21 - 19:04
это фича...
   kubik_live
 
4 - 21.08.21 - 19:04
(2) Глобальный контекст (Global context)
СтрНайти (StrFind)
Доступен, начиная с версии 8.3.6 (в режиме совместимости с версией 8.3.6 и последующими).
Синтаксис:
СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Исходная строка.
<ПодстрокаПоиска> (обязательный)
Тип: Строка.
Искомая подстрока.
<НаправлениеПоиска> (необязательный)
Тип: НаправлениеПоиска. 
Указывает направление поиска подстроки в строке.
Значение по умолчанию: СНачала.
<НачальнаяПозиция> (необязательный)
Тип: Число.
Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка "Неверное значение параметра".
<НомерВхождения> (необязательный)
Тип: Число.
Указывает номер вхождения искомой подстроки в исходной строке.
Значение по умолчанию: 1.
Возвращаемое значение:
Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
   kubik_live
 
5 - 21.08.21 - 19:05
(3) Давно обнаружена?
   Новый1сник2
 
6 - 21.08.21 - 19:08
(4) а как быть, если требуется условие и дальнейшие действия, почему СтрНайти не возвращает булево ?. пришлось конечно переписать условие, но осадочек остался.
   kubik_live
 
7 - 21.08.21 - 19:10
(6) Ещё раз:

Возвращаемое значение:
Тип: Число.
   Новый1сник2
 
8 - 21.08.21 - 19:16
(7) да я с тобой не спорю, просто как то не привычно. если задаю условие СтрНайти, хотелось бы получить Истина или Ложь, а возвращает номер строки, что не логично
   Новый1сник2
 
9 - 21.08.21 - 19:18
+ причем, этот номер строки нафиг не нужен, или строка найдена или нет
   kubik_live
 
10 - 21.08.21 - 19:20
(9) Как раз и нужен ... и не номер строки, а позиция в строке
   Новый1сник2
 
11 - 21.08.21 - 19:23
(10) для чего нужен? если нужен результат, или нашел строку или нет
   kubik_live
 
12 - 21.08.21 - 19:26
Поз2=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,2);
        
        Поз3=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,1);

// на всякий случай указал явно параметры


Вернуло:

Поз2=22 = как и при при поиске 3-го вхождения
Поз3=13 - полет нормальный

вывод:

Если нет более вхождений, то возвращает позицию максимального вхождения символов поиска в строке.
   kubik_live
 
13 - 21.08.21 - 19:49
Модератору:

Исправьте пожалуйста заголовок на: "Поведение функции СтрНайти(...)"
   ДенисЧ
 
14 - 21.08.21 - 19:54
(8) А мне хотелось бы писать Новая ТаблицаЗначений или Новое ДеревоЗначений...

ЗЫ. А ещё платформенную паузу!
   kubik_live
 
15 - 21.08.21 - 20:26
(14) :))
+1
   Кирпич
 
16 - 21.08.21 - 20:30
(0) Не знаю. У меня ноль возвращает. По всякому пробовал. 8.3.18
[1C]
    Стр = "243245344636/01012018/001";
    Поз = СтрНайти(Стр,"/",НаправлениеПоиска.СНачала, 1, 3);
    Сообщить(Поз);     
    Поз = СтрНайти(Стр,"/",,1, 3);
    Сообщить(Поз);
    Поз = СтрНайти(Стр,"/",,,3);
    Сообщить(Поз);
[/!C]
   hhhh
 
17 - 21.08.21 - 20:37
(0) у меня тоже Поз = 0

1С:Предприятие 8.3 (8.3.18.1208)

видимо автор что-то недоговаривает.
   Кирпич
 
18 - 21.08.21 - 20:40
на 8.3.10 тоже ноль
автор, не программируй ночью
   kubik_live
 
19 - 21.08.21 - 20:43
(8.3.17.2231) 64
   kubik_live
 
20 - 21.08.21 - 20:46
+(19) соврал, 32 бит
   Кирпич
 
21 - 21.08.21 - 20:49
(20) да врешь ты всё. ктоб там прям взял и переписал функция специально для 8.3.17. с какого перепугу.
в 8.3.10 ноль, в 8.3.18 ноль, а в 8.3.17 не ноль. ага
   brainguard
 
22 - 21.08.21 - 20:50
Я качаю, 4 минуты осталось
   kubik_live
 
23 - 21.08.21 - 20:50
Код:    

    Поз=0;
        
        Сообщить( СокрЛП(ТекКод));
        
        Поз=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,3);
        
        Сообщить(Поз);
        
        Поз2=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,2);
        
        Сообщить(Поз2);

        
        Поз3=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,1);
        
        Сообщить(Поз3);


Результат:


243245344636/01012018/001
22
22
13
   kubik_live
 
24 - 21.08.21 - 20:52
Внешняя обработка, ОФ
   hhhh
 
25 - 21.08.21 - 20:59
(24) наверно Сообщить глючит. А СтрНайти нормально работает.
   kubik_live
 
26 - 21.08.21 - 21:01
(25) Отладчиком сначала смотрел.

Накой мне пи.. (брехать)

Вот полный код (тестовая ВнОбр для УТ 10.3.71.1):

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    НомераГТД.Код,
                 |    НомераГТД.РегистрационныйНомер,
                 |    НомераГТД.Представление,
                 |    НомераГТД.Ссылка
                 |ИЗ
                 |    Справочник.НомераГТД КАК НомераГТД";
    
    ПромТЗ=Запрос.Выполнить().Выгрузить();
    
    Пром=0;
    
    Для каждого СтрТЗ Из ПромТЗ Цикл
        
        ТекКод=СтрТЗ.Код;
        
        Поз=0;
        
        Сообщить( СокрЛП(ТекКод));
        
        Поз=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,3);
        
        Сообщить(Поз);
        
        Поз2=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,2);
        
        Сообщить(Поз2);

        
        Поз3=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,1);
        
        Сообщить(Поз3);
        
    КонецЦикла;    
    
    // Вставить содержимое обработчика.

КонецПроцедуры
   hhhh
 
27 - 21.08.21 - 21:04
(24) ваш код дает

0
22
13
   brainguard
 
28 - 21.08.21 - 21:05
(23) Скачал 8.3.17.2231. Выполнил в ОФ такой код:

        ТекКод="243245344636/01012018/001";
        Поз=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,3);
        
        Сообщить(Поз);
        
        Поз2=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,2);
        
        Сообщить(Поз2);

        
        Поз3=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,1);
        
        Сообщить(Поз3);

Результат
0
22
13
   Кирпич
 
29 - 21.08.21 - 21:06
(28) да наркоман он
   kubik_live
 
30 - 21.08.21 - 21:07
(27) Ребята, я ничего не понимаю...
Ну факт у меня!
"Ну чудес же не бывает!" ©Проф. Преображенский
 
 
   kubik_live
 
31 - 21.08.21 - 21:08
243245344636/01012018/001
22
22
13
10206090/050915/0005793
16
16
9
10206090/170916/0005973
16
16
9
10206082/030910/0004104
16
16
9
10206082/200412/0003476
16
16
9
10210100/090316/0006339/10
24
16
9
   hhhh
 
32 - 21.08.21 - 21:09
(30) попробуйте
    Поз4=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,4);
   hhhh
 
33 - 21.08.21 - 21:10
режим совместимости какой у конфигурации?
   hhhh
 
34 - 21.08.21 - 21:11
и попробуйте назвать переменную не Поз, а МояПеременная
   hhhh
 
35 - 21.08.21 - 21:13
(33) возможно при каком-то режиме совместимости неправильно работало
   kubik_live
 
36 - 21.08.21 - 21:15
(33) Версия 8.2.13
Управление торговлей, редакция 10.3
10.3.71.1

(32)
243245344636/01012018/001
22
22
22
13
10206090/050915/0005793
16
16
16
9

(34) Не помогло:

243245344636/01012018/001
22
22
22
13
   Aleksey
 
37 - 21.08.21 - 21:21
1С:Предприятие 8.3 (8.3.19.1229)
УТ10.3.71.1 (Режим совместимости Версия 8.2.13)

СтрНайти("243245344636/01012018/001","/",,,3)
возвращает 22
   Aleksey
 
38 - 21.08.21 - 21:25
(36)
ИнтеграцияИСУТКлиентСерверГлобальный

/////////////////////////////////////////////////////////////////////////////////////////

//
//  Функции обратной совместимости для эмуляции новых возможностей платформы

//  Удалить лишние при необходимости
//

////////////////////////////////////////////////////////////////////////////////////////


Функция СтрНайти(Знач Строка,
    Знач ПодстрокаПоиска,
    Знач НаправлениеПоиска = Неопределено,
    Знач НачальнаяПозиция = 0,
    Знач НомерВхождения = 1) Экспорт
    
    Если НаправлениеПоиска = "СКонца" Тогда
        ПеревернутаяСтрокаПоиска = "";
        ПеревернутаяПодстрокаПоиска = "";
        Для й=1 По СтрДлина(Строка)Цикл 
            ПеревернутаяСтрокаПоиска = Лев(Строка,1) + ПеревернутаяСтрокаПоиска;
            Строка = Сред(Строка,2);
        КонецЦикла;
        Для й=1 По СтрДлина(ПодстрокаПоиска)Цикл 
            ПеревернутаяПодстрокаПоиска = Лев(ПодстрокаПоиска,1) + ПеревернутаяПодстрокаПоиска;
            ПодстрокаПоиска = Сред(ПодстрокаПоиска,2);
        КонецЦикла;
        
        Если НачальнаяПозиция > 0 Тогда 
            НачальнаяПозиция = СтрДлина(ПеревернутаяСтрокаПоиска) + 1 - НачальнаяПозиция;
        КонецЕсли;
        
        РезультатПоискаВПеревернутойСтроке = СтрНайти(ПеревернутаяСтрокаПоиска, ПеревернутаяПодстрокаПоиска,,НачальнаяПозиция, НомерВхождения);
        
        Если РезультатПоискаВПеревернутойСтроке = 0 Тогда 
            Возврат 0;
        Иначе 
            Возврат СтрДлина(ПеревернутаяСтрокаПоиска) - СтрДлина(ПеревернутаяПодстрокаПоиска) - РезультатПоискаВПеревернутойСтроке + 2;
        КонецЕсли;
        
    КонецЕсли;
    
    Если ПодстрокаПоиска = "" Тогда
        Возврат 1;
    КонецЕсли;
    
    Если НачальнаяПозиция = 0 Тогда 
        НачальнаяПозиция = 1;
    КонецЕсли;
    
    Если НачальнаяПозиция > 1 Тогда
        РезультатПоиска = СтрНайти(Сред(Строка, НачальнаяПозиция), ПодстрокаПоиска, НаправлениеПоиска,,НомерВхождения);
        Если РезультатПоиска = 0 Тогда
            Возврат 0;
        Иначе
            Возврат НачальнаяПозиция - 1 + РезультатПоиска;
        КонецЕсли;
    КонецЕсли;
    
    Если НомерВхождения > 1 Тогда
        Вхождение1 = Найти(Строка, ПодстрокаПоиска);
        Если Вхождение1 > 0 Тогда
            Возврат Вхождение1 + СтрНайти(Сред(Строка,Вхождение1 +1),ПодстрокаПоиска,НаправлениеПоиска,,НомерВхождения - 1);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Найти(Строка, ПодстрокаПоиска);
    
КонецФункции
   kubik_live
 
39 - 21.08.21 - 21:25
Почистил кэш.
Не помгло
   Aleksey
 
40 - 21.08.21 - 21:26
(39) Короче в УТ10 СтрНайти не платформенная хрень, а эмуляция, так что расходимся, чудес нет
   Кирпич
 
41 - 21.08.21 - 21:27
я ж говорил. наркоман
   kubik_live
 
42 - 21.08.21 - 21:32
(40) Спасибо.
И на кой такая хрень для УТ 10?
   kubik_live
 
43 - 21.08.21 - 21:33
(41) Не кури на ночь....
   Aleksey
 
44 - 21.08.21 - 21:34
(42) там же все написано "Функции обратной совместимости для эмуляции новых возможностей платформы"
   Guk
 
45 - 21.08.21 - 21:34
(5) давно. ты первый год что-ли с 1С работаешь?...
   kubik_live
 
46 - 21.08.21 - 21:45
(45) Обычно по жизни никогда не пользовался
параметром в СтрНайти <НомерВхождения> (необязательный) 

Решил упростить себе жизнь! :))))))

Всем спасибо, А Aleksey - ОГРОМНОЕ!
   kubik_live
 
47 - 21.08.21 - 21:55
(40) Интересно: а есть гарантия, что таких "эмуляторов" 1С больше не нарисует ещё где-нибудь?
Вот забава будет! :)))
   Злопчинский
 
48 - 21.08.21 - 21:58
(2) я валяюсь, возврат номера позиции - так еще с 77 есть, предок - Найти(СтрГдеИщем,СтрЧтоИщем).
   kubik_live
 
49 - 21.08.21 - 22:07
(48) Мне нужна была 3-я позиция.
Обычно я всегда рекурсией пользовался. отсекая с помощью Найти(СтрГдеИщем,СтрЧтоИщем), если надо было найти нужное по порядку вхождение.
А в УТ 10.3 попал!
   kubik_live
 
50 - 21.08.21 - 22:09
Резюме: СтрНайти(..) в УТ 10.3 с параметрами пользоваться опасно!
   Aleksey
 
51 - 21.08.21 - 22:13
(47) подобные забавы были ещё в те времена когда вышла платформа 8.1 с функции Значение Заполнено. Возможно и ранее, но это первое что приходит на ум. Так что как видишь нет оснований считать, что 1с так больше не будет делать
   kubik_live
 
52 - 21.08.21 - 22:21
(51) Точно, было такое!

Просто не хочется время тратить  на отладчик по поводу и без повода отрабатывать поведение "предопределенные процедуры и функции языка 1С"
   brainguard
 
53 - 22.08.21 - 00:23
(51) А что там было, не напомните?
   Aleksey
 
54 - 22.08.21 - 08:49
(53) Тоже самое что и здесь " Функции обратной совместимости для эмуляции новых возможностей платформы"
ЗначениеЗаполнено это новая фишка платформы, но она активно использовалась в 8.0 через эмуляцию
Ну и, соответственно, вылазили всякие радости, когда к примеру в одной конфиги обработка работала, в другой нет
   ДедМорроз
 
55 - 22.08.21 - 09:08
Я такие "эммуляторы" сам писал,т.к.режим совместимости убирает новое.
   Ненавижу 1С
 
56 - 22.08.21 - 10:37


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.