Адрес этой странички :
http://doc-prg.narod.ru/art_00101/art_00101.htm
Дата обновления : 08.08.2009
© 08.08.2009 Сергей Попов
1Cv7.
Некоторые полезные алгоритмы.
Строки-Тексты.
Статью в виде файла (8.6 кб) можно скачать здесь: art_00101.zip
1. Проверить вхождение символов
из строки СтрокаСимв, в строку
СтрокаАнализа.
При этом, проверка производится
ПОСИМВОЛЬНО, а не в целом, по подстроке
//Функция возвращает 1, если хотя
бы один символ из переменной СтрокаСимв
входит в строку СтрокаАнализа
Функция сп_ВхождениеСимволовВСтроку(СтрокаСимв,СтрокаАнализа)
//Смотрим символы из СтрокаСимв и проверяем
их на наличие в СтрокаАнализа
//Если хотя бы у одного символа есть
вхождение - возващает 1
Перем Res;
Res = 0; //Возвращаемое значение
Если СтрДлина(СтрокаСимв)>0
Тогда
Если СтрДлина(СтрокаАнализа)>0
Тогда
i=0;
Пока i<СтрДлина(СтрокаСимв)
Цикл
i=i+1;
S1=Сред(СтрокаСимв,i,1);
Если Найти(СтрокаАнализа,S1)>0 Тогда
//Вхождение найдено
Res=1;
i=СтрДлина(СтрокаСимв)+1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции //сп_ВхождениеСимволовВСтроку
2. Удалить (слева) из строки
ИсхСтрока все СИМВОЛЫ, которые заданы
строкой НеСимволы
//Аналог стандартной функции СокрЛ(), но
удаляет не только пробелы
//Функция возвращает "обработанную"
строку
Функция сп_СокрЛ(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (слева)
СИМВОЛЫ, входящие в НеСимволы
//Возвращает "обработанную" строку
Перем Res; //строка, возвращаемое
значение
Перем Yes,i;
Res = "";
Если СтрДлина(ИсхСтрока)>0 Тогда
Res = "";
Yes=1;
i=0;
Пока i<СтрДлина(ИсхСтрока)
Цикл
i=i+1;
S1=Сред(ИсхСтрока,i,1);
//Считываем очередной символ из строки
Если Yes>0
Тогда
//Мы в начале строки - анализируем
Если сп_ВхождениеСимволовВСтроке(S1,НеСимволы)>0
Тогда
//Этот символ из строки - НЕ символ -
пропускаем
Иначе
//Этот символ из строки - нормальный СИМВОЛ,
и больше строку мы НЕ анализируем
Yes=0;
Res=Res+S1;
КонецЕсли;
Иначе
//Это уже НЕ в начале строки - просто
считываем БЕЗ анализа
Res=Res+S1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Res;
КонецФункции //сп_СокрЛ
3. Удалить (справа) из строки
ИсхСтрока все символы, которые заданы
строкой НеСимволы
//Аналог стандартной функции СокрП(), но
удаляет не только пробелы
//Функция возвращает "обработанную"
строку
Функция сп_СокрП(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (справа)
СИМВОЛЫ, входящие в НеСимволы
//Возвращает "обработанную" строку
Перем Res; //строка, возвращаемое
значение
Перем Yes,i;
Res = "";
Если СтрДлина(ИсхСтрока)>0 Тогда
Res = "";
Yes=1;
i=СтрДлина(ИсхСтрока)+1;
Пока i>1 Цикл
i=i-1;
S1=Сред(ИсхСтрока,i,1);
//Считываем очередной символ из строки
Если Yes>0
Тогда
//Мы в конце строки - анализируем
Если сп_ВхождениеСимволовВСтроке(S1,НеСимволы)>0
Тогда
//Этот символ из строки - НЕ символ -
пропускаем
Иначе
//Этот символ из строки - нормальный СИМВОЛ,
и больше строку мы НЕ анализируем
Yes=0;
Res=S1+Res;
КонецЕсли;
Иначе
//Это уже НЕ в конце строки - просто
считываем БЕЗ анализа
Res=S1+Res;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Res;
КонецФункции //сп_СокрП
4. Удалить (слева и справа) из
строки ИсхСтрока все символы, которые
заданы строкой НеСимволы
//Аналог стандартной функции СокрЛП(), но
удаляет не только пробелы
//Функция возвращает "обработанную"
строку
Функция сп_СокрЛП(НеСимволы,ИсхСтрока)
//Удалить НеСимволы слева и справа
//Возвращает "обработанную" строку
Перем Res; //строка
Res=сп_СокрЛ(НеСимволы,ИсхСтрока);
Res=сп_СокрП(НеСимволы,Res);
Возврат Res;
КонецФункции //сп_СокрЛП
5. Инвертировать строку
//Преобразование: "32а65" -> "56а23"
//Функция возвращает "обработанную"
строку
Функция сп_ИнвертироватьСтроку(ИсхСтрока)
Перем Res; //строка
Перем i;
Res="";
Если СтрДлина(ИсхСтрока)>0 Тогда
i=0;
Пока i<СтрДлина(ИсхСтрока)
Цикл
i=i+1;
S1=Сред(ИсхСтрока,i,1);
//Считываем очередной символ из строки
Res=S1+Res;
//Инвертируем
КонецЦикла;
КонецЕсли;
Возврат Res;
КонецФункции //сп_ИнвертироватьСтроку
6. Удалить (слева) из строки
ИсхСтрока - СТРОКУ НеСимволы, если она есть (точное
сравнение)
//Функция возвращает "обработанную"
строку
Функция сп_СокрЛстр(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (слева) строку
НеСимволы, если она есть
//Возвращает "обработанную" строку
Перем Res; //строка
Перем N1,N2,i;
Res = "";
Если СтрДлина(ИсхСтрока)>0 Тогда
Если СтрДлина(НеСимволы)>0
Тогда
Res =
"";
//Проверим,
есть ли строка НеСимволов в строке
ИсхСтрока вообще
N1=Найти(ИсхСтрока,НеСимволы);
N2=N1+СтрДлина(НеСимволы)-1;
Если N1=1
Тогда //Есть и она в начале строки
i = 0;
Пока i<СтрДлина(ИсхСтрока) Цикл
i=i+1;
S1=Сред(ИсхСтрока,i,1); //Считываем очередной
символ из строки
Yes=0;
Если i>=N1 Тогда
Если i<=N2 Тогда
//Мы еще в области НеСимволов в начале
строки - пропускаем символ
Yes=1;
КонецЕсли;
КонецЕсли;
Если Yes<=0 Тогда
//Просто копируем символы
Res=Res+S1;
КонецЕсли;
КонецЦикла;
Иначе
//НеСимволы НЕ в начале строки
Res = ИсхСтрока;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции //сп_СокрЛстр
7. Удалить (справа) из строки
ИсхСтрока - СТРОКУ НеСимволы, если она есть (точное
сравнение)
//Функция возвращает "обработанную"
строку
Функция сп_СокрПстр(НеСимволы,ИсхСтрока)
//Удалить из строки ИсхСтрока (справа)
строку НеСимволы, если она есть
//Возвращает "обработанную" строку
Перем Res; //строка
Res=ИсхСтрока;
//Инвертируем строки, чтобы
использовать функцию сп_СокрЛстр
НеСимволы = сп_ИнвертироватьСтроку(НеСимволы);
Res = сп_ИнвертироватьСтроку(Res);
Res = сп_СокрЛстр(НеСимволы,Res);
Res = сп_ИнвертироватьСтроку(Res);
//Еще раз инвертируем результат
НеСимволы = сп_ИнвертироватьСтроку(НеСимволы);
//Вернем на место, на всякий случай
Возврат Res;
КонецФункции //сп_СокрПстр
8. Удалить (слева и справа) из
строки ИсхСтрока - СТРОКУ НеСимволы, если
она есть (точное сравнение)
//Функция возвращает "обработанную"
строку
Функция сп_СокрЛПстр(НеСимволы,ИсхСтрока)
//Удалить НеСимволы слева и справа
//Возвращает "обработанную" строку
Перем Res; //строка
Res=сп_СокрЛстр(НеСимволы,ИсхСтрока);
Res=сп_СокрПстр(НеСимволы,Res);
Возврат Res;
КонецФункции //сп_СокрЛП
9. В некоторых случаях бывает
полезным "работать" с текстовой
структурой хранения инфы по типу
стандартных INI-файлов (разделы-параметры).
Эта функция позволяет считывать весь
РАЗДЕЛ по его имени
//ИмяРаздела - имя раздела, как он
задан (регистр символов не имеет значения),
переменная типа СТРОКА
//ИмпТекст - СЧИТАННЫЙ "INI-файл" (переменная
типа ТЕКСТ)
//ИмпРаздел - найденный раздел (переменная
типа ТЕКСТ)
//Сама Функция возвращает кол-во параметров
в РАЗДЕЛЕ.
Пример :
Содержание переменной ИмпТекст :
[СЛУЖЕБНАЯ]
КолвоРеквШапка=14
КолвоСтрокТабл=3
КолвоРеквТабл=10
[ШАПКА]
Склад="Склад ОКС",11,"Склады","00001","00001"
Валюта="руб.",11,"Валюты","810","810"
Курс="1",1,"","",""
МатОтветст="Турковский А.А.",11,"ФизЛица","00000005","00000002/00000005"
МестоПрибытия="АБК управл.по тр-у хоз.способ",2,"","",""
Разрешение="Матвеев В.В.",11,"ФизЛица","00000007","00000002/00000007"
ДатаРазр="01.11.02",3,"","",""
Кладовщик="Лазарева Р.Р.",11,"ФизЛица","00000006","00000001/00000006"
Примененим функцию :
сп_ПолучитьРазделИзИмпорта("ШАПКА",ИмпТекст,ИмпРаздел);
Содержание переменной ИмпРаздел :
Склад="Склад ОКС",11,"Склады","00001","00001"
Валюта="руб.",11,"Валюты","810","810"
Курс="1",1,"","",""
МатОтветст="Турковский А.А.",11,"ФизЛица","00000005","00000002/00000005"
МестоПрибытия="АБК управл.по тр-у хоз.способ",2,"","",""
Разрешение="Матвеев В.В.",11,"ФизЛица","00000007","00000002/00000007"
ДатаРазр="01.11.02",3,"","",""
Кладовщик="Лазарева Р.Р.",11,"ФизЛица","00000006","00000001/00000006"
Функция сп_ПолучитьРазделИзИмпорта(ИмяРаздела,ИмпТекст,ИмпРаздел)
Перем i,КолВоСтрок,МыВРазделе,МыВНашемРазделе;
МыВРазделе = 0;
МыВНашемРазделе = 0;
ИмпРаздел.Очистить();
ИмяРаздела=Врег(СокрЛП(ИмяРаздела));
//Преобразуем в верхний регистр
Если СтрДлина(ИмяРаздела)>0
Тогда
//Имя Раздела задано
КолВоСтрок=ИмпТекст.КоличествоСтрок();
Если КолвоСтрок>0
Тогда
МыВРазделе = 0;
МыВНашемРазделе = 0;
i=0;
Пока i<КолВоСтрок
Цикл
i=i+1;
Sx=ИмпТекст.ПолучитьСтроку(i);
S1=СокрЛП(Sx);
Если СтрДлина(S1)>0 Тогда
Если МыВРазделе>0 Тогда //Мы в разделе
каком-то
Если МыВНашемРазделе>0 Тогда //Мы в НАШЕМ
разделе - считываем раздел
ИмпРаздел.ДобавитьСтроку(Sx);
КонецЕсли;
Иначе
//Строка НЕ пустая и мы НЕ знаем, что мы в
разделе
//Проверяем, это вообще раздел или черте что
и сбоку бантик ?
S1=Врег(СокрЛП(S1));
Если СтрДлина(S1)>0 Тогда
Если Лев(S1,1)="[" Тогда //Это раздел вроде
бы
МыВРазделе = 1;
//Проверим, это наш раздел ?
МыВНашемРазделе = 0;
S1=СтрЗаменить(S1,"["," "); //Удалим
признак раздела слева
S1=СтрЗаменить(S1,"]"," "); //Удалим
признак раздела справа
S1=Врег(СокрЛП(S1));
Если СтрДлина(S1)>0 Тогда
Если S1=ИмяРаздела Тогда //Мы именно в НАШЕМ
разделе
МыВНашемРазделе = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
//Строка пустая, следовательно мы ВНЕ любого
раздела
МыВРазделе = 0;
МыВНашемРазделе = 0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат ИмпРаздел.КоличествоСтрок();
КонецФункции//сп_ПолучитьРазделИзИмпорта
10. Выделить из строки вида :
ИмяПарам=ЗначПарам
Имя и значение параметра.
Эта функция предназначена для "работы"
с текстовой структурой хранения инфы по
типу стандартных INI-файлов (разделы-параметры).
//ИсхСтрока - строка из соотв.
раздела (переменная типа СТРОКА)
//ИмяПарам - возвращаемое значение (строка)
//ЗначПарам - возвращаемое значение (строка)
//Сама Функция возвращает 1, если задано хотя
ИмяПараметра
Пример.
ИсхСтрока :
Номенклатура="Светильник
ЛСП 02 2х40",11,"Номенклатура","00017247","00000021/00000063/00002913/00009659/00017247"
После разделения :
ИмяПарам = Номенклатура
ЗначПарам= "Светильник
ЛСП 02 2х40",11,"Номенклатура","00017247","00000021/00000063/00002913/00009659/00017247"
Функция сп_ВыделитьИмяИЗначениеПараметраИзСтроки(ИсхСтрока,
ИмяПарам, ЗначПарам)
//Анализирует и разделяет строку вида :
//ИмяПараметра=Какое-то значение параметра
Перем Res,N;
Перем Sx;
Res=0;
Sx=СокрЛП(ИсхСтрока);
ИмяПарам="";
ЗначПарам="";
N=Найти(Sx,"=");
Если N>0 Тогда //Это "наша"
строка
S1=Лев(Sx,1); //Выделим
левый крайний символ
Если S1<>"["
Тогда //Это НЕ имя раздела
ИмяПарам = Лев(Sx,N); //Выделяем имя параметра
Если
СтрДлина(Sx)>N Тогда //В правой части что-то
есть
ЗначПарам = Прав(Sx,СтрДлина(Sx)-N); //Выделяем
знач.параметра
КонецЕсли;
ЗначПарам=СокрЛП(ЗначПарам);
ИмяПарам=СокрЛП(ИмяПарам);
ИмяПарам=СтрЗаменить(ИмяПарам,"=","
"); //Удаляем из имени параметра знак
равенства
ИмяПарам=СокрЛП(ИмяПарам);
Если
СтрДлина(ИмяПарам)>0 Тогда //Имя Параметра
корректно
Res=1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции //сп_ВыделитьИмяИЗначениеПараметраИзСтроки
11. Когда раздел уже считан (см
функцию сп_ПолучитьРазделИзИмпорта), то
нижеприведенная функция находит и
возвращает значение параметра по его имени.
//ИмяПарам - заданное имя параметра (строка).
Регистр символов не имеет значения
//ИмпРаздел - найденный раздел (с помощью сп_ПолучитьРазделИзИмпорта).
//ЗначПарам - возвращаемое значение
параметра (строка)
//Сама Функция возвращает 1, если заданный
параметр есть в этом разделе
Функция сп_ПолучитьЗначПараметраИзРаздела(ИмяПарам,ЗначПарам,ИмпРаздел)
Перем Res,i,КолВоСтрок; //целые
Перем ИП,ИмПарам; //строки
Res = 0;
ЗначПарам="";
ИмПарам=ВРег(СокрЛП(ИмяПарам));
Если СтрДлина(ИмПарам)>0 Тогда
ИП="";
КолВоСтрок=ИмпРаздел.КоличествоСтрок();
Если КолвоСтрок>0
Тогда
i=0;
Пока i<КолВоСтрок
Цикл
i=i+1;
Sx=ИмпРаздел.ПолучитьСтроку(i);
ИП="";
ЗначПарам="";
Если сп_ВыделитьИмяИЗначениеПараметраИзСтроки(Sx,
ИП,ЗначПарам)>0 Тогда
ИП=ВРег(СокрЛП(ИП));
Если ИП=ИмПарам Тогда //Это НАШ параметр
Res = 1;
i=КолВоСтрок+1; //Выход из цикла
Иначе
ЗначПарам="";
КонецЕсли;
Иначе
ЗначПарам="";
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
ЗначПарам = СокрЛП(ЗначПарам);
Возврат Res;
КонецФункции //сп_ПолучитьЗначПараметраИзРаздела
© 08.08.2009 Сергей Попов