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