Удаление html тегов из строки Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
стр=RegExp.Replace(стр, ""); //Заменяем все теги на пустоту
Категория:
Регулярные выражения Выбор оптимального алгоритма для разбора строки в массив Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных >100 000 строк. Как сделать бытсрее?
Код 1C v 8.х // Пример Defender aka LINN
ВремяНачала = ТекущаяДата();
Сообщить("Обработка начата: " + ВремяНачала);
ТЗ = Новый ТаблицаЗначений;
Текст = ПолучитьМакет("Макет").ПолучитьТекст();
RE = New COMObject("VBScript.RegExp");
RE.Global = Истина;
RE.IgnoreCase = Истина;
RE.Multiline = Истина;
RE.Pattern = "^.*$";
Строки = RE.Execute(Текст);
RE.Pattern = "([^\|]+?|\|)(?=\|)";
ДобавитьКолонки = Истина;
Для Каждого СтрокаТекста из Строки Цикл
СтрокаДляРазбора = СтрокаТекста.Value;
Результат = RE.Execute(СтрокаДляРазбора);
Если ДобавитьКолонки Тогда
НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл
НомерКолонки = НомерКолонки + 1;
ТЗ.Колонки.Добавить("Колонка" + НомерКолонки);
КонецЦикла;
ДобавитьКолонки = Ложь;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл
Значение = Совпадение.Value;
НоваяСтрока[НомерКолонки] = ?(Значение = "|", "", Значение);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецЦикла;
ВремяОкончания = ТекущаяДата();
Сообщить("Обработка завершена: " + ВремяОкончания + ", время обработки: " + Формат('00010101' + (ВремяОкончания-ВремяНачала), "ДФ=мм:сс"));
Сообщить("Количество строк: " + ТЗ.Количество());
Код 1C v 8.х // Пример aleks-id
Функция InitRegExp(Разделитель = "|")
RegExp = Новый COMОбъект("VBScript.RegExp");
//Параметры:
RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = "[^\" + Разделитель + "]+";
Возврат RegExp;
КонецФункции
Функция РазложитьСтрокуВМассив(RegExp, Строка)
Matches = RegExp.Execute (Строка);
Массив = Новый Массив;
Для Сч = 0 По Matches.Count - 1 Цикл
Массив.Добавить(Matches.Item(Сч).Value);
КонецЦикла;
Возврат Массив;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
Текст = Новый ЧтениеТекста("C:\aktivy.txt", КодировкаТекста.ANSI);
RegExp = InitRegExp();
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
масс = РазложитьСтрокуВМассив(RegExp, Стр);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
RegExp = Неопределено;
КонецПроцедуры
Категория:
Регулярные выражения Удаление из строки всех лишних символов Есть строка
"ABC-9.64,5=s" , нужно оставить в ней только символы "a-z" и "0-9", т.е. получить
"ABC9645s"
Код 1C v 8.х RegExp=Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine=Ложь;
RegExp.Global =Истина;
RegExp.Pattern = "[^A-z0-9]";
Str1 = СокрЛП(Стр);
Res = RegExp.Replace(Str1, "");
Возврат Res;
Категория:
Регулярные выражения Разбить строку на подстроки Разлогает строку типа:
Поле1, "Сложное, с запятыми внутри Поле2", Поле3
на массимв подстрок типа:
Поле1
Сложное, с запятыми внутри Поле2
Поле3
Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
Результат = Новый Массив();
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "(?:^|;)(\""(?:[^\""]+|\""\"")*\""|[^;]*)"; //вот наш супер шаблон
//RegExp.Pattern = ";|;|;|;|;;|;|;|;|;|;|;|;|;;|;|;"; //вот наш супер шаблон
Matches=RegExp.Execute(Стр);
ЧислоВхождений=Matches.Count();
//Сообщить(Стр,СтатусСообщения.Важное);
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
SubMatches = Match.SubMatches;
ЧислоПодвыражений=SubMatches.Count();
Для н = 0 По ЧислоПодвыражений-1 Цикл
SubMatch=SubMatches.Item(н);
Если SubMatch="" Тогда
//Продолжить;
КонецЕсли;
Результат.Добавить(SubMatch);
//Сообщить("Подстрока: "+SubMatch);
КонецЦикла;
КонецЦикла;
Иначе
//Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
Возврат Результат;
Живой Ископаемый Категория:
Регулярные выражения Использование регулярных выражений (RegExp) в 1С Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.
Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки
Процедура RegExp_Exec()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
Matches=RegExp.Execute("Это <hr> строка <br> с тегами HTML");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
Сообщить("Найден тег:"+ Match.Value);
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
//Выдаст в окно сообщений:
//Найден тег:<hr>
//Найден тег:<br>
КонецПроцедуры
Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки с использованием подвыражений
Процедура RegExp_Exec1()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; //Ищем теги HTML, а также текст до и после тега
Matches=RegExp.Execute(" <tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
SubMatches = Match.SubMatches;
ЧислоПодвыражений=SubMatches.Count();
Для н = 0 По ЧислоПодвыражений-1 Цикл
SubMatch=SubMatches.Item(н);
Если SubMatch="" Тогда
Продолжить;
КонецЕсли;
Сообщить("Подстрока: "+SubMatch);
КонецЦикла;
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
КонецПроцедуры
//Выводит в окно сообщений:
//Подстрока:
//Подстрока: <tr>
//Подстрока: <td id=aaa>
//Подстрока: Дятел
//Подстрока: <td>
//Подстрока: долбит
//Подстрока: <td>
//Подстрока: сосну
//Подстрока: </tr>
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Проверка подстроки
Процедура RegExp_Test()
RegExp = CreateObject("VBScript.RegExp");
RegExp.Pattern = "^\d+$"; //Шаблон, который соответствует целому числу
стр="12345";//Строка, которую тестируем
Если RegExp.Test(стр)=0 Тогда
Сообщить("Это не целое число");
Иначе
Сообщить("Это целое число");
КонецЕсли;
//Выдаст в окно сообщений:
//"Это целое число"
КонецПроцедуры
Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Замена текста в подстроке
Процедура RegExp_Replace()
//Строка, где мы будем производить замены
стр="Дятел долбил сосну";
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Истина; //Многострочный режим
RegExp.Pattern = "(долбил)";
стр=RegExp.Replace(стр, "про$1");
Сообщить(стр);
//Выдаст в окно сообщений:
//"Дятел продолбил сосну"
КонецПроцедуры
Источник Категория:
Регулярные выражения Проверка на корректность адреса Электронной Почты, e-mail Каким образом можно организовать проверку на корректность адреса электронной почты?
Код 1C v 8.х Шаблон = ".+@.+\..+"; // регулярное выражение соответствует произвольному e-mail адресу
СтрокаАдреса = "ivanov@mail.com"; // проверяемый адрес
//CтрокаАдреса = ЭлементыФормы.ПолеВводаАдреса.Значение; //проверяемый адрес для элемента формы
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями
RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон; // шаблон (регулярное выражение) для проверки корректности e-mail
Если RegExp.Test(СтрокаАдреса) Тогда
Сообщить("Корректный адрес");
Иначе
Сообщить("Некорректный адрес");
КонецЕсли;
Для 7.7 в вышеуказанном коде заменить создание объекта на:
Код 1C v 7.x RegExp = CreateObject("VBScript.RegExp");
Категория:
Регулярные выражения Полезные процедуры работы с Active Directory (AD) Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT:");
м = Новый Массив(); м.Добавить("domain"); // Computer User Group Global Group domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "Global Group") Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT://"+СокрЛП(ИмяДомена));
м = Новый Массив();
м.Добавить(ТипГрупп); // Computer User Group Global Group domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка
objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена) + "/" + СокрЛП(ИмяГруппы) + ", Group");
Для каждого item Из objNameSpace.Members() Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
Массив = ПолучитьСписокПользователейВГруппеДомена (СокрЛП(ИмяДомена), ИмяГруппы);
Для каждого элМассив из Массив Цикл
Если ВРег(элМассив) = ВРег(СокрЛП(ИмяПользователя)) Тогда // пользователь уже в группе
Результат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка
element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Add(element_user.ADsPath); element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Remove(element_user.ADsPath);
element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект("","ADODB.Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");
Исключение Предупреждение("Ошибка подключения к Active Directory!");
Возврат;
КонецПопытки;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока(Стр.Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC="+СокрЛП(Домен.Код)+"' WHERE SAMAccountName='"+Стр.Логин+"'";
rs = conn.Execute(query);
Пока НЕ rs.EOF() Цикл
obj = ПолучитьCOMОбъект(rs.Fields(0).Value);
Если obj.Class="user" Тогда
Стр.НоваяПочта=СокрЛП(obj.EmailAddress);
Если Стр.НоваяПочта<>Стр.СтараяПочта Тогда
Стр.Установить=Истина;
КонецЕсли;
КонецЕсли;
rs.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка получения почты для логина :"+Стр.Логин);
КонецПопытки;
КонецЕсли;
КонецЦикла;
conn.Close();
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ("WbemScripting.SWbemLocator");
Серв = COM.ConnectServer(СокрЛп(ИмяКомпьютера), "\root\cimv2", СокрЛП(Логин), СокрЛП(Пароль));
СписокПроцессов = Серв.execQuery("Sel ect * fr om Win32_Process Where Name = '"+СокрЛП(НазваниеПроцесса)+"'");
Для каждого item Из СписокПроцессов Цикл
item.Terminate();
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Код 1C v 8.х // coder1cv8 - Мой вариант получения почты 1С-ного пользователя:
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес="";
ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));
Если ПользовательИБ<>Неопределено Тогда
Если ПользовательИБ.АутентификацияОС Тогда
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
LDAP=ПолучитьCOMОбъект("LDAP://CN="+ЮзерАД.FullName+",OU=Common Users,OU=Regular Users,DC="+Домен+",DC=local");
Адрес=LDAP.Mail;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции
Категория:
COM-объекты, WMI, WSH Как получить уникальный идентификатор объекта, GUID? GUID (Global ly Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор();
// или
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013");
Если НЕ НоменклатураСсылка.Пустая() Тогда
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.НаименованиеПолное,
| Номенклатура.ЕдиницаИзмерения,
| Номенклатура.СтавкаНДС,
| Номенклатура.НоменклатурнаяГруппа,
| Номенклатура.СчетУчетаЗапасов,
| Номенклатура.СчетУчетаЗатрат,
| Номенклатура.Ссылка,
| Номенклатура.ЭтоГруппа
| ИЗ
| Справочник.Номенклатура КАК Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
СпрОбъект = РезультатЗапроса.Выбрать();
Пока СпрОбъект.Следующий() Цикл
СтрокаУИ = Объект.XMLСтрока(СпрОбъект.Ссылка);
GUID = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИ)));
КонецЦикла;
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x Инфо = СоздатьОбъект("AddIn.V7SysInfo");
ГлобальноУникальныйИдентификатор = Инфо.СоздатьGUID();
Через WScript
Код 1C v 7.x Функция СоздатьGUID()
TypeLib = CreateObject("Scriptlet.TypeLib");
NewGUID = TypeLib.Guid();
TypeLib = "";
Возврат NewGUID;
КонецФункции
//*******************************************
Процедура Сформировать()
g=СоздатьGUID();
Сообщить("Создан GUID: "+g);
КонецПроцедуры
при OLE доступе:
Код 1C v 7.x Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда
Пока Док_Источник.ПолучитьДокумент() = 1 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));
// Для примера Объект возвращает {"O","0","0","3114","0","0"," 258156CB "},
// а ПолучитьИД(объект) = 258156CB
КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Категория:
Встроенные Функции Функция разбора (разложения) строки в массив Данные функции позволяют разложить строку в массив, используя заданный разделитель
Например есть строка: абв$dfd$232$-0oj$5
Выполнив код: НашМассив = РазложитьСтрокуВМассив(абв$dfd$232$-0oj$5, "$") ;
Получим: НашМассив = абв
dfd
232
-0oj
5
Код 1C v 8.х
// Функция "расщепляет" строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
// три из которых - пустые строки, а
// РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
//
// Параметры:
// Стр - строка, которую необходимо разложить на подстроки.
// Разделитель - строка-разделитель, по умолчанию - запятая.
//
// Возвращаемое значение:
// массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассив(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Плюсы RegExp:
1. Хорошая скорость анализа, т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
2. Высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки - разбору)
3. Дополнительный функционал (можно осуществлять анализ, замену и проверку строковых выражений)
Минусы RegExp:
1. Не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом.
2. Возможность зависания при использовании сложных шаблонов(редкость, но бывает).
3. RegExp - это дополнительная библиотека и инициализация занимает значительное время.
Код 1C v 8.х // Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Функция РазложитьСтрокуВМассив(Строка, Разделитель = ",") Экспорт
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями
//Параметры:
RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске
//Разбор строки вида 1,СЛОВО,(1+2); Маска для разделителя ',' [^\,]*"
RegExp.Pattern = "[^\" + Разделитель + "]+";
Matches = RegExp.Execute (Строка);
Массив = Новый Массив;
Для Сч = 0 По Matches.Count - 1 Цикл
Массив.Добавить(Matches.Item(Сч).Value);
КонецЦикла;
RegExp = Неопределено;
Возврат Массив;
КонецФункции
Посмотрите
Функцию разложить строку на подстроки (в список значений), используя заданный разделитель. Категория:
Работа с Текстом (Строкой) Получения новостей с RSS-канала сайта buh.ru Код для получения новостей с сайта buh.ru, используется RSS-канал http://www.buh.ru/rss/rss-2.0.jsp
Данный код для 7.7, при использовании в 8-ой версии нужно заменить СоздатьОбъект( на Новый COMОбъект(, остальное вроде так же.
Код 1C v 7.x
Функция ВытащитьДату(Стр)
парсер=СоздатьОбъект("VBScript.RegExp");
парсер.Global =-1;
парсер.IgnoreCase =-1;
стрМес="Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
парсер.Pattern="(\d\d)\s(("+стрМес+"))\s(\d{4})";
рез = парсер.Execute(Стр);
Если рез.Count>0 Тогда
рез_ = рез.Item(0);
чч=Число(рез_.Submatches(0));
мст=рез_.Submatches(1);
где=Найти(стрМес,мст);
мм=цел(где/4)+1;
гг=Число(рез_.Submatches(3));
дат=Дата(гг,мм,чч);
Иначе
дат=0;
КонецЕсли;
Возврат дат;
КонецФункции
Процедура Сформировать()
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ИД","Число");
ТЗ.НоваяКолонка("Дата","Дата");
ТЗ.НоваяКолонка("Заголовок","Строка");
ТЗ.НоваяКолонка("Ссылка","Строка");
ТЗ.НоваяКолонка("Текст","Строка");
Состояние("Получение данных с сайта www.buh.ru");
//ТаймАут поставьте в зависимости от качества подключения
ТаймАут=100000;
IE=СоздатьОбъект("InternetExplorer.Application");
IE.navigate("http://www.buh.ru/rss/rss-2.0.jsp");
Пока IE.readyState<4 Цикл
ТаймАут=ТаймАут-1;
Если ТаймАут=0 Тогда
Предупреждение("Не удалось получить данные с сайта www.buh.ru",10);
Возврат;
КонецЕсли;
КонецЦикла;
//версия 0.1 для v7plus.dll
//ХМЛ=СоздатьОбъект("AddIn.XMLParser");
//ХМЛДок=ХМЛ.СоздатьДокумент();
//ХМЛДок.Загрузить(oIE.document.XMLDocument);
//Выборка=ХМЛДок.ВыбратьУзлы("//item");
//Для ии=0 По Выборка.КоличествоУзлов()-1 Цикл
// ЭлНовость=Выборка.ПолучитьУзел(ии);
// ТЗ.НоваяСтрока();
// ТЗ.Дата=ВытащитьДату(ЭлНовость.ВыбратьУзел("./pubDate").Текст);
// ТЗ.Заголовок=ЭлНовость.ВыбратьУзел("./title").Текст;
// ТЗ.Ссылка=ЭлНовость.ВыбратьУзел("./link").Текст;
// ТЗ.Текст=ЭлНовость.ВыбратьУзел("./description").Текст;
//КонецЦикла;
//версия 0.2 для MSXML
ХМЛДок=СоздатьОбъект("MSXML2.DOMDocument");;
ХМЛДок.async=0;
ХМЛДок.resolveExternals=0;
ХМЛДок.load(IE.document.XMLDocument);
Выборка=ХМЛДок.selectNodes("//item");
Для ии=0 По Выборка.length-1 Цикл
ЭлНовость=Выборка.item(ии);
ТЗ.НоваяСтрока();
ТЗ.Дата=ВытащитьДату(ЭлНовость.selectSingleNode("./pubDate").text);
ТЗ.Заголовок=ЭлНовость.selectSingleNode("./title").text;
ТЗ.Ссылка=ЭлНовость.selectSingleNode("./link").text;
ТЗ.Текст=ЭлНовость.selectSingleNode("./description").text;
КонецЦикла;
//Все. Мы получили ТЗ с последними новостями
КонецПроцедуры
К сожалению, автор не известен.
Категория:
COM-объекты, WMI, WSH