Имя: Пароль:
1C
1С v8
Как красиво кинуть в массив
, ,
0 Coole
 
15.07.17
09:17
Номера строк из строки вида "5-15,18,40"?
1 Имитация работы
 
15.07.17
09:18
Прочитать в СП про СтрРазделить
2 Coole
 
15.07.17
09:22
ну а потом искать в массиве "-" и добавлять 6 (строку),7(строку), ..., 15?
3 Имитация работы
 
15.07.17
09:30
Именно. Потому что за применение СтрРазделить еще раз для получения границ тебя уволят.
4 Имитация работы
 
15.07.17
09:32
Ты же не хочешь писать конечный автомат пр разбору строки в один проход с анализом разделителей. Тебе лень.
5 Coole
 
15.07.17
09:34
все издев_аетесь
в общем наверное с конца буду разбирать строку
6 Имитация работы
 
15.07.17
09:35
Можешь также попробовать использовать регэкспы с именованными группами. Но ты их не осилишь и придешь кляньчить готовый код.
7 Имитация работы
 
15.07.17
09:36
(5) Сделай одолжение
8 Мимохожий Однако
 
15.07.17
09:38
(5) Сначала разбираешь по запятым, потом по черточкам. Делов-то.И не важно, с какого конца.
9 Cyberhawk
 
15.07.17
09:39
(6) Не кроссплатформенно будет
10 Имитация работы
 
15.07.17
09:41
А можно еще, кстати, xslt преобразование написать, чтобы в конце сразу получить сериализованный массив. Причем уже с преобразованными типами.
11 Asmody
 
15.07.17
09:42
(10) сейчас ты ей мозг взорвешь
12 Имитация работы
 
15.07.17
09:43
Видишь, сколько вариантов? Красота, она страшная сила!
13 D_Pavel
 
15.07.17
09:50
(0) Делаешь СтрРазделить
Пробегаешь по полученному массиву циклом
делаешь СтрРазделить на каждом элементе массива, получаешь новый массив, например [5, 15]
пробегаешь циклом от первого значения нового массива до последнего, например от 5 до 15.
Заносишь все полученные значения в результирующий массив.

Конец
14 Лефмихалыч
 
15.07.17
09:58
everybody stand back!

Массив = КрасивоКинутьВМассив("5-15,18,40");


Функция КрасивоКинутьВМассив(Строка)
    RegEx = Новый COMОбъект("VBScript.RegExp");
    RegEx.Pattern = "\d+"
    RegEx.Global = True;
    Matches = RegEx.Execute(Строка);
    
    Результат = Новый Массив;
    для i=0 по Matches.Count-1 Цикл
        Результат.Добавить(Matches.Item(i).Value);
    КонецЦикла
    
    Возврат Результат;
КонецФункции
15 Asmody
 
15.07.17
09:59
А вот можно было бы в 1С функцию параметром передавать, вышло бы все в одну строку.
16 Имитация работы
 
15.07.17
10:04
(14) 5-15 должно породить 10 элементов, а не 2
17 Имитация работы
 
15.07.17
10:06
(15) На клиенте можно. Через описание оповещения. Сначала взорвет, потом съест (:
18 Имитация работы
 
15.07.17
10:09
(13) Вот ваша лодка!
19 Лефмихалыч
 
15.07.17
10:14
(16) тогда - конечный автомат
20 Coole
 
15.07.17
10:29
СтрокаНомеров = "12-18,20,40,4,5-9";
    СтрокаНомеров = СтрокаНомеров + ",";
    ТЗСтрок = Новый ТаблицаЗначений;
    ТЗСтрок.Колонки.Добавить("НомерСтроки");
    Пока Найти(СтрокаНомеров,",") > 0 Цикл  
        ЗначЗап = Найти(СтрокаНомеров,",") - 1;
        //Стр = ТЗСтрок.Добавить();
        НомерСтроки = Лев(СтрокаНомеров,ЗначЗап);
        Если Найти(НомерСтроки, "-") > 0 Тогда
            ЗачПр =  СтрДлина(НомерСтроки) - Найти(НомерСтроки,"-");
            ЗачЛв =  Найти(НомерСтроки,"-") - 1;
            НомПр = Число(Прав(НомерСтроки, ЗачПр));
            НомЛв = Число(Лев(НомерСтроки, ЗачЛв));
            Для i = НомЛв По НомПр Цикл
                Стр = ТЗСтрок.Добавить();
                Стр.НомерСтроки = i;
            КонецЦикла;
        Иначе
            Стр = ТЗСтрок.Добавить();
            Стр.НомерСтроки = Число(НомерСтроки);
            
        КонецЕсли;
        СтрокаНомеров = Прав(СтрокаНомеров,(СтрДлина(СтрокаНомеров) -ЗначЗап-1));
    КонецЦикла;
    Если СтрДлина(СтрокаНомеров) > 0 Тогда
        Стр = ТЗСтрок.Добавить();
        Стр.НомерСтроки = Число(СтрокаНомеров);
    КонецЕсли;
21 Coole
 
15.07.17
10:31
(13) поняла, но переписывать не буду.
я так поняла массив нельзя отсортировать?
а как же, если пользователь решит сначала напечатать 5, 8, а потом 1 строку?
надо ж и напечатать в порядке возрастания 1,5,8
22 Garykom
 
гуру
15.07.17
10:38

Результат = Новый Массив();
ИсхСтр = "5-15,18,40";
РаздСтр = СтрЗаменить(ИсхСтр, ",", Символы.ПС);
КолСтрокЗапятая = СтрЧислоСтрок(РаздСтр);
Для НомЗапятая = 1 По КолСтрокЗапятая Цикл
    ТекСтр = СтрПолучитьСтроку(РаздСтр, НомЗапятая);
    ДвуСтр = СтрЗаменить(ТекСтр, "-", Символы.ПС);
    Если СтрЧислоСтрок(ДвуСтр)>1 Тогда
        ЛевСтр = Число(СтрПолучитьСтроку(ДвуСтр, 1));
        ПравСтр = Число(СтрПолучитьСтроку(ДвуСтр, 2));
        Для Ном = ЛевСтр По ПравСтр Цикл
            Результат.Добавить(Ном);
        КонецЦикла;
    Иначе
        Результат.Добавить(Число(ДвуСтр));
    КонецЕсли;
КонецЦикла;
23 Garykom
 
гуру
15.07.17
10:41
(13) Ты конечно извини но проще код написать чем словами объяснить понятно...
24 Coole
 
15.07.17
10:43
(22) если в конце ИсхСтр будет 42-45, то ошибка)
25 Garykom
 
гуру
15.07.17
10:44
(24) На что поспорим?
26 Garykom
 
гуру
15.07.17
10:49
(25)+ Единственно нуна воткнуть условие что ЛевСтр<ПравСтр
27 h-sp
 
15.07.17
10:53
(21) зачем в порядке возрастания? Если пользователь написал например "3, 2, 1", значит он хочет в этом порядке, если бы хотел по-другому, написал бы по другому.
28 Генератор
 
15.07.17
10:54
Функция ДобавитьВМассив(ЗначениеС, пЗначениеПО = 0)
    ЗначениеПо = ?(пЗначениеПО = 0,ЗначениеС,пЗначениеПО);
    Сообщить("добавляем элементы с "+ЗначениеС +" по "+ЗначениеПо);
КонецФункции    

Процедура КнопкаВыполнитьНажатие(Кнопка)
    ИсхСтр = "5-15,18,40";
    Стр = СтрЗаменить(ИсхСтр,",",");ДобавитьВМассив(");
    Стр = СтрЗаменить(Стр,"-",",");
    Стр = "ДобавитьВМассив("+Стр;
    Стр = СТр+");";
    Выполнить(Стр);
    
КонецПроцедуры
29 Garykom
 
гуру
15.07.17
11:05
(28) И ху из хЭ?
30 Генератор
 
15.07.17
11:09
(29) что не нравится? альтернативный метод, работает же )
31 Garykom
 
гуру
15.07.17
11:10
(30) Ты серьезно или прикалываешься? У тебя код не запустится этот
32 Генератор
 
15.07.17
11:11
(31) да ладно, я не поленился с обработки его скопировал
ну причесать конечно надо...
33 rphosts
 
15.07.17
11:13
(28) ну и извращенство, давайте ещё СКД сюда подтянем
34 Garykom
 
гуру
15.07.17
11:14
(32) Угадай что будет если исходная строка будет содержать хотя бы пару тысяч  "," и полтысячи "-"?
35 Garykom
 
гуру
15.07.17
11:16
(34)+ это было 1-е

А 2-е это объясни как оно будет работать в 8-ке УФ в безопасном то с этим "Выполнить" ?
36 Генератор
 
15.07.17
11:18
(34) а руками на пару тысяч строку формировать не извращение? я не претендовал на рабочий вариант, просто альтернатива. нестандартный подход...
37 Garykom
 
гуру
15.07.17
11:19
(36) Иногда так хочется таких "нестандартных" взять за шейку и ...
38 Garykom
 
гуру
15.07.17
11:19
(37)+ Судя по всему те прямая дорога в 1С в разработчики типовых... они любят нестандартных и альтернативных (я бы даже сказал одаренных)
39 D_Pavel
 
15.07.17
11:22
(21) Массиб конечно можно отсортировать, но в задании этого не было.
Твое решение слишком длинное. Если нужно действительно красиво, лучше перепиши как в (13), тогда не будет ни одной проверки, и только два цикла. Гораздо короче получится
40 Генератор
 
15.07.17
11:24
(38) что это тебя так зацепило? не, до типовых мне далеко...
41 D_Pavel
 
15.07.17
11:26
(23) Извиняю, но Coole говорит что поняла. А 1С под рукой у меня нет, я давно соскочил с 1С. Могу решение на JS написать, будет еще короче и красивее
42 h-sp
 
15.07.17
11:32
(40) объясни как твоя эта программа сделает из 5-15, массив чисел 5,6,7,8,...,15  ??
43 Генератор
 
15.07.17
11:37
(42) никак, в функцию передаются 2 параметра 5 и 15, а в ней уже делаешь что хочешь, хоть циклом обходи, я не стал расписывать
44 Злопчинский
 
15.07.17
11:39
(16) не 10, а 11
45 iceman2112
 
15.07.17
14:48
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок
46 Garykom
 
гуру
15.07.17
15:48
(45) А этот уже законченный 1Сник... который без БСП как без рук ))