Имя: Пароль:
1C
1С v8
Поведение функции СтрНайти(...)
,
0 kubik_live
 
21.08.21
18:57
Поясните: (8.3.17.2231)

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

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

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

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

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

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

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

Вернуло:

Поз2=22 = как и при при поиске 3-го вхождения

Поз3=13 - полет нормальный

вывод:

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

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

ЗЫ. А ещё платформенную паузу!
15 kubik_live
 
21.08.21
20:26
(14) :))
+1
16 Кирпич
 
21.08.21
20:30
(0) Не знаю. У меня ноль возвращает. По всякому пробовал. 8.3.18

    Стр = "243245344636/01012018/001";
    Поз = СтрНайти(Стр,"/",НаправлениеПоиска.СНачала, 1, 3);
    Сообщить(Поз);     
    Поз = СтрНайти(Стр,"/",,1, 3);
    Сообщить(Поз);
    Поз = СтрНайти(Стр,"/",,,3);
    Сообщить(Поз);
[/!C]
17 hhhh
 
21.08.21
20:37
(0) у меня тоже Поз = 0

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

видимо автор что-то недоговаривает.
18 Кирпич
 
21.08.21
20:40
на 8.3.10 тоже ноль
автор, не программируй ночью
19 kubik_live
 
21.08.21
20:43
(8.3.17.2231) 64
20 kubik_live
 
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 не ноль. ага
22 brainguard
 
21.08.21
20:50
Я качаю, 4 минуты осталось
23 kubik_live
 
21.08.21
20:50
Код:    

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

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


Результат:


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

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

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

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

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

0
22
13
28 brainguard
 
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) да наркоман он
30 kubik_live
 
21.08.21
21:07
(27) Ребята, я ничего не понимаю...
Ну факт у меня!
"Ну чудес же не бывает!" ©Проф. Преображенский
31 kubik_live
 
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
32 hhhh
 
21.08.21
21:09
(30) попробуйте

    Поз4=СтрНайти(СокрЛП(ТекКод),"/",НаправлениеПоиска.СНачала,1,4);
33 hhhh
 
21.08.21
21:10
режим совместимости какой у конфигурации?
34 hhhh
 
21.08.21
21:11
и попробуйте назвать переменную не Поз, а МояПеременная
35 hhhh
 
21.08.21
21:13
(33) возможно при каком-то режиме совместимости неправильно работало
36 kubik_live
 
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
37 Aleksey
 
21.08.21
21:21
1С:Предприятие 8.3 (8.3.19.1229)
УТ10.3.71.1 (Режим совместимости Версия 8.2.13)

СтрНайти("243245344636/01012018/001","/",,,3)
возвращает 22
38 Aleksey
 
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);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Найти(Строка, ПодстрокаПоиска);
    
КонецФункции
39 kubik_live
 
21.08.21
21:25
Почистил кэш.
Не помгло
40 Aleksey
 
21.08.21
21:26
(39) Короче в УТ10 СтрНайти не платформенная хрень, а эмуляция, так что расходимся, чудес нет
41 Кирпич
 
21.08.21
21:27
я ж говорил. наркоман
42 kubik_live
 
21.08.21
21:32
(40) Спасибо.
И на кой такая хрень для УТ 10?
43 kubik_live
 
21.08.21
21:33
(41) Не кури на ночь....
44 Aleksey
 
21.08.21
21:34
(42) там же все написано "Функции обратной совместимости для эмуляции новых возможностей платформы"
45 Guk
 
21.08.21
21:34
(5) давно. ты первый год что-ли с 1С работаешь?...
46 kubik_live
 
21.08.21
21:45
(45) Обычно по жизни никогда не пользовался
параметром в СтрНайти <НомерВхождения> (необязательный)

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

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

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