gifts2017

Мои функции для работы со строками

Опубликовал 1 C (devtob) в раздел Программирование - Практика программирования

Здесь представлены мои функции для работы со строками в 1С.
//===============================================================================
//                               РАБОТА СО СТРОКАМИ (СТР) И МНОГОСТРОЧНЫМИ СТРОКАМИ (МСТР)
//===============================================================================

Функция __естьПрефикс( строкаИсточник, Префикс) Экспорт
    Если __пустаяСтрока(Префикс) или __пустаяСтрока(строкаИсточник) или СтрДлина(Префикс) > СтрДлина(строкаИсточник) Тогда Возврат ложь; КонецЕсли;
   
    длинаСтр = СтрДлина(Префикс);
   
    Возврат Лев(строкаИсточник, длинаСтр)=Префикс;
КонецФункции

Функция __естьПостфикс( строкаИсточник, Постфикс ) Экспорт
    Если __пустаяСтрока(Постфикс) или __пустаяСтрока(строкаИсточник) или СтрДлина(Постфикс) > СтрДлина(строкаИсточник) Тогда Возврат ложь; КонецЕсли;
   
    длинаСтр = СтрДлина(Постфикс);
   
    Возврат Прав(строкаИсточник, длинаСтр)=Постфикс;
КонецФункции

Функция __получитьПодстроку(строкаИсточник, индексНачала, длинаПодстроки) Экспорт
    Возврат Сред( строкаИсточник, индексНачала, длинаПодстроки);
КонецФункции

Функция __удалитьПодстроку(строкаИсточник, подстрока) Экспорт
      строкаИсточник = СтрЗаменить( строкаИсточник, подстрока, "");
КонецФункции

Функция __удалитьПодстрокуПоИндексу(строкаИсточник, индексНачала, длинаПодстроки) Экспорт
    строка11="";  строка21="";  строка12="";  строка22="";
    __разделитьСтрокуПоИндексу(строкаИсточник, индексНачала, строка11, строка21);
    __разделитьСтрокуПоИндексу(строкаИсточник, индексНачала + длинаПодстроки, строка12, строка22);
   
    строкаИсточник = строка11 +  строка22;
КонецФункции
 
Функция __вставитьПодстроку(строкаИсточник, подстрока, индескНачала) Экспорт
     строка1=""; строка2="";
     Если Неопределено =__разделитьСтрокуПоИндексу(строкаИсточник, индескНачала, строка1, строка2) Тогда Возврат Неопределено; КонецЕсли;
     
     строкаИсточник = строка1 + подстрока + строка2;
   
     Возврат Истина;
КонецФункции


//возврат: две части, строки
Функция __разделитьСтрокуПоИндексу( строкаИсточник, индескНачалаРазделения, строка1, строка2 ) Экспорт
     Если индескНачалаРазделения > СтрДлина(строкаИсточник) Тогда Возврат Неопределено; КонецЕсли;

     строка1 = Лев(строкаИсточник, индескНачалаРазделения);
     строка2 = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индескНачалаРазделения +1 );
     
     Возврат Истина;
КонецФункции

//возврат: две части, строки
Функция __разделитьСтрокуПоПодстроке( строкаИсточник, ПодстрокаРазделения, строка1, строка2 ) Экспорт
     Если СтрДлина(ПодстрокаРазделения) > СтрДлина(строкаИсточник) или СтрДлина(ПодстрокаРазделения) = (СтрДлина(строкаИсточник)+1) Тогда Возврат Неопределено; КонецЕсли;
     
     индекс = __получитьИндексСтрокиПоСимволу(строкаИсточник, ПодстрокаРазделения);
     строка1 = Лев(строкаИсточник, индекс);
     строка2 = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индекс - СтрДлина(ПодстрокаРазделения) +1 );
     
     Возврат Истина;
     
КонецФункции


//возврат: при исключении возврат Неопределено
Функция __получитьСимволСтрокиПоИндексу( строкаИсточник, индекс) Экспорт
     Возврат ?(индекс>СтрДлина(строкаИсточник), Неопределено, Сред(строкаИсточник, индекс, 1));
КонецФункции

//возврат: при исключении возврат Неопределено
Функция __получитьИндексСтрокиПоСимволу( строкаИсточник, символ) Экспорт
     индекс = Найти(строкаИсточник, символ);
     Возврат ?(индекс=0, Неопределено, индекс);
КонецФункции

//возврат: при исключении возврат Неопределено, иначе подстрока
Функция __получитьПодстрокуПоСимволуИсключению(строкаИсточник, индексНачалаСканирования, символИсключения) Экспорт
    Если (индексНачалаСканирования+СтрДлина(символИсключения)) > СтрДлина(строкаИсточник) Тогда Возврат Неопределено; КонецЕсли;
   
    строка = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индексНачалаСканирования +1);
    подстрока ="";
   
    Если СтрДлина(символИсключения) > 1 Тогда
       
        следСтрока = __получитьПодстроку(строка, 1, СтрДлина(символИсключения));
        Пока не __пустаяСтрока(следСтрока) Цикл
            Если следСтрока<>символИсключения Тогда подстрока = подстрока + следСтрока; Иначе Прервать; КонецЕсли;
           
             __удалитьПодстрокуПоИндексу(строка, 1, СтрДлина(следСтрока) );
            следСтрока = __получитьПодстроку(строка, 1, СтрДлина(символИсключения));
        КонецЦикла;
    //   
    Иначе         
        Для н=1 По СтрДлина(строка) Цикл
            символ = __получитьСимволСтрокиПоИндексу(строка, н);
            Если символ<>символИсключения Тогда подстрока = подстрока + символ; Иначе Прервать; КонецЕсли;
           
        КонецЦикла;
       
    КонецЕсли;
   
   
    Возврат подстрока;
КонецФункции

//возврат: при исключении возврат Неопределено
Функция __удалитьСимволСтрокиПоИндексу( строкаИсточник, индекс) Экспорт
    длинаСтр = СтрДлина(строкаИсточник);
    Если индекс>длинаСтр Тогда Возврат  Неопределено; КонецЕсли;
   
     левСтр = Лев(строкаИсточник, индекс -1 );
     правСтр = Прав(строкаИсточник, длинаСтр - индекс);
     стр = левСтр + правСтр;
     
     Возврат стр;
 КонецФункции
 
//возврат: многострочная строка
//
Функция __получитьМСтроку( строкаИсточник, строкаРазделитель, строкаИсключения=Неопределено, ПовторятьСтрокуРазделителя=Ложь )  Экспорт
    стр = СтрЗаменить( строкаИсточник, строкаРазделитель, Символы.ПС);
    резСтр = "";
   
    Если Неопределено=строкаИсключения Тогда Возврат стр; КонецЕсли;
   
    //исключение заданной строки из многострочной строки
    колво =  СтрЧислоСтрок(стр);
    Для н=1 По колво Цикл
         текСтр = СтрПолучитьСтроку(стр, н);
         Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(резСтр, текСтр);
            Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(резСтр, текСтр); КонецЕсли;
         КонецЕсли;
         
    КонецЦикла;

    Возврат резСтр;
КонецФункции

//раскладывает на подстроки
//возврат: массив подстрок
Функция __получитьСтрокуВМассив(строкаИсточник, строкаРазделитель, строкаИсключения=Неопределено, ПовторятьСтрокуРазделителя=Ложь) Экспорт
    массив = Новый Массив;
    стр = строкаИсточник;
   
    ДлинаРазделителя = СтрДлина(строкаРазделитель);
    Пока истина Цикл
        Поз = Найти(Стр, строкаРазделитель);
        Если Поз=0 Тогда
            текСтр = Стр;
            //
            Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); 
            Иначе
                Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли;
            КонецЕсли;
            //
            Возврат массив;
        КонецЕсли;
        текСтр = Лев(Стр, Поз-1);
        //
        Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); 
        Иначе
            Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли;
        КонецЕсли;
        //
        Стр = Сред( Стр, Поз+ДлинаРазделителя );
    КонецЦикла;
   
    Возврат массив;
КонецФункции

Функция __этоМСтрока(строкаИсточник) Экспорт
     Возврат ( Найти(строкаИсточник, Символы.ПС)<>0 );
КонецФункции


Функция __получитьМСтрокуВМассив(строкаИсточник, строкаИсключения=Неопределено)Экспорт
    массив = Новый Массив;

    колво =  СтрЧислоСтрок(строкаИсточник);
    Для н=1 По колво Цикл
         текСтр = СтрПолучитьСтроку(строкаИсточник, н);
         Если строкаИсключения<>Неопределено и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли;
    КонецЦикла;
   
    Возврат массив;
КонецФункции

Функция __получитьМСтрокуИзМассива(массивИсточник, строкаИсключения=Неопределено)Экспорт
    стр = "";
   
    Для каждого элемент Из массивИсточник Цикл
        Если __этоСтрока(элемент) и строкаИсключения<>Неопределено и элемент<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(стр, элемент); КонецЕсли;
    КонецЦикла;
   
    Возврат стр;
КонецФункции

Функция __получитьСтрокуИзМассива(массивИсточник, строкаРазделитель="", строкаИсключения=Неопределено) Экспорт
    стр = "";
   
    былоВхождение = Ложь;
    Для каждого элемент Из массивИсточник Цикл
        Если __этоСтрока(элемент) и строкаИсключения<>Неопределено и элемент<>строкаИсключения Тогда стр = стр + элемент + строкаРазделитель; былоВхождение=Истина; КонецЕсли;
    КонецЦикла;
   
    Если былоВхождение Тогда __удалитьПодстрокуПоИндексу(стр, СтрДлина(стр)-СтрДлина(строкаРазделитель), СтрДлина(строкаРазделитель) ); КонецЕсли; //убираем лишний разделитель

    Возврат стр;
КонецФункции

Процедура __сформироватьПодстрокуМСтроки( строкаИсточник, подСтрока )Экспорт
    строкаИсточник = строкаИсточник + подСтрока + Символы.ПС;
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Строки1С.txt
.1232614500 8,23Kb
25.09.09
127
.1232614500 8,23Kb 127 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Станислав Шепталов (sCHTASS) 22.01.09 16:33
Написал бы вкратце что за функции такие. В конце раб. дня влом разбираццо с кодом
2. Сhe Burashka (CheBurator) 22.01.09 17:29
внушають функции из одного стандартного оператора...
3. Альтаир (Altair777) 22.01.09 17:44
(2) Экстремальный рефакторинг :-)
4. Альтаир (Altair777) 22.01.09 17:48
(0)
//-------------------------------------------
Внешнее приложение для 1С: Предприятие 8.1
//-------------------------------------------
смешно :-)

//-------------------------------------------
Процедура __сформироватьПодстрокуМСтроки( строкаИсточник, подСтрока ) Экспорт
строкаИсточник = строкаИсточник + подСтрока + Символы.ПС;
КонецПроцедуры
//-------------------------------------------
а тут просто упал
5. Александр (Kruzo) 22.01.09 19:12
Altair777. Не хочешь, не ешь. А лучше выложи на всеобщее обозрение свои функции. Посмеемся вместе с тобою над тобою.
6. Альтаир (Altair777) 22.01.09 19:20
(5) А ты сам посмотри. И свои разработки не забудь выложить.
Ты за почти 2 года пребывания на ИС ни на что не сподобился.
Или ты просто тролль?
7. GSoft. (GSoft) 22.01.09 19:30
(5) каждый имеет право на мнение, мы понимашь в демократической стране (ну и что то полицейской) живем...

(1) согласен, если бы была возможность как раньше раскрашивать код 1С то еще читалось бы, а так в глазах плывет и надо соображалку включать.
А так в целом за инструментарий +1 в комментах, будет описание (человеческое - в смысле для людей)))) функций нажму на плюсик вверху)))
8. Александр (Kruzo) 22.01.09 21:51
(6) Зато я, в отличие от тебя, не бью себя пяткой в грудь и никого здесь не опускаю.
Человек сделал хороший поступок, поделился своими разработками. Есть дельные замечания - выскажи, что и где не так. Но без фанатизма. Зачем отбивать у людей желание делиться с другими?
9. Альтаир (Altair777) 22.01.09 22:22
(8)
> в отличие от тебя, не бью себя пяткой в грудь
А я разве бью? Где? Цитату и ссылку.

> и никого здесь не опускаю
Я "опускал" только тех, кто этого заслужил.
1) фиксин
2) toypaul, см. http://www.infostart.ru/blogs/897/
3) одного злобного плюсомана, он уже забанен
см http://www.infostart.ru/forum/forum19/topic7841/messages/
4) vacancy9, см. http://infostart.ru/blogs/917/
5) Торпеда
6) Lochness (см.http://www.infostart.ru/projects/2148/)
Кого-то пропустил? Напомни, плиз.

А devtob, я даже не критиковал и, тем более, не "опускал".
Просто намекнул, что эти функции не относятся к "Внешнее приложение для 1С: Предприятие 8.1". имхо :-)

А что, Kruzо, миста упала и флеймисты оттуда сюда прибежали?
10. GSoft. (GSoft) 22.01.09 22:25
да ладно вам разбираетельство ни о чем
11. Альтаир (Altair777) 22.01.09 22:35
(10) да я знаю, просто народ какой-то озверевший прет (из-за проблем с мистой?). Не хочется, чтобы ИС превратился в ее подобие в плане флейма.
Сейчас даже плюсик поставлю за эти функкции в качестве жеста доброй воли.
12. Александр (Kruzo) 23.01.09 00:37
(11) Спасибо
ЗЫ: На Мисте никогда не жил.
ЗЫЫ: "Просто намекнул, что эти функции не относятся к "Внешнее приложение для 1С: Предприятие 8.1". имхо :-)"
Если прог пишет только Внешние приложения то вполне он здесь прав.
13. Альтаир (Altair777) 23.01.09 00:42
(12) > Если прог пишет только Внешние приложения то вполне он здесь прав.
Переведи :-)
Кто прав? Какое отношение эти функции имеют к Внешним приложениям 8.1?
14. Альтаир (Altair777) 23.01.09 00:46
16. Vasily Kushnir (vasilykushnir) 28.01.09 17:14
(15) "...добавлю их в свою библиотеку функций " - теперь понятно, как у тебя появилась "своя библиотека"? С миру по нитке - шакалу аркан.
17. Альтаир (Altair777) 28.01.09 17:19
(15) > есть такой проект на инфостарте
На Инфостарте нет такого проекта. Есть "программа"
18. Михаил Ражиков (tango) 28.01.09 17:28
а вот это - (16),(17) - не красит. ну, и (18), конечно, то ж
19. Альтаир (Altair777) 28.01.09 17:39
20. Альтаир (Altair777) 28.01.09 17:51
(18) tango прочти внимательно http://infostart.ru/about/
Раздел "Цели" - "Создание на базе ресурса www.infostart.ru новых проектов"

фиксин вводит в заблуждение - никакого такого проекта, насколько я знаю, официально не существует.
21. Михаил Ражиков (tango) 28.01.09 17:54
23. Михаил Ражиков (tango) 28.01.09 17:58
Как рождалась идея национальных проектов?
http://rost.ru/main/what/01/01.shtml
24. Альтаир (Altair777) 28.01.09 22:39
(21) нет, я обосновал

(23) и к чему это?
что ты имел в виду?
в 2-3 фразах
25. 1 C (devtob) 03.02.09 10:52
(15) можно.. все могут их использовать..
27. nickVZ (nickVZ) 08.02.09 15:06
InStrRev(str1, str2[, start[, compare]]) - То же самое, что InStr (аеалог в 1С -Найти()), но поиск производится справа налево, т.е возвращается номер последнего символа, с которого начинается вхождение подстроки str2 в строку str1.
Join(list[, delim]) - Возвращает строку, полученную в результате конкатенации подстрок, содержащихся в массиве list. Параметр delim задаёт символ разделителя (по умолчанию - пробел).
Split(expr[, delim[, count[, compare]]]) - Возвращает массив строк, полученных в результате разбиения строки expr на подстроки. Параметр delim задаёт символ разделителя (по умолчанию - пробел). Параметр count определяет число подстрок (по умолчанию - все). Параметр compare задаёт режим сравнения при обработке строк (0 - двоичное сравнение, 1 - текстовое сравнение).
И еще маленькая тележка.
WSH ;)
28. dgamelya (revril) 10.10.11 11:51
спасибо)))оказалось очень полезным)))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа