Имя: Пароль:
1C
1С v8
Быстрый способ обработки Таблиц значений, Массивов
,
0 13_Mult
 
28.03.14
11:21
Добрый день!
Есть с первого взгляда не тривиальная задача. Полученный запросом из сторонней базы массив (либо таблица значений)содержит очень много колонок и строк со значением с типом строка. В этих строках есть куча "рандомных" пробелов до и после текста.
Вопрос: Какой способ наиболее быстрый для удаления всех пробелов в Массиве и ТаблицеЗначений.
СокрЛП в цикле не рассматривается.
Может есть какие сторонние компоненты для быстрой обработки сразу всего Массива/ТЗ.
Далее полученный результат будет использоваться в запросе.
1 H A D G E H O G s
 
28.03.14
11:21
СокрЛП в цикле
2 Heckfy
 
28.03.14
11:22
А что мешает сразу при получении данных из сторонней базы обрезать пробелы?
3 Ненавижу 1С
 
гуру
28.03.14
11:23
"Полученный запросом из сторонней базы"

в некоторых сторонних базах есть функция TRIM
4 13_Mult
 
28.03.14
11:23
(1) Долго
5 13_Mult
 
28.03.14
11:24
(2) Каким образом
(3) У 1С к сожалению нет такой
6 13_Mult
 
28.03.14
11:25
(3) Прямое подключение не дают сделать
7 13_Mult
 
28.03.14
11:27
В javascript есть replace(/\s/g, '') но это работает со строками (
8 Ненавижу 1С
 
гуру
28.03.14
11:28
(6) "Полученный запросом из сторонней базы массив"
ну как-то же его получили
9 13_Mult
 
28.03.14
11:29
В VBScript RegExp.Replace тоже не примет массив
10 13_Mult
 
28.03.14
11:29
(8) Через COM
11 Ненавижу 1С
 
гуру
28.03.14
11:30
(10) через COM из другой базы 1С что ли?
12 13_Mult
 
28.03.14
11:30
(8) я имел в виду к SQL не дают
13 13_Mult
 
28.03.14
11:31
(11) Так точно
14 fvadim
 
28.03.14
11:32
(9) а если скормить многострочный текст, т.е. каждую колонку лепить в одну строку и скармливать регэкспу?
15 vvp91
 
28.03.14
11:34
>> (0) Вопрос: Какой способ наиболее быстрый для удаления всех пробелов в Массиве и ТаблицеЗначений.
Самый быстрый - не удалять вообще.

>> (0) Далее полученный результат будет использоваться в запросе.
А как "результат" или оригинальная ТЗ будет использоваться в запросе?
16 13_Mult
 
28.03.14
11:34
(14) тогда уж и СокрЛП в цикле по времени не больше займет
17 fvadim
 
28.03.14
11:35
(16) а сколько сокрлп занимает времени?
18 13_Mult
 
28.03.14
11:36
(15) Либо Менеджером либо параметром Список
19 H A D G E H O G s
 
28.03.14
11:36
(16) СокрЛП () для строк COM таблицы?
20 13_Mult
 
28.03.14
11:37
(17) 4,5 минут
21 H A D G E H O G s
 
28.03.14
11:38
(16) Вызывай функцию ОМ сторонней базы, которая вернет уже обрезанную таблицу
22 H A D G E H O G s
 
28.03.14
11:38
(20) Бред.
23 13_Mult
 
28.03.14
11:38
(19) )) нет конечно
24 13_Mult
 
28.03.14
11:38
(22) нет не бред!
25 13_Mult
 
28.03.14
11:39
(22) Иначе не запрашивал мнения общественности
26 13_Mult
 
28.03.14
11:41
(21) Тогда она там обрезать их долго будет
27 H A D G E H O G s
 
28.03.14
11:45
(26) Покажи код, как режешь
28 13_Mult
 
28.03.14
11:46
Я спрашиваю не про штатные 1с методы. А про обработку массивов другими, не 1совскими методами. (внешние компоненты например)
29 13_Mult
 
28.03.14
11:48
(27) Пока ни ка не режу. ТЗ перебирать, обрезать и обратно совать в ТЗ не вариант - долго.
30 H A D G E H O G s
 
28.03.14
11:48
(28) Помоему, ты штатные методы криво используешь.
31 13_Mult
 
28.03.14
11:50
Пробовал даже так

RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Pattern = " ";
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Истина;
    Для Каждого Стр Из Результат Цикл
        ИсходнаяСтрока = Стр.КодГ;
        RegExp.Replace(ИсходнаяСтрока, "");
        НовСтр = ТЗ.Добавить();
        НовСтр.КодНорм = RegExp.Replace(ИсходнаяСтрока, "");
    КонецЦикла;

также долго как и СокрЛП().
32 fvadim
 
28.03.14
11:53
(31) оно ж все пробелы убирает, не?
33 13_Mult
 
28.03.14
11:54
(32) да, именно это и надо.
34 13_Mult
 
28.03.14
11:54
Текст "Литой" без разделителей
35 Heckfy
 
28.03.14
11:55
(33) Вы уж определитесь, все или только с концов?
36 13_Mult
 
28.03.14
11:57
(35) В (0) написано "для удаления всех пробелов в Массиве и ТаблицеЗначений"
))
37 fvadim
 
28.03.14
11:58
(36) к чему тогда был упомянут СокрЛП ?
38 13_Mult
 
28.03.14
12:00
Как то я пользовался компонентой GameWithFire.ADOUtils
она очень быстро в ТЗ засовывает из огромных таблиц excel.

Вот бы что то вроде неё для работы с массивами
39 Heckfy
 
28.03.14
12:01
А сколько значений в ТЗ или Массиве возвращается?
40 13_Mult
 
28.03.14
12:03
(37) а у 1С есть ещё методы сократить пробелы у строки? (СтрЗаменить не в счет)
41 13_Mult
 
28.03.14
12:04
ушел на обед
42 Heckfy
 
28.03.14
12:06
(41)  Пля... Ты взорвал мне моск... Приятного аппетита. И, лучше не возвращайся. :)
43 13_Mult
 
28.03.14
12:19
(42) есть у меня одна мысль. На стороне базы источника запилить СКД механизм получения таб документа и через построитель запроса получить ТЗ. Вроде как пробелы там должны обрезаться. Изврат конечно но попробовать надо.
44 H A D G E H O G s
 
28.03.14
12:26
(43) Что мешает там тупо получить ТЗ и обрезать ее?
45 kiruha
 
28.03.14
12:30
(0)
В 8.3 писали что существенно улучшена работа со строками
Также вроде как появились регуляры
46 13_Mult
 
28.03.14
12:30
(44) Если бы был метод обрезать целиком ТЗ то не было бы вопросов, а резать по одной строке долго.
47 ChiginAV
 
28.03.14
12:31
(0) А нельзя в сторонней базе хранить данные без этих самых "рандомных" пробелов до и после текста?
48 13_Mult
 
28.03.14
12:31
(45) надо глянуть (8.3 особо не пользовал)
49 trad
 
28.03.14
12:35
(0)
проверь такую идею

&НаСервере
Функция СокрЛП_ТЗ(ТЗ)
    Строка = ЗначениеВСтрокуВнутр(ТЗ);
    Пока Найти(Строка,"{""S"","" ")>0 Цикл
        Строка = СтрЗаменить(Строка,"{""S"","" ","{""S"",""");
    КонецЦикла;
    Пока Найти(Строка," ""}")>0 Цикл
        Строка = СтрЗаменить(Строка," ""}","""}");
    КонецЦикла;
    ТЗ=ЗначениеИзСтрокиВнутр(Строка);
    Возврат ТЗ;
КонецФункции
50 13_Mult
 
28.03.14
12:36
(47) У меня вообще сомнения что в ней дадут что то сделать. Так бы я в той базе убил бы все пробелы, запретил бы их ставить и нет проблем )). Поэтому и бьёмся.
51 ChiginAV
 
28.03.14
12:43
(50) Ну тогда прямой SQL запрос с REPLACE
52 13_Mult
 
28.03.14
12:54
(49) Спасибо, Функция конечно зачетная (ни когда так не пробовал ;)). К сожалению тоже долго, циклы.

(51) Ах, если бы дали доступ )). Там свои враждебно настроенные сидят ))

Наверно будем пробивать доступ к серверу сиквела.
Пока отдам как есть. Будут говорить долго - скажу давайте доступ к серверу.

Всем спасибо за предложения!
53 fvadim
 
28.03.14
12:55

м = Новый Массив;
Для Индекс = 1 По 1000000  Цикл
    м.Добавить("  ааа  ");
КонецЦикла;

s = ЗначениеВСтрокуВнутр(м);
Для каждого э Из м Цикл
    э = СокрЛП(э);
КонецЦикла;

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;

RegExp.Pattern = " +";
s=RegExp.Replace(s, "");

м2 = ЗначениеИзСтрокиВнутр(s);



3    м = Новый Массив;    0
4    Для Индекс = 1 По 1000000  Цикл    5,79
5    м.Добавить("  ааа  ");    7,56
6    КонецЦикла;    6,15
8    s = ЗначениеВСтрокуВнутр(м);    1,45
9    Для каждого э Из м Цикл    7,25
10    э = СокрЛП(э);    6,43
11    КонецЦикла;    5,09
13    RegExp = Новый COMОбъект("VBScript.RegExp");    0
15    RegExp.MultiLine = Истина;    0
16    RegExp.Global = Истина;    0
17    RegExp.IgnoreCase = Истина;    0
19    RegExp.Pattern = " +";    0
20    s=RegExp.Replace(s, "");    0,93
22    м2 = ЗначениеИзСтрокиВнутр(s);    1,78
23    КонецПроцедуры    0
54 fvadim
 
28.03.14
12:58
Расшифрую
СокрЛП 1000000 элементов
7,25 6,43 5,09 - 18.77%

Замена по всему массиву регулярным выражением
1,45 0,93 1,78 - 4.16 %
55 13_Mult
 
28.03.14
13:07
(53) (54) Точно, как я сам не догадался после чтения (49)
Спс. Наверно так и сделаю.
Еще раз всем СПС, тему можно закрывать.
56 13_Mult
 
28.03.14
13:08
Ушел тестить.
Программист всегда исправляет последнюю ошибку.