Программирование 1с программист

06.12.2010

Записать/Разбить строку в массив

На практике при работе над загрузкой, обработкой строковых данных часто возникает задача записать-разбить строку в массив. Для того чтобы реализовать перевод строки в массив обычно используют операторы цикла, код получается громоздкий. Я попытался значительно упростить процедуру и по возможности ускорить.

Вот как выглядит моя функция

Функция МассивИзСтроки(ПереданнаяСтрока, Разделитель)
СтрокаДанных = ПереданнаяСтрока;
ЧислоВхождений = СтрЧислоВхождений(СтрокаДанных, Разделитель);
СтрокаДанных = СтрЗаменить(СтрокаДанных, Разделитель,"""},{""S"",""");
СтрокаДанных = "{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{" + СтрЗаменить(ЧислоВхождений+1,Символы.НПП,"") + ",{""S"",""" + СтрокаДанных + """}}}";

Возврат ЗначениеИзСтрокиВнутр(СтрокаДанных);
КонецФункции

Суть её заключается в том, чтобы преобразовать строку к внутреннему представлению объектов системы и затем из неё собрать массив, через служебную функцию ЗначениеИзСтрокиВнутр.

Также я обратил внимание и на  UIID «51e7a0d2-530b-11d4-b98a-008048da3034», как оказалось именно он присваивается массивам в 1с предприятии, проверял на платформе 8.0 и 8.1. Использование сгенерированного UIID функцией новый УкникальныйИдентификатор() приводит к ошибке.

В предприятии для преобразования 1с массив в строку используется типовая процедура «РазложитьСтрокуВМассивПодстрок(Строка, Разделитель)» где строка – это строка которая раскладывается/преобразуется в массив, а разделитель содержит символы, которыми разделяется строка.

Я провел некоторые опыты по замеру производительности. Сделал строку разделенную тысячью запятыми и провел опыт в преобразовании такой строки в массив, и в результате я получил отставание типовой процедуры от моей.

Замер типовой функции

Замер типовой функции

Замер моей функции

Замер моей функции

Обработка строки состоящей из 100 000 запятых моей функцией выполнялось 15 секунда, таповую функцию я прервал когда прошло 15 минут. Возможно на практике не будет таких объемов данных, и в таком случаи производительность этих двух функций будет одинакова и поэтому вам решать чем лучше пользоваться.

Комментарии (4) »

  1. Можно еще через regexp:
    http://www.forum.mista.ru/topic.php?id=511906

    Комментарий by Gamm — 08.12.2010 @ 16:33

  2. Реализаций данной задачки думаю большое множество, но использование RegExp это уже VBScript, а я же привел ускорение типового алгоритма, средствами только 1с

    Комментарий by Мозг — 09.12.2010 @ 10:31

  3. Не понял как её в 8.2 заставить работать.
    Вроде все тоже самое а не пашет:(

    Комментарий by Gamm — 09.12.2010 @ 20:03

  4. Все достаточно просто

    Функцию определяем выполнение на сервере

    &НаСервере
    Функция МассивИзСтроки(ПереданнаяСтрока, Разделитель)

    КонецФункции

    Вызываем её из процедуры клиента, например процедуры поле ввода

    &НаКлиенте
    Процедура КомандаПолеВвода(Команда)
    // Вставить содержимое обработчика.
    МассивНаКлиенте = МассивИзСтроки(текстПолеВвода,»,»);
    Предупреждение(МассивНаКлиенте.Количество());
    КонецПроцедуры

    Запустил, и все работает.

    Комментарий by Мозг — 09.12.2010 @ 22:44

RSS-лента комментариев к этой записи. TrackBack URL

Оставить комментарий

Для отправки комментария вы должны авторизоваться.

Powered by WordPress