powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / 1С 7.7 Разборка очень большой строки
18 сообщений из 18, страница 1 из 1
1С 7.7 Разборка очень большой строки
    #39175101
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня.

Сразу скажу, что я не спец по 1С и сильно не пинайте.
Столкнулся с такой проблемой.
Написал .dll для работы с сторонней БД.
Из БД получаю в переменную (допустим Строка) 1С большую строку с разделителями (можно любые)
10 000 подстрок почти мгновенно !
Когда дело доходит до разборки на подстрок - тормоза жуткие ...
Я понял, что все упирается в размер основной строки, чем больше - тем медленее
Как это побороть ?
Использую в 1С функцию:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Функция Поле(Стр, Разделитель, Позиция) Экспорт
     Если Позиция < 1 Тогда Возврат Стр; КонецЕсли; 
     Поз = 0; Значение = ""; 
     Если СтрЧислоВхождений(Стр, Разделитель) = 0 Тогда 
          Возврат Стр; 
     ИначеЕсли СтрЧислоВхождений(Стр, Разделитель) + 1 < Позиция Тогда 
          Возврат ""; 
     КонецЕсли; 
     Для ы = 1 По СтрДлина(Стр) Цикл 
          Значение = Значение + Сред(Стр, ы, 1); 
          Если Сред(Стр, ы, 1) = Разделитель Тогда 
               Поз = Поз + 1; 
               Если Поз = Число(Позиция) Тогда
                    Возврат Лев(Значение, СтрДлина(Значение)-1); 
               Иначе Значение = ""; 
               КонецЕсли; 
         КонецЕсли; 
     КонецЦикла; 
     Возврат Значение; 
КонецФункции



Спасибо.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39175119
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,

Ну клюшки со строками работали весьма паршиво. Мы обходили это впихивая нужное в xml или dbf. С txt большого размера к сожалению тоже беда, хотя и не такая как в вашем варианте.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39175166
Bone serpent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,

Говнокод, он и в 7.7 говнокод.
Попробуйте примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Функция Поле(Стр, Разделитель, Позиция) Экспорт
     Перем времСтр, КолвоПодстрок;
     Если Позиция < 1 Тогда 
          Возврат Стр;
     Иначе
          времСтр = СтрЗаменить(Стр, Разделитель, РазделительСтрок);
          КолвоПодстрок = СтрКоличествоСтрок(времСтр);
          Если КолвоПодстрок = 1 Тогда
               Возврат Стр;
          ИначеЕсли  Позиция > КолвоПодстрок Тогда
               Возврат ""; 
          Иначе
               Возврат СтрПолучитьСтроку(времСтр, Позиция);
          КонецЕсли;
     КонецЕсли;
КонецФункции
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39175186
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bone serpent,
Спасибо.
Уже быстрее.
Попробую счс с массивом, но знаю что и здесь просвета не видать...
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39175625
Bone serpent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,

Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла. Как я понимаю, строка длинная, разделителей много и функция Поле() вызывается много раз для одной и той же строки. И каждый раз происходит один и тот же СтрЗаменить().
Возможно выгоднее бы оказалось строку делить на "слова" один раз при чтении из базы. На многострочный текст. Или список значений. Тут уже тестировать надо, что выгоднее.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39175680
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bone serpent,
мне кажется имеет большое значение как планируется эту строку потом использовать
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39176666
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bone serpent,
Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла

Так и сделал. Отдал эту функцию разбора .dll, сформировав одномерный массив.
Потом на стороне 1С перебираю . 10 000 строк пару секунд. Красота...

Спасибо.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39177667
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuBone serpent,
Дальше можно вынести "тяжелую" операцию разбиения длинной строки на "слова" по разделителю за пределы цикла

Так и сделал. Отдал эту функцию разбора .dll, сформировав одномерный массив.
Потом на стороне 1С перебираю . 10 000 строк пару секунд. Красота...

Спасибо.Тоесть отдельная dll выполняет математику? А код обращения к dll можно посмотреть?
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39177673
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загрузка в список значений работает вполне сносно:
СписокЗнач.ИзСтрокиСРазделителями("1,2,3,""Аа"",""Бб""");
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39177859
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что интересно .
За пределами 1С в .dll (сделано на VB ) вывел и функцию разбора строки ...
Результат меня ошеломил !
Работает как пуля !
Вот мне и обьясните почему так ?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
' VB
Public Function Поле(chars As String, delimiter As String, position As Long)
Dim current As Long, length As Long
Dim count As Long
Dim back As String
    If position < 1 Then
        Поле = ""
        Exit Function
    End If
    ReDim Where(0 To position + 1) As Long
    Where(0) = 1
    current = 1
    length = Len(delimiter)
    For count = 1 To position
        Where(count) = InStr(current, chars, delimiter)
        If Where(count) = 0 Then Where(count) = Len(chars) + 1
        current = Where(count) + Len(delimiter)
    Next count
    If position = 1 Then
        length = 0
    End If
    If (Where(position) = Where(position - 1)) Then
        back = ""
    Else
        back = Mid(chars, (Where(position - 1) + length), (Where(position) - Where(position - 1) - length))
    End If
    Поле = back
End Function


Код: vbnet
1.
2.
3.
4.
// в 1C
Для cik=1 По m.ПолучитьРазмер1() Цикл
   Сообщить(m.Поле(m.ПолучитьПараметр1(),"|",cik)); 
КонецЦикла;


А все это загрузить в ТЗ + дополнительный разбор подстрок - секунда !
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 sc = 0;  
     Для i = 0 По m.ПолучитьРазмер1() Цикл 
	 sc = sc + 1;
	 ТЗТМП.НоваяСтрока(sc);
	 ret1 = (m.ПолучитьМассив1(i)); 
     ТЗТМП.УстановитьЗначение(sc,"Nr",m.Поле(ret1,"\",1)); 
     ТЗТМП.УстановитьЗначение(sc,"NrTab",m.Поле(ret1,"\",2)); 
	 ТЗТМП.УстановитьЗначение(sc,"FIO",m.Поле(ret1,"\",3));
     ТЗТМП.УстановитьЗначение(sc,"CodFisc",m.Поле(ret1,"\",4)); 
     ТЗТМП.УстановитьЗначение(sc,"AnNs",m.Поле(ret1,"\",5)); 
     ТЗТМП.УстановитьЗначение(sc,"Sex",m.Поле(ret1,"\",6));
     ТЗТМП.УстановитьЗначение(sc,"Adresa",m.Поле(ret1,"\",7)); 
     ТЗТМП.УстановитьЗначение(sc,"CPAS",m.Поле(ret1,"\",10));
	 ТЗТМП.УстановитьЗначение(sc,"Ceh",m.Поле(ret1,"\",11));
	 КонецЦикла; 
     ТЗТМП.Выгрузить(ТЗ); //ТЗ-называние таблицы(см. свойства)

...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39177896
Последний выдох ГПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неявная типизация + тормозной интерпритатор
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39178004
Bone serpent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,

Причин множество. Одна из них описана в http://infostart.ru/public/14299/
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183293
Gena Letchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в VB есть функция Split(строка, разделитель) = массив из строк
Join(Массив, разделитель) = строка

Зачем изобретать велосипед. Массивы самые быстрые и в vb и 1с
Есть аналог Split в 1с - РазбитьСтрокуНаМассивПодтрок - как-то так.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183346
Gena Letchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть разница в передаче параметров в функции/процедуры
В VB по-умолчанию ByVal( по значению - это как Знач 1с), а в 1с по-умолчанию ByRef(по ссылке)
попробуйте:
Функция Поле(Знач Стр = "", Знач Разделитель = " ", Знач Позиция = 0) Экспорт
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183468
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena Letchik,
Попробуйте разобрать СТРОКУ 6 Мгб средствами 1с 7.7
Примерно 100 000 подстрок с разделителями "|"
плюс разобрать подстроку - еще 10 полей с разделителем "\"
И смотрите сколько это времени будет.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183500
Gena Letchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
на VB это можно сделать проще, имхо
Код: vbnet
1.
2.
3.
4.
5.
i = Split(Строка6МБ, " ")
For n=0 to UBound(i)
	c = Split(i(n), "\")

Next n
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183515
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena Letchik,
Так разговор об этом шел с самого начало ... за пределами 1С
Я ниже писал.
...
Рейтинг: 0 / 0
1С 7.7 Разборка очень большой строки
    #39183596
Gena Letchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,

ну )) так я вам и говорю, что можно еще ускорить VB-код и упростить, а так же и попробовать ускорить 1с передавая значение а не ссылку и определять тип параметра значением по-умолчанию. Насчет 7,7 не знаю, в общем, может сработать.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / 1С 7.7 Разборка очень большой строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]