Имя: Пароль:
1C
1С v8
Можно ли отрезать от строки все после определенного символа без цикла?
0 DJ Anthon
 
13.02.14
17:15
А таких символов может быть несколько )
1 Wobland
 
13.02.14
17:15
возражений не имею
2 shamannk
 
13.02.14
17:16
Даже нужно!
3 Ёпрст
 
13.02.14
17:16
Сред
4 DJ Anthon
 
13.02.14
17:18
(3) а как найти-то его?
5 DJ Anthon
 
13.02.14
17:18
(1) спасибо!

я вроде накатал код при условии, что в строке нет переносов строки
6 DJ Anthon
 
13.02.14
17:19
даже в одну строчку уместился
7 KishMish
 
13.02.14
17:19
Прав(Стр, КолвоСимволов)
8 Серый Пес
 
13.02.14
17:20
(4) Сыграю в КО: функция Найти() %)
9 DJ Anthon
 
13.02.14
17:20
просто интересно, как это можно сделать по-кошерному

(7) чему КолвоСимволов равно?
10 DJ Anthon
 
13.02.14
17:21
(8) найти первый находит, а мне последний надо
11 Ненавижу 1С
 
гуру
13.02.14
17:21
Надо отрезать все после буквы А в слове КАРАНДАШ, что должно остаться?
КАРАНДА
КАРА
КА
12 Серый Пес
 
13.02.14
17:22
(10) Тогда если без цикла - то рекурсией можно.
13 DJ Anthon
 
13.02.14
17:22
КАРАНДА
14 DJ Anthon
 
13.02.14
17:23
(12) без рекурсии, без циклов, без доппеременных
15 Ненавижу 1С
 
гуру
13.02.14
17:23
(10) без цикла нельзя, мы не знаем число повторений
16 Ненавижу 1С
 
гуру
13.02.14
17:24
(14) почему так жестко?
17 Серый Пес
 
13.02.14
17:24
(14) Тогда нельзя. Проблема не в отрезать - проблема в найти последний символ. Его без цикла\рекурсии не найти.
18 DJ Anthon
 
13.02.14
17:24
(15) знаем
19 DJ Anthon
 
13.02.14
17:24
(17) я нашел
20 DJ Anthon
 
13.02.14
17:25
П = Лев(П, Найти(П + "" "", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "" "") - 2)
21 Ненавижу 1С
 
гуру
13.02.14
17:25
(18) знаем число повторений?
ну тогда тупо копипастим код заданное число раз (немного думая)
22 DJ Anthon
 
13.02.14
17:26
*при условии, что в строке нет переносов строки

здесь определенный символ "\"
23 DJ Anthon
 
13.02.14
17:26
(21) как без цикла это сделать?
24 Aprobator
 
13.02.14
17:29
ну можно конечно поизвращаться. Да и технически не особо сложно. Вот только - зачем?
25 DJ Anthon
 
13.02.14
17:31
(24) я извращенец
26 Aprobator
 
13.02.14
17:32
(25) ну тогда лови алгоритм.
27 Aprobator
 
13.02.14
17:33
(25) заменяешь в строке свой символ символом перевода строки.
Затем Пишешь все это в текстовый документ. Удаляешь последнюю строку. Получаешь текст из документа обратно, заменяешь перевод строки своим символом.
28 Aprobator
 
13.02.14
17:34
+(27) пишется через метод УстановитьТекст
29 DJ Anthon
 
13.02.14
17:36
(27) у меня проще в (20)
30 Aprobator
 
13.02.14
17:41
(20) твой метод сработает при условии, что хвостик нигде в тексте больше не повторяется. Мой метод надежнее.
31 Aprobator
 
13.02.14
17:42
(30) к (29). Хотя идея сама по себе интересная.
32 DJ Anthon
 
13.02.14
17:44
(30) у меня при выборе каталога происходит открытие написанного в поле ввода каталога, и если она уже не существует, чтоб хоть открылась ближайшая доступная, как в тотал коммандере


Процедура ПутьНачалоВыбора(Элемент, СтандартнаяОбработка)
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    ДиалогВыбораФайла.Заголовок = "Выберите каталог с файлами Excel";
    П = Путь;
    Пока СтрДлина(П) > 0 Цикл
        Каталог = Новый Файл(П);
        Если Каталог.Существует() Тогда
            ДиалогВыбораФайла.Каталог = П;
            Прервать;
        Иначе
            П = Лев(П, Найти(П + "*", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "*") - 2);
        КонецЕсли;
    КонецЦикла;
    ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;
    Если Не ДиалогВыбораФайла.Выбрать() Тогда
        Возврат;
    КонецЕсли;
    Элемент.Значение = ДиалогВыбораФайла.Каталог;
КонецПроцедуры
33 DJ Anthon
 
13.02.14
17:45
мелочь, а все равно удобнее, чем каждый раз сбиваться на Мои документы или хуже того во внутренние темпы 1Ски
34 DJ Anthon
 
13.02.14
17:46
(30) и хвостик нигде не повторится, ибо он с переносом строки
35 Aprobator
 
13.02.14
17:48
(33) каждый раз? Это с какой скоростью у вас структура каталогов то меняется? ИМХО, я бы эти м и заморачиваться не стал, даже для общего развития, лучше вон лишний раз доки перечитать.. Есть гораздо более интересные задачи.
36 DJ Anthon
 
13.02.14
17:50
(35) 150 учреждений, каталог с файлами после обработки убивается. а путь сетевой, искать его каждый раз заново трудно, ибо сеть без домена, а админ бабушка. 150 раз искать его руки времени час уйдет
37 DJ Anthon
 
13.02.14
17:51
слово "руки " - лишнее
38 Йохохо
 
13.02.14
17:52
(32) а не будет адского тупняка, если папка сетевая? а так фича мега полезная
39 Aprobator
 
13.02.14
17:53
(36)зачем убивать каталог? Можно тупо чистить содержимое.
40 DS
 
13.02.14
17:55
(32) полезная штука.
41 Torquader
 
13.02.14
17:57
Что касается каталога, то здесь явно без цикла не обойтись.
Напишу код на VbScript, чтобы все ещё раз ощутили ущербность 1С:
FileString ' здесь мы получаем строку с именем файла
Set Fso=CreateObject("Scripting.FileSystemObject")
i=InStrRev(FileString,"/",-1,vbBinaryCompare)
If i=0 Then ' оказалось, что нету у нас разделителя
MsgBox "Дано только имя файла без пути - и где же нам его найти ?",0,"Фигня, однако"
Else
FilePath=Left(FileString,i-1)
If Fso.FolderExists(FilePath)=True Then
  MsgBox "Файл находится в директории:" & FilePath,0,"Результат"
Else
  Do
   i=InStrRev(FilePath,"/",-1,vbBinaryCompare)
   If i=0 Then
    MsgBox "Для файла указан путь, который вообще не существует - может быть - это сеть ?",0,"Нет пути"
    Exit Do
   End If
   FilePath=Left(FilePath,i-1)
   If Fso.FolderExists(FilePath)=True Then
    MsgBox "Существует только часть каталога:" & FilePath,0,"Криво введён путь"
    Exit Do
   End If
  Loop
End If
End If
42 DJ Anthon
 
14.02.14
12:48
(38) проверил, вложенность 10 каталогов - секунда. наличие папки проверяется довольно-таки быстро, папка \\tsclient\C\Users\ проверялась немного дольше, около 5 секунд. но так и должно быть, ибо инет модемный.
(39) чтобы видеть, что еще не загрузили тем, кто не загружает, а ждет, пока его не загрузят )))
(41) на асме круче выглядеть будет
43 batmansoft
 
14.02.14
12:55
(0) А почему именно без цикла?
Но если хочешь поизвращаться, кури регулярные выражения
http://novichok1c.ru/ispolzovanie-regulyarnyh-vyrazheniy-v-1s
44 Вах 1-й
 
14.02.14
13:00
помню в молодости тоже изгалялся, вывод любой семерочной таблицы в ексел с заголовками полей
4 строчки молучилось, меньше не помню, толи мозгов не хватило, то ли времени...
ЗЫ помню только что надоело - и так сойдет
45 hhhh
 
14.02.14
13:05
(42) ваше (20) это нереально долго будет, циклов в ней по факту в 20 раз больше, чем в обычном простом переборе.
46 DJ Anthon
 
14.02.14
16:53
(45) не спорю, зато в строчку уместилось. конечно же, для таймкритикал-кода надо будет писать попроще. а на один раз это незаметно.
(43) давно хочу поизучать, но все руки не доходят, ибо не треба
47 m-serg74
 
14.02.14
17:18
(46) не в одну, но без цикла
    Стр1 = СтрЗаменить(ПолеВвода1, ПолеВвода2, Символы.ПС);
    Стр2 = СтрПолучитьСтроку(Стр1, СтрЧислоСтрок(Стр1));
    Сообщить(Стр2);
48 m-serg74
 
14.02.14
17:21
(17) с фига ли?
см. (47)
49 m-serg74
 
14.02.14
17:26
(48) извиняюсь (17), без доп. переменных не досмотрел
тогда только
Отрезка = СтрПолучитьСтроку(СтрЗаменить(П, "\", Символы.ПС), СтрЧислоСтрок(СтрЗаменить(П, "\", Символы.ПС)));

но это уже изврат какойто
50 m-serg74
 
14.02.14
17:30
(48) (49) сторно :))) облажался ваще... отрезать все после, а я оставил все что после, фу на меня:)
51 Torquader
 
14.02.14
21:27
(50) Некоторые программисты начинают кодить ещё до того, как заказчик прекратит произносить описание технического задания, но, к сожалению, не все из них - телепаты, поэтому, в результате получается совсем не то, что хотели.
52 Serg_1960
 
14.02.14
22:16
(50) Не расстраивайся. Зато ты теперь знаешь что и сколько надо отрезать :)
53 awa15
 
14.02.14
22:44
(32) Вместо

П = Лев(П, Найти(П + "*", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "*") - 2);

Напиши просто

П = Каталог.Путь;
54 Фокусник
 
14.02.14
23:50
(0) а потом потраченные на эту фигню часы в счёт включишь? ;)
55 DJ Anthon
 
15.02.14
21:41
(53) для себя ж делаю. чем еще заняться, пока отладка идет?
(54) у меня безлимит, заказчик платит за конечный результат фиксированную озвученную вначале сумму. а на это я потратил пару минут. просто думал, есть решение получше. в нормальных прогах же это есть.
56 ivanovnm
 
15.02.14
23:37
(0) Не используя цикла можно отрезать все после определенного первого вхождения символа в строку или после последнего.
57 ivanovnm
 
15.02.14
23:39
(20) А зачем ты что-то там в строке менял? Строку попортил. Лишние движения.
58 hhhh
 
16.02.14
00:23
(55) что-то вы не то курите. Вот же

Файл = Новый Файл(П);
П = Файл.Путь;

заметь, без всяких циклов.
59 Torquader
 
16.02.14
00:27
(58) Он хочет найти самую последнюю существующую папку, а путь вернёт всё до последнего слэша.
60 hhhh
 
16.02.14
00:36
(59) а это ведь одно и то же, то что в (0) спрашивается
61 Torquader
 
16.02.14
00:39
(60) Не факт.
Например, C:\TEMP\ВсякаяКуча\МаленькиеФайлы\ФайлСЧемТоТам.txt
должен вернуть C:\TEMP, если в директории TEMP нет папки ВсякаяКуча.
62 hhhh
 
16.02.14
00:47
(61) ну можно (58) в цикле запустить, буде на 4 строчки больше
63 DJ Anthon
 
16.02.14
12:53
(62) это типа, сами топите урановые ломы в ртути? Е)
64 Torquader
 
16.02.14
15:57
(63) Просто, если какой-то папки в пути нет, то файл гарантированно не создастся, как бы мы там этот путь не резали. Конечно, можно посоздавать папки.
Например, команда Mkdir прекрасно умеет создавать вложенные папки.
То есть для неё (58) вполне достаточно - получил путь до файла, если его нет, то попробовал создать - если создать не получилось, то кто-то в пути написал то, что там использовать нельзя.

P.S. Урановые во ртути, говорите, что же у вас за планета такая, что другое не тонет ?
65 sda553
 
16.02.14
16:02
Храните строки в виде суффиксного дерева
66 Torquader
 
16.02.14
16:22
(65) Вообще-то, если делать всё правильно, то проблемы выбора строки - это проблема программистов, реализующих диалог выбора файла.
В строке выбора файла от 1С-ника нужно только по кнопке выбора открыть этот диалог.
67 DJ Anthon
 
16.02.14
16:23
(64) ну еще чего, создавать... я не выгружаю, а загружаю, просто путь к папке далекий, каждый раз его не охота открывать, тем боле по сети. а при выгрузке создавать путь - это правильно.
(65) какого дерева?
68 Aprobator
 
19.02.14
13:44
(42) да пофиг. Эта папка все равно ложиться постоянно в какую то подпапку - храни путь на нее и все.
69 YXMbIJI
 
19.02.14
14:13
Во выстрадал ))
Стр = "C:\TEMP\ВсякаяКуча\МаленькиеФайлы\ФайлСЧемТоТам.txt";

Сообщить(Лев(Стр, СтрДлина(Стр) - СтрДлина(СтрПолучитьСтроку(СтрЗаменить(Стр, "\", Символы.ПС), СтрЧислоВхождений(Стр, "\") + 1))));
70 DJ Anthon
 
19.02.14
22:35
(69) твой код короче на два символа и немного безопаснее (нет символа "*"), ты круче ;)


тем, кто спрашивает, нафига - вот его еще одно применение

Процедура НачалоПериодаПриИзменении(Элемент)
    Попытка
        ПолноеИмяФайла = Лев(ПолноеИмяФайла, СтрДлина(ПолноеИмяФайла) - СтрДлина(СтрПолучитьСтроку(СтрЗаменить(ПолноеИмяФайла, "\", "" ""), СтрЧислоВхождений(ПолноеИмяФайла, "\") + 1))) + СтрЗаменить(ПредставлениеПериода(НачалоДня(НачалоПериода), КонецДня(КонецПериода), "ФП = Истина"), " г.", "") + ".xml";
    Исключение
    КонецПопытки
КонецПроцедуры


автосмена имени файла выгрузки при смене периода, например
71 ЧашкаЧая
 
19.02.14
23:15
Чего только не придумают чтобы не учить регэкспы.
72 Torquader
 
20.02.14
11:58
(71) Ну, если бы всё было так просто - иногда - решение через RegExp тоже не поражает прозрачностью - а перебор в цикле решает любые задачи, конечно, если строка не бесконечная.