Каким образом можно организовать проверку на корректность адреса электронной почты?
Код 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");
Данные функции позволяют разложить строку в массив, используя заданный разделитель
Например есть строка: абв$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 = Неопределено;
Возврат Массив;
КонецФункции
Посмотрите
Функцию разложить строку на подстроки (в список значений), используя заданный разделитель. Код для получения новостей с сайта 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;
КонецЦикла;
//Все. Мы получили ТЗ с последними новостями
КонецПроцедуры
К сожалению, автор не известен.
Ниже приведено несколько способов получения списка баз 1С 7.7 из реестра:
Код получения списка баз 1С 7.7 из 8.х
Код 1C v 8.х функция сзПолучитьСписокБаз()
попытка
олеСкрипт = новый COMОбъект("MSScriptControl.ScriptControl");
олеСкрипт.Language = "VBScript";
стрКод =
"function strGetListBase()
| const RootKey = &H80000001
| set Reg = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\."" &_
| ""\root\default:StdRegProv"")
| PathKey = ""Software\1C\1Cv7\7.7\Titles""
| Reg.EnumValues RootKey, PathKey, Arr
| Answer = ""{""""#"""",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3,"" & chr(10)
| Answer = Answer & ""{3,1e512aab-1b41-4ef6-9375-f0137be9dd91,0,0,"" & chr(10)
| Answer = Answer & ""{"" & (UBound(Arr) + 1) & "","" & chr(10)
| for x = LBound(Arr) to UBound(Arr)
| call Reg.GetStringValue(RootKey, PathKey, Arr(x), Value)
| Answer = Answer & ""{1e512aab-1b41-4ef6-9375-f0137be9dd91,"" & chr(10) &_
| ""{"""""" & replace(Value, """""""", """""""""""") & """""",0,"" &_
| chr(10) & ""{""""S"""","""""" & Arr(x)& """"""},"" &_
| chr(10) & ""{3,0,"" & chr(10) & ""{0},"""""""",-1,-1,0,0}"" &_
| chr(10) & ""}"" & chr(10) & ""}""
| if x <> UBound(Arr) then Answer = Answer & "",""
| Answer = Answer & chr(10)
| next
| Answer = Answer & ""},"" & chr(10) & ""{""""Pattern """"}"" & chr(10) &_
| ""}"" & chr(10) & ""}""
| strGetListBase = Answer
|end function";
олеСкрипт.AddCode(стрКод);
стрОтвет = олеСкрипт.Run("strGetListBase");
Ответ = ЗначениеИзСтрокиВнутр(стрОтвет);
Ответ.СортироватьПоПредставлению();
исключение
Ответ = новый СписокЗначений;
Ответ.Добавить("Базы 1С:Передприятия 7.7 не обнаруженны!");
конецпопытки;
возврат Ответ;
конецфункции
Код для 1С 7.7
Код 1C v 7.x
Функция ПолучитьСписокБаз1()
Перем Value,arrValues;
Scr = CreateObject("MSScriptControl.ScriptControl");
Scr.Language = "vbscript";
Scr.Timeout=-1;
HKEY_CURRENT_USER = 2147483649;
strKeyPath = "Software\1C\1Cv7\7.7\Titles";
Locator=СоздатьОбъект("WbemScripting.SWbemLocator");
ServiceDef=Locator.ConnectServer(".","root\default");
oReg = ServiceDef.Get("StdRegProv");
Dict=СоздатьОбъект("Scripting.Dictionary");
Scr.AddObject("Dict",Dict);
Scr.AddObject("oReg",oReg);
Scr.ExecuteStatement("dim arrValues,Value:");
Scr.ExecuteStatement("oReg.EnumValues "+HKEY_CURRENT_USER+","""+strKeyPath+""",arrValues:");
Scr.ExecuteStatement("for i=lbound(arrValues) to ubound(arrValues):Dict.add ""pj"" & i, arrValues(i):next");
ТЗБаз=СоздатьОбъект("ТаблицаЗначений");
ТЗБаз.НоваяКолонка("Путь");
ТЗБаз.НоваяКолонка("Описание");
Для к=0 По Dict.count Цикл
Д=Dict.Item("pj"+к);
Scr.ExecuteStatement("oReg.GetStringValue "+HKEY_CURRENT_USER+","""+strKeyPath+""","""+Д+""",Value");
ТЗБаз.НоваяСтрока();
ТЗБаз.Путь = Д;
ТЗБаз.Описание = Scr.eval("Value");
КонецЦикла;
//Посмотрим что в ТЗ
//ТЗБаз.ВыбратьСтроку();
Возврат ТЗБаз;
КонецФункции
Процедура ПолучитьСписокБаз2()
Попытка
scrptCtrl=createobject("MSScriptControl.ScriptControl");
scrptCtrl.language="vbscript";
scrptCtrl.addcode("Function Get1CV77Titles()
|const HKEY_CURRENT_USER = &H80000001
|Set oReg=GetObject(""winmgmts:{impersonationLevel=impersonate}!\\."" &_
|""\root\default:StdRegProv"")
|strKeyPath = ""Software\1C\1Cv7\7.7\Titles""
|oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues
|strInfo=vbNullString
|For i = LBound(arrValues) To UBound(arrValues)
| call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value)
| strInfo=strInfo & arrValues(i) & ""="" & Value & vbCrLF
|Next
|Get1CV77Titles = strInfo
|End Function");
Сообщить(scrptCtrl.run("Get1CV77Titles"));
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
<Сообщил Gloom>
Процедура ПолучитьСписокБаз3()
Ключ="HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles";
ИмяКаталога=СокрЛП(КаталогПользователя());
ИмяБазы=СокрЛП(каталогИБ());
Если прав(ИмяКаталога,1)<>"\" Тогда ИмяКаталога=ИмяКаталога+"\" КонецЕсли;
Если прав(ИмяБазы,1)<>"\" Тогда ИмяБазы=ИмяБазы+"\" КонецЕсли;
ИмяБазыСтр=Симв(34)+СтрЗаменить(ИмяБазы,"\","\\")+Симв(34);
ИмяФайла="USER.TXT";
Команда="Regedit /ea "+Симв(34)+ИмяКаталога+ИмяФайла+Симв(34)+" "+Симв(34)+Ключ+Симв(34);
КомандаСистемы(Команда);
Текст=СоздатьОбъект("Текст");
Текст.КодоваяСтраница(0);
Текст.Открыть(ИмяКаталога+ИмяФайла);
Текст.Показать();
Стр=""; Нашли=0;
Для сч=1 по Текст.КоличествоСтрок() Цикл
Стр=СокрЛП(Текст.ПолучитьСтроку(сч));
Сообщить(Стр);
Если Найти(стр,ИмяБазыСтр)<>0 Тогда
Нашли=1;
прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры