Имя: Пароль:
1C
1С v8
Как убрать слева в коде все нули
,
0 sidalexsandr
 
30.05.18
12:40
Подскажите алгоритм как убрать у кода слева все нули?
1 Boleev
 
30.05.18
12:42
Если в коде только числа, то привести к числу через формат
2 Малыш Джон
 
30.05.18
12:43
СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " "))," ","0")
3 aka AMIGO
 
30.05.18
12:44
(0) Код - тип строка? замени на тип "Число"
А вдруг поможет :)
4 МихаилМ
 
30.05.18
12:44
5 bolobol
 
30.05.18
12:51
А просто Число(СтрокаЛидированнаяНулями) - не прокатит?
6 Stepankov Sergei
 
30.05.18
12:53
Пока Лев(Код,1) = "0" Цикл
Код = Сред(Код,2);
КонецЦикла;
7 _stay true_
 
30.05.18
12:53
Есть в типовых общий модуль ПрефиксацияОбъектовКлиентСервер. Там уже есть готовая процедура.
8 Lexey_
 
30.05.18
12:54
(5) неа, неразрывный пробел
9 bolobol
 
30.05.18
12:55
(8) Откуда в коде пробелы?
10 bolobol
 
30.05.18
12:55
"000 000 002" ?
11 mistеr
 
30.05.18
12:59
(9) Из Экселя или из таб дока, отукда же еще.
12 Stepankov Sergei
 
30.05.18
13:00
(9) Если код больше 999 то поставит неразрывный пробел.
Например "001003" в число и обратно в строку - "1 003"
Можно исправить с помощью СТрЗаменить(Строка,Символы.НПП,""). Должно получиться.
13 sidalexsandr
 
30.05.18
13:05
Спасибо, помогло:
СимволовВСтроке = СтрДлина(ИскомаяСтрока);
КодНуля = 48;// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один
ПозицияНеНуля = 1;
Для НомерСимвола = 1 По СимволовВСтроке Цикл
    ПроверяемыйСимвол =  Сред(ИскомаяСтрока, НомерСимвола,1);
    Если КодСимвола(ПроверяемыйСимвол) <> 48 Тогда
         ПозицияНеНуля = НомерСимвола;
         Прервать;
    КонецЕсли;
КонецЦикла;

СтрокаБезВедущихнулей = Сред(ИскомаяСтрока, ПозицияНеНуля);
14 Малыш Джон
 
30.05.18
13:05
(12) :))
Формат (   , "ЧГ=0") не предлагать?))
15 Nikoss
 
30.05.18
13:07
(13), что-то выбрал самый объемный код из всех возможных
16 Segate
 
31.05.18
09:41
(12)
Стр = Строка(ЧислоСЛидирующимиНулями);
Пока Лев(Стр,1) = "0" цикл

Стр = сред(стр,2);
Конеццикла;

Возврат стр;

почему не так?
17 Segate
 
31.05.18
09:43
(16) или в конце концов(если у тебя всегда число в строке)

Стр = Формат(Число(Стр),"ЧГ=0");

Тоже должно сработать
18 Segate
 
31.05.18
09:46
Массив = стрРазделить(Стр,"0", ложь);
Стр = Сред(Стр,Стрнайти(Стр,Массив[0]));

Или вот так например тоже должно сработать, но тут не уверен...
19 unregistered
 
31.05.18
09:49
Есть же в типовых конфигурациях:

НомерБезВедущихНулей = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(НомерСНулями, "0");
20 Пес Барбос
 
31.05.18
09:51
// -- из типовой
// Удаляет лидирующие нули из номера объекта.
// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где.
// ОО - префикс организации;
// ГГ - префикс информационной базы;
// "-" - разделитель;
// ХХХ...ХХ - номер/код объекта.
//
// Параметры:
//  НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули.
//
Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт
    
    ПользовательскийПрефикс = ПользовательскийПрефикс(НомерОбъекта);
    
    Если НомерСодержитСтандартныйПрефикс(НомерОбъекта) Тогда
        
        Если НомерСодержитПятизначныйПрефикс(НомерОбъекта) Тогда
            Префикс = Лев(НомерОбъекта, 5);
            Номер = Сред(НомерОбъекта, 6 + СтрДлина(ПользовательскийПрефикс));
        Иначе
            Префикс = Лев(НомерОбъекта, 3);
            Номер = Сред(НомерОбъекта, 4 + СтрДлина(ПользовательскийПрефикс));
        КонецЕсли;
        
    Иначе
        
        Префикс = "";
        Номер = Сред(НомерОбъекта, 1 + СтрДлина(ПользовательскийПрефикс));
        
    КонецЕсли;
    
    // Удаляем лидирующие нули слева в номере.
    Номер = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Номер, "0");
    
    Возврат Префикс + ПользовательскийПрефикс + Номер;
КонецФункции
21 Segate
 
31.05.18
09:52
(20) а ты в курсе, что саму процедуру удаления нулей ты так и не показал? )))
22 unregistered
 
31.05.18
09:55
(21) А зачем?
Всё уже написано до нас. Для чего нужен еще один велосипед?
23 Timon1405
 
31.05.18
09:59
Номер ="00000000010530";
БезНулей= СтрЗаменить(СокрЛ(СтрЗаменить(Номер,0," "))," ",0);
24 Cool_Profi
 
31.05.18
10:00
(23) А просто Число("00000000010530") Что тебе даст?
25 Timon1405
 
31.05.18
10:02
(24) Число, а нужна строка)
26 Cool_Profi
 
31.05.18
10:03
(25) Продам описание функции Формат(), очень дорого.
27 Segate
 
31.05.18
10:03
(24) Выдаст ошибку очевидно же
28 Вася Теркин
 
31.05.18
10:23
Формат убирает неразрывный пробел на счет раз
29 Cool_Profi
 
31.05.18
10:30
30 bolobol
 
31.05.18
10:31
(28) Формат что-то убирает?... Мдя
31 2S
 
31.05.18
10:31
(25) в число, потом в строку
32 Малыш Джон
 
31.05.18
10:39
(30) убирает) даже больше скажу - меняет до неузнаваемости))
33 Segate
 
31.05.18
10:40
(29) Хорошо вот тебе код: "000000027корр1"

Вполне себе такой валидный код, почему нет... давай как покажи мне скриншот результата?
34 Cool_Profi
 
31.05.18
10:47
(33) Подтасовка. В изначальной постановке такого не было.
35 Segate
 
31.05.18
11:04
(34) В (0) написано: "Подскажите алгоритм как убрать у кода слева все нули?" ничего про число нет
36 Вася Теркин
 
31.05.18
11:05
(32) Я бы сказал меняет до узнаваемости
37 StanLee
 
31.05.18
11:09
(0) следующим будет вопрос "как сделать свой механизм автонумерации"? )))
38 bolobol
 
31.05.18
11:09
(32) Да неужто! А можно пруф?
39 Вася Теркин
 
31.05.18
11:10
(37) В смысле? Частное ГАИ как зарегистрировать?
40 bolobol
 
31.05.18
11:14
(35) Тогда
й= 1;
Пока СтрокаКодаЛидированнаяНулями[й] = "0" Цикл
й= й+1;
КонецЦикла;
СтрокаКодаЛидированнаяНулями= Сред(СтрокаКодаЛидированнаяНулями, й);
41 НЕА123
 
31.05.18
11:16
(23)+1
42 1Сергей
 
31.05.18
11:18
(41) там НПП не учитан
43 1Сергей
 
31.05.18
11:18
а вообще, делать вам нечего
44 Малыш Джон
 
31.05.18
11:21
(38) см. (14), (17)
45 bolobol
 
31.05.18
11:23
(44) Я пруф просил, что формат удаляет НПП. Или что-то меняет, кроме того, что по СП делает - создаёт строку определённого вида.
46 bolobol
 
31.05.18
11:25
(41), (42) Там не учитана сама задача из (0), как обратил внимание (33)
47 Малыш Джон
 
31.05.18
11:25
(45) тебе стоит яснее выражать свои мысли. телепатов, как ты знаешь, на мисте нет
48 bolobol
 
31.05.18
11:26
(47) Я вашего совета не спрашивал. Спасибо.
49 Timon1405
 
31.05.18
11:26
(45) такой пруф подойдет?
https://its.1c.ru/db/metod8dev#content:2514:hdoc:_top
50 1Сергей
 
31.05.18
11:27
(46) Человек из (0) уже давно всё решил в (13). А вы тут сопли размазываете :)
51 Малыш Джон
 
31.05.18
11:28
(48) не за что) но на будущее: ты же позволишь здесь на мисте без твоего разрешения писать?
52 novichok79
 
31.05.18
11:29
че вы сиськи мнете? все в типовых есть уже давно.
53 bolobol
 
31.05.18
11:40
(49) Там ничего про НПП нет. НПП может быть в строке, Формат преобразовывает строку?
Как написать "Сумма 1<НПП>520<НПП>руб." без НПП через формат?

(51) Если не читая вопрос - то лучше держать при себе)
54 bolobol
 
31.05.18
11:47
(52) Предлагаешь в какой-то типовой изучить километры кода вместо написания 3-х строк?
55 НЕА123
 
31.05.18
11:51
(42)
при чем НПП?
в (23) нет типа число.
56 novichok79
 
31.05.18
12:18
(54) разве там километры?
модуль ПрефиксацияОбъектовКлиентСервер
    
    // Удаляем лидирующие нули из номера объекта.
    НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта);
    
    // Удаляем префикс организации и префикс информационной базы из номера объекта.
    НомерОбъекта = УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы);
    
берем и пользуемся.
если делать самому, то обычно хватает чего-то типа этого

убираем нецифры

Пока Найти("0123456789", Лев(НомерОбъекта, 1)) = 0 Цикл
    НомерОбъекта = Сред(НомерОбъекта, 2);
КонецЦикла;

а потом убираем нули слева

Пока Лев(НомерОбъекта, 1) = "0" Цикл
    НомерОбъекта= Сред(НомерОбъекта, 2);
КонецЦикла;
57 bolobol
 
31.05.18
12:21
Даже этот пост оказалось читать дольше, чем написать все варианты кода из этой ветки. И, самое главное, зачем? Зачем это читать, если можно это написать
58 Mr_Rm
 
31.05.18
12:25
(13) вот это странное в комментарии:
// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один
59 novichok79
 
31.05.18
12:44
(57) основную прибыль 1Снику приносит работа с типовыми, так что привыкайте к размеру кода в типовых, что еще могу сказать. фирма 1С принимает односторонние решения.
60 Tateossian
 
31.05.18
12:47
Пользуй на здоровье.

RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Multiline = Истина;
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Истина;
    


    Шаблон = "([1-9]+\d*)([\/]?\d?)$";

    RegExp.Pattern = Шаблон;
    Варианты = RegExp.Execute(Номер);
    
    А = Варианты.Count-1;
    
    МассивПодстрок = Новый Массив;

    Для i=0 По Варианты.Count-1 Цикл
        Токены = Варианты.Item(i);
        Для j=0 По Токены.Submatches.Count-1 Цикл
            МассивПодстрок.Добавить(Токены.Submatches.Item(j));
        КонецЦикла
    КонецЦикла;    
    
    СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивПодстрок, "");
61 novichok79
 
31.05.18
12:48
(60) ну да, давайте лепить на каждую мелочь вызов COMОбъекта + такой код неработоспособен не в Windows или есть сервак на Linux'е.
62 Tateossian
 
31.05.18
12:49
(61) Этот код в 24 раза быстрее типовой работает.
63 Tateossian
 
31.05.18
12:50
(61) Для линухи тоже можно написать без проблем, но будем откровенны - 1С под линухой стоит у 0,005% всех пользоателей.
64 Tateossian
 
31.05.18
12:50
(61) И быстрее вот этого (56)
65 novichok79
 
31.05.18
12:51
(62) а вот это интересно. вообще хорошо бы если бы 1С запилил поддержку RegExp в 1С.
(63) вот недавно у меня как раз был такой случай.
(64) ну вообще шикарно.
66 Timon1405
 
31.05.18
14:06
(60) если уж речь за регулярки,
Шаблон = "^0+(.+)";
RegExp.Pattern = Шаблон;
Номер2= RegExp.Replace(Номер,"$1");
67 bolobol
 
31.05.18
14:23
(66) Стрелять надо за подобную китайскую грамоту в таких задачах. А других - в 1С и нет.
Станет код "Х00000000209/кр117", и как дорабатывать, чтоб "Х" тоже убирал? А я отвечу - стереть нахрен это варварство и вписать добрый, понятный и уютный овно-код
68 Timon1405
 
31.05.18
14:30
(67) зато четко по ТЗ в заголовке)
все способы решения давно известны, это лишь еще один, не претендующий на универсальность, а лишь на изящество. может быть кто-то откроет для себя replace, уже хорошо
69 kittystark
 
31.05.18
14:35
(66) "^0+" заменять на ""
70 bolobol
 
31.05.18
14:38
(68) Согласен! Но без комментариев, этот код - трэш, не более.
71 kittystark
 
31.05.18
14:41
(67),(70) поддержу всех кто использует регулярки - если знаешь их, то жить порой становится гораздо проще, чем писать простыню овно-кода
и никакой это не треш, а комментировать - да! надо!
72 bolobol
 
31.05.18
14:54
(71) Простыни написаны в 1С, которые кто-то выше предлагал найти и ж0стко заюзать. У нас код - три строки. В (66) - тоже 3 строки, но без обфускатора, дешифратора и хард-хасп-старфорс-а - не разобраться.
Тема сисек не раскрыта, щетаю.
73 kittystark
 
31.05.18
15:12
(72) а я "щетаю" что если прог не знает регулярок ему же хуже...

просто я вспоминаю свои простыни кода с мильеном "если найти() тогда" и всякими там лев/прав/сред (и не важно где это было паскаль/делфи/си/эксель/1С ) везде кода много было

спустя годы, когда с регулярками освоился, понимаю какой же я тогда был... не важно кто :)  и понимаю, что те задачи решались бы гораздо быстрее и приятнее

могу сказать, что для себя вывел "постулат" - если речь идет о поиске и модификации строк - только регулярки, хотя СтрЗаменить() и Найти() тоже испульзую, не перегибая палку с регэкспами

короче: регэкспы рулят, пипл, учите эту матчасть! чтоб легче жилось
74 Сияющий Асинхраль
 
31.05.18
15:51
(71) В пункте (2) весь код уместился в одну строку. Просто, походу, мало кто понимает как это работает, хотя, если разобраться, то код в (2) весьма даже красив...
75 Сияющий Асинхраль
 
31.05.18
15:55
+(74) Хотя, если написать код в понятном виде, то тоже будет три строки, то бишь, вариант:

СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " "))," ","0")

Можно записать так:

ТвойКод = СтрЗаменить(СокрЛП(ТвойКод), "0", " "); // меняем все нули на пробелы
ТвойКод = СокрЛ(ТвойКод); // Убираем все пробелы слева. Справа и в центре пробелы остаются
ТвойКод = СтрЗаменить(ТвойКод," ","0"); // Меняем все пробелы обратно на нули
76 bolobol
 
31.05.18
16:34
Там забыто, что пробелы изначально должны быть тоже заменены на нечто оригинальное, иначе - код, содержащий пробел, будет испорчен
77 mistеr
 
31.05.18
18:32
Ну что, ВК никто не запилит? Слабовато что-то, на регэкспах остановились...
78 Dmitry1c
 
22.06.18
13:18
ап