Имя: Пароль:
1C
1С v8
Перебор символов
0 Nykos
 
05.09.13
17:17
Помогите, пожалуйста, написать условие, при котором строка вида "4.10.1"
будет преобразована в "0410010000". Т.е. так, чтобы до точки или между точками или после точки было два символа. Если один символ - дополнять нулем слева до двух символов. Теоретически как это сделать понимаю, а практически ну никак добиться не могу(
1 Абыр
 
05.09.13
17:21
Найти
2 Абыр
 
05.09.13
17:21
СтрДлина
3 Абыр
 
05.09.13
17:21
Сред
4 Nykos
 
05.09.13
17:23
извини, но мне так совершенно ничего не понятно
5 Абыр
 
05.09.13
17:24
Find
6 Абыр
 
05.09.13
17:24
StrLen
7 Абыр
 
05.09.13
17:24
Mid
8 Euguln
 
05.09.13
17:25
(4) хочешь готовый алгоритм?
9 KishMish
 
05.09.13
17:25
(4) СтрЗаменить
10 Euguln
 
05.09.13
17:25
(4) Типовая конфа есть под рукой?
11 Жан Пердежон
 
05.09.13
17:26
Если условие="4.10.1" тогда условие="0410010000" КонецЕсли;
12 palpetrovich
 
05.09.13
17:27
а что, всем понятно как получилиь "0000" в конце?
13 giallo
 
05.09.13
17:27
(0) Если ИСТИНА Тогда
14 Euguln
 
05.09.13
17:30
(12) элементрано, это если будет строка "4.10.1.0.0"
15 manyak
 
05.09.13
17:30
разбиваешь строку на многострочную через стрзаменить
СтрЗаменить (<Исходная строка>, <Искомое значение>, <Значение для замены>)
Символы.ПС
дальше цикл и вперед
16 МойКодУныл
 
05.09.13
17:30
(12) телепатирую - остаток символов до нужной длины заполнить нулями справа :)
17 manyak
 
05.09.13
17:33
(15) и в цикле юзай формат - сделаешь лидирующие нули
18 МойКодУныл
 
05.09.13
17:33
(15) ага, типа того: //без нулей в конце

        СтрокаКОбработке =  СтрЗаменить(ИсхСтрока,".", Символы.ПС);
    ИтогСтрока = "";
    
    Для Сч = 1 По СтрЧислоСтрок(СтрокаКОбработке) Цикл
        ТекСтрока = СтрПолучитьСтроку(СтрокаКОбработке, Сч);

        Пока СтрДлина(ТекСтрока)<2 Цикл
            ТекСтрока = "0" + ТекСтрока;
        КонецЦикла;
        
        ИтогСтрока = ИтогСтрока + ТекСтрока;     
        
    КонецЦикла;
19 palpetrovich
 
05.09.13
17:35
(18)
МнСтр = СтрЗаменить(ИсходнаяСтрока,".",Символы.ПС);
РезСтрока = "";
Для н=1 По СтрЧислоСтрок(МнСтр) Цикл
РезСтрока = РезСтрока + Прав("0"+СтрПолучитьСтроку(МнСтр,н),2);
КонецЦикла
20 palpetrovich
 
05.09.13
17:35
короче типа :)
21 МойКодУныл
 
05.09.13
17:37
(20)а если символов 3 между точками - потеряем один:). Хотя, может так и надо, заказчик не описал в ТЗ=))
22 manyak
 
05.09.13
17:38
новая_строка=перебор_символов("4.10.1");
23 Nykos
 
05.09.13
17:38
(21) нет, символьный формат максимум такой: xx.xx.xx
24 Nykos
 
05.09.13
17:39
(21) ну и варьируется - где один, где два
25 Nykos
 
09.09.13
14:07
в общем вышло что-то такое, ошибок не находит в коде, но и при выполнении внешней обработки в справочнике ничего не происходит

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос("ВЫБРАТЬ
    | Прейскурант.Ссылка
    |ИЗ
    | Справочник.Прейскурант КАК Прейскурант");
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        Объект = Результат.Ссылка.ПолучитьОбъект();
        стр = Объект.НомерРасценки;

        с = ""; тмп = "";
        Пока СтрДлина(стр) > 0 Цикл
            Если Лев(стр, 1) = "." Тогда
                с = с + ?(СтрДлина(тмп) = 2, тмп, ?(СтрДлина(тмп) = 1, "0" + тмп, "00"));
                тмп = "";
            Иначе
                тмп = тмп + Лев(стр, 1);
            КонецЕсли;
            стр = Прав(стр, СтрДлина(стр) - 1);
        КонецЦикла;
        с = с + ?(СтрДлина(тмп) = 2, тмп, ?(СтрДлина(тмп) = 1, "0" + тмп, "00"));
                Объект.Записать();
    КонецЦикла;
      ЭтаФорма.Обновить();
КонецПроцедуры


что я упустил?
26 Rie
 
09.09.13
14:11
(25) Как минимум - чтение документации по Найти, Лев и Сред.
Ну и по ВыборкаИзРезультатаЗапроса за компанию.
27 Nykos
 
09.09.13
16:00
Почитал. Осознал. Сделал.
28 Infsams654
 
09.09.13
16:26
(27) можно проще, если типовая. Там есть Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")
29 Odavid
 
09.09.13
16:28
А слабо любому из вас сделать перебор в запросе? ))
30 Infsams654
 
09.09.13
17:20
(29) ну-ну - делать больше нечего. (28) - наибыстрейше
31 Nykos
 
09.09.13
18:12
В общем, не знаю, рационально или нет, но результат получил нужный)

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос("ВЫБРАТЬ
    | Прейскурант.Ссылка
    |ИЗ
    | Справочник.Прейскурант КАК Прейскурант");
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        Объект = Результат.Ссылка.ПолучитьОбъект();
        стр = Объект.НомерРасценки;
        
        с = ""; тмп = "";
        Пока СтрДлина(стр) > 0 Цикл
            Если Лев(стр, 1) = "." Тогда
                с = с + ?(СтрДлина(тмп) = 2,тмп,?(СтрДлина(тмп) = 1,"0" + тмп, "00"));
                тмп = "";
            Иначе
                тмп = тмп + Лев(стр, 1);
            КонецЕсли;
            стр = Прав(стр, СтрДлина(стр) - 1);
        КонецЦикла;
        с = с + ?(СтрДлина(тмп) = 2, тмп, ?(СтрДлина(тмп) = 1, "0" + тмп, "00"));
        Объект.НомерРасценки = с;
        Объект.Записать();
    КонецЦикла;
    ЭтаФорма.Обновить();
КонецПроцедуры
32 Rie
 
09.09.13
18:18
(31)
Пока Результат.Следующий() Цикл
    стр = Объект.НомерРасценки;
    числа = Новый Массив;
    поз = Найти(стр,".");
    Пока поз>0 Цикл
        числа.Добавить(Число(Лев(стр,поз-1)));
        стр = Сред(стр,поз+1);
        поз = Найти(Стр,".");
    КонецЦикла;
    Если НЕ ПустаяСтрока(стр) Тогда
        числа.Добавить(Число(стр));
    КонецЕсли;
    // и вот тут делаешь с числа всё, что тебе заблагорассудится
КонецЦикла;
33 Зойч
 
09.09.13
18:19
Вместо этого
34 Зойч
 
09.09.13
18:20
?(СтрДлина(тмп) = 2, тмп, ?(СтрДлина(тмп) = 1, "0" + тмп, "00"));
лучше
Прав("00" + тпм, 2)
35 Infsams654
 
09.09.13
18:21
(31) Гы... Еще раз нажми КнопкаВыполнитьНажатие(Кнопка)
36 Murzz
 
09.09.13
18:30
вот так думаю проще и быстрее будет

Строка = "4.10.1";

м = ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{0,{""S"",""" + СтрЗаменить(СтрЗаменить(Строка, """", """"""), ".", """},{""S"",""") + """}}}");
Результат = "";
Для Каждого э Из м Цикл
    Результат = Результат+ Прав("00" + э, 2);
КонецЦикла;    

сообщить(Результат);
37 DS
 
09.09.13
19:08
(36) Не проще и не быстрее (19).
38 Infsams654
 
09.09.13
19:14
(36) не надо выкрутасов. не врубишся.
Надо по простому, чтоб было понятно.
Самое простое:
Получить массив из строки через РазложитьСтрокуВМассивПодстрок

Если в массиве 3 элемента, то для каждого сделать
ЭлементМассива = Прав("0" + ЭлементМассива, 2);
если нет,
то уже преобразовано, либо что-то кривое (тут отдельные разборки)

Потом вернуть сцеплением через точку массив обратно в строку
39 Infsams654
 
09.09.13
19:19
(38) блин, посмотрел начало, там без точки надо.
Тогда
"Потом вернуть сцеплением всех элементов массива обратно в строку"
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой