Имя: Пароль:
1C
1C 7.7
v7: Функция обработки спецсимволов
↓ (Волшебник 08.01.2025 18:28)
0 Маленький Вопросик
 
naïve
04.01.25
14:40
Товарищи, у меня еще к вам один вопрос:

Подскажите пожалуйста "готовую" функцию по обработки строки со спецсимволами - такими как кавычки, например

Спасибо!

Речь идет о 7.7 (обработка json) СтрЗаменить - как-то не правильно применять наверное?
1 Волшебник
 
04.01.25
14:45
СтрЗаменить нормально
2 Lazy Stranger
 
04.01.25
14:49
Чем СтрЗаменить не нравится? Мне кажется там больше ничего и не придумать.

Функция ИсправитьКавычки(стр) Экспорт  
    стр=СтрЗаменить(стр, "\","\\");
    стр=СтрЗаменить(стр, "/","\/");
    Возврат СтрЗаменить(СокрЛП(стр),"""","\""");
КонецФункции
3 DiMel_77
 
04.01.25
15:19
(0)
Что то типа такого:
Функция ЗаменитьНедопустимыеСимволы(Знач Текст, СимволЗамены)

Итог = "";
ДлинаСтроки = СтрДлина(Текст);

Для НомерСимвола = 1 По ДлинаСтроки Цикл
    Символ = Сред(Текст, НомерСимвола, 1);
    КодСимвола = КодСимв(Символ);
    
    Если (КодСимвола < 9)
        Или ((КодСимвола > 10)  И (КодСимвола < 13))
        Или ((КодСимвола > 13)  И (КодСимвола < 32))
        Или ((КодСимвола > 55295) И (КодСимвола < 57344)) Тогда
        
        Символ = СимволЗамены;
        
    КонецЕсли;

    Итог = Итог + Символ;

КонецЦикла;

Возврат Итог;

КонецФункции

4 mishaPH
 
05.01.25
17:09
(0) имеешь в виду функцию изоляции символов?
5 Гена
 
04.01.25
16:02
Более красиво на мой вкус в одной строке: внутри - СтрРазделить (по спецсимволам), а снаружи - СтрСоединить (по заменному символу)

Без циклов и Если )
6 Гена
 
04.01.25
16:21
т.е. сначала нарезаем бастурму по испачканным кольцам и тут же соединяем через кусочки лаваша...

Просто мне не нравится перебирать по каждой букве "Войну и мир". Может во всём романе только пару раз корректор не заметил символа "..й!" )
7 Маленький Вопросик
 
naïve
04.01.25
16:51
Вообще я воспользовался немного модифицированной функцией:

Функция УбратьЛишниеСимволы(Строка1) Экспорт
	НовСтрока = "";
	ПравильныеСимволы = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю";
	Для Сч = 1 по СтрДлина(Строка1) Цикл
		ТекСимв = Сред(Строка1, Сч, 1);
		Если Найти(ПравильныеСимволы, ТекСимв) > 0 Тогда
			НовСтрока = НовСтрока + ТекСимв;
		КонецЕсли;
	КонецЦикла;
	
	Возврат НовСтрока;
	
КонецФункции    
8 Волшебник
 
04.01.25
16:52
(7) Вы отлично срезали все пробелы!
9 Маленький Вопросик
 
naïve
04.01.25
16:54
(8) защита от копипаста
10 Волшебник
 
04.01.25
17:00
(9) Ваша функция нахер никому не нужна. Тем более в ней нет буквы Ё
11 Волшебник
 
04.01.25
17:23
Я ещё добавлю, что Ваше презрительное
>> защита от копипаста

не сочетается с сабжем:
>> Подскажите пожалуйста "готовую" функцию по обработки строки со спецсимволами - такими как кавычки, например

Отсюда я делаю вывод, что Вы не тот, за кого себя выдаёте.
12 Волшебник
 
04.01.25
18:15
Смотри, как это делается в 21 веке. (копипаст он тут запрещает...)

промт:
На языке 1С напиши функцию УбратьЛишниеСимволы(Строка)
где лишними считаются все, кроме:
- буквы [a-z][A-Z][а-я][А-Я]
- пробел
- обычные знаки препинания (точка, запятая, скобки и т.п.)

Кавычку " замени на \"


Вот пример реализации функции УбратьЛишниеСимволы на языке 1С:

Функция УбратьЛишниеСимволы(Строка)
    // Создаем строку, содержащую разрешенные символы
    РазрешенныеСимволы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ .,(){}[]?!:;-";

    // Заменяем кавычку на \"
    Строка = СтрЗаменить(Строка, """", "\"");

    // Перебираем каждый символ в строке
    ОчищеннаяСтрока = "";
    Для Индекс = 1 По СтрДлина(Строка) Цикл
        Символ = Сред(Строка, Индекс, 1);
        Если Найти(РазрешенныеСимволы, Символ) > 0 Тогда
            // Если символ разрешён, добавляем его в очищенную строку
            ОчищеннаяСтрока = ОчищеннаяСтрока + Символ;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ОчищеннаяСтрока;
КонецФункции
13 Djelf
 
04.01.25
18:19
(11) Он хотел сказать что иногда при копипасте пролезают непечатные симоволы, ниже 32, они не адекватно работают в 7.7
Достаточно заменить символы <32 и усе будет хорошо.
(12) Это из пушки по воробьям.
14 MWWRuza
 
05.01.25
17:30
Хм... Как у вас все просто...
Мы же до конца не знаем задачу ТС... Да, если нужно просто вырезать все непечатные символы - то все так.

Но, иногда, их нужно сохранить в строках, не смотря на то, что 1с77 это не умеет... (точнее, умеет, в строку в ДБФку можно чего угодно запихнуть, но первое же ТиИ их грохнет). Как частный пример - марки Честного Знака. Они содержат разделители GS1, которые есть в строках марок, и иногда их надо хранить в справочнике... Но, низяяя... Точнее, можно до первого ТиИ.
Поэтому, строку марки можно обработать такой функцией:

Функция УбратьСпецСимволы(СтрМарки)
	Стр	= СтрЗаменить(СтрМарки, Симв(29), "(GS1)");
	Возврат Стр;	
КонецФункции


А потом, когда нужна полная строка со всеми "кракозябрами", напрмер для передачи в ККТ, преобразовать обратно:

КТН = СтрЗаменить(СокрЛП(ОбрДок.КТН), "(GS1)", Симв(29));


Это частный случай, именно для марок с GS1, но, принцип я думаю понятен - если нужно сохранить спецсимволы, а не просто их убрать - то меняем их на что-то печатное, а при использовании - преобразовываем обратно, по коду символа.
15 Волшебник
 
05.01.25
17:08
(14) Вот именно! Из автора получится великолепный партизан! На вопрос "Сколько у вас танков?!" он будет твердить "My name is John Connor"
16 Fedor-1971
 
08.01.25
09:14
(12) а цифры? 0-9 и прочее (№, *, &, @ и т.д.)
17 Волшебник
 
08.01.25
11:19
(16) ах, да, цифры забыл
18 MWWRuza
 
08.01.25
11:40
См. (13) там Djelf все правильно отписал, и проще, и не забудешь ничего.
19 Fedor-1971
 
08.01.25
12:16
(18) Не проще, при выгрузке в XML для обмена с 1С8 можно получить нечитаемый файл (будут вываливаться всякие ошибки, типа, недопустимый символ ...), при том, что сам XML корректный
Решение - оставить только корректные символы, остальные убрать
20 MWWRuza
 
08.01.25
12:29
(19) Хм... Еще раз перечитал всю тему, но так и не нашел, где там написано "XML для обмена с 1С8"... Как я понял, там нужен JSON - "(обработка json)", при чем, не известно для чего...
21 Fedor-1971
 
08.01.25
12:33
(20) Это я пояснил чем лучше перечень допустимых символов перед заменой только некоторых по коду, как в (13)
22 Гена
 
08.01.25
12:56
(21) Моё мнение противоположное. Во многих языках некоторые буковки со своими шапочками - замучаешься в список разрешённых вносить. Проще составить список запрещённых и пополнять этот "вектор" на конкретной практике.
23 Волшебник
 
08.01.25
13:01
(22) Проще составить список разрешённых, потому что в запрещённых могут оказаться десятки тысяч символов, включая невидимые японские пробелы нулевой ширины (реальный случай из опыта). wiki:Пробел_нулевой_ширины
24 Гена
 
08.01.25
13:11
(23) На выбор пользователя, какой механизм ему нужен.
Если важно, чтобы функция всегда отрабатывала, но при этом не исключена вероятность пропуска чего-то, не заданного в разрешении - то вектор разрешений.

Если же неважна стопудовая отработка, но при этом ничего точно не пропустишь - то вектор запрещений. При вылете - довнос символа в список.
25 Злопчинский
 
08.01.25
13:46
(22) шапочки называются "умляуты". в русском тоже такие буквы есть - й, ё в  белорусском, например, кроме отсутствующих в русском - есть i и "у нескладовае" (у с шапочкой как у й)
26 Djelf
 
08.01.25
16:01
(23) Невидимые японские пробелы нулевой ширины в клюшках? оО
27 Волшебник
 
08.01.25
17:11
(26) Они могут оказаться в любых строках, скопированных из интернета.
28 Djelf
 
08.01.25
17:42
(27) И как ты копиипастом такое сделпаешь? Для клюшек, разумеется.
Решение в (13 было озучено).

На самом деле (0), как я прочитал в парралельных темах автора(0), нужно просто одиночную ковычку на двойную заменить.
Телепатировать сложно...
29 Волшебник
 
08.01.25
17:58
(28) Да всё уже понятно. Не надо передо мной расстилаться. Вся семёрка должна сдохнуть и чем быстрее, тем лучше.
30 Djelf
 
08.01.25
18:22
Зачем оскобляешь в (29)? Я тебе не подстилка. Соблюдай корректность своих постов.
31 Волшебник
 
08.01.25
18:23
(30) иди ты нахуй
32 Волшебник
 
08.01.25
18:28
и решение своё в (13) засунь себе в жопу. ГОВНОКОД!
33 Гена
 
08.01.25
18:49
(28) Тогда решение в (5):
текст = СтрСоединить(СтрРазделить(текст,"'"),""");
34 Волшебник
 
08.01.25
18:53
(33) Гена, это семёрка
35 Гена
 
08.01.25
18:55
(34) А какая разница... не помню, но там же вроде были аналогичные функции )
36 Волшебник
 
08.01.25
18:58
(35) Гена, Вы не помните, потому что их там не было!
37 Djelf
 
08.01.25
19:07
(31) Уточните на какой конкретно, а то я могу перепутать.
(32) А где там был код? Проспись уже, зожник...
38 Волшебник
 
08.01.25
19:35
(37) О, меня уже обвиняют, что я зожник... Мир сошёл с ума.
2 + 2 = 3.9999999999999999999999999999999...