|   |   | 
| 
 | Поведение функции СтрНайти(...) | ☑ | ||
|---|---|---|---|---|
| 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
 
 | |||
| 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 | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |