Проверка на корректность адреса Электронной Почты, e-mail Каким образом можно организовать проверку на корректность адреса электронной почты?
Код 1C v 8.х Шаблон = ".+@.+\..+"; // регулярное выражение соответствует произвольному e-mail адресу
СтрокаАдреса = "ivanov@mail.com"; // проверяемый адрес
//CтрокаАдреса = ЭлементыФормы.ПолеВводаАдреса.Значение; //проверяемый адрес для элемента формы
RegExp = Новый COMОбъект("VBS cript.RegExp"); // создаем объект для работы с регулярными выражениями
RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон; // шаблон (регулярное выражение) для проверки корректности e-mail
Если RegExp.Test(СтрокаАдреса) Тогда
Сообщить("Корректный адрес");
Иначе
Сообщить("Некорректный адрес");
КонецЕсли;
Для 7.7 в вышеуказанном коде заменить создание объекта на:
Код 1C v 7.x RegExp = CreateObject("VBS cript.RegExp");
Категория:
Регулярные выражения Обновление платформы на клиентских машинах и восстановление списка информационных баз пользователей Периодически сталкиваюсь с проблемой обновления платформы на клиентских машинах, + периодически пользователи удаляют, изменяют или добавляют какие-то новые информационные БД.
В случае 8.2 новые релизы платформы стали штамповать чуть ли не каждый месяц, что меня повергло в уныние, разбираясь в этом вопросе понял: у кого есть домен могут легко реализовать с помощью доменных политик..Те же кто лишен домена и работает в рабочих группах, может прибегнуть к помощи кривоватого скрипта от 1С (текст скрипта приведен в руководстве администратора 8.2 стр. 185
Но как быть, если нужно одновременно снести старую платформу и поставить новую + что б еще у всех пользователей был одинаковый список информационных БД, Да и лучше, что б по ссылке вообще автоматом выбиралась нужна ИБ!
Для решения нам нужно какое-нибудь общедоступное сетевое пространство, куда мы кладем дистрибутивы платформ и нужный нам список баз (отредактированный файлик ibases.v8i)
Итак, пишем скрипт от меня с любовью и комментариями
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitFolder ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitFolder (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Напоминаю, что создать исполняющий скрипт не сложно, берем обычный текстовый файл, вставляем туда текст скрипта, сохраняем файл, меняем ему расширение с txt на
vbs и можно скрипт исполнять
Источник Категория:
Администрирование Автоматическая архивация баз 1С 8.х для файлового и клиент-серверного варианта Данный способ архивации подходит для файловых и SQL версий баз 1С:
И так:
1. Создаем скрипт
vbs и сохраняем его в
C:\Backup\ZUP.vbs
Код VBS
Set WshShell = CreateObject ("WScript.Shell" )
dim d,m,y
d = day (date ())
if d < 10 then
d = "0" & d
end if
m = month (date ())
if m < 10 then
m = "0" & m
end if
y = year (date ())
h = Hour (Time ())
if h < 10 then
h = "0" & h
end if
Min = Minute (Time ())
if Min < 10 then
Min = "0" & Min
end if
S = Second (Time ())
if S < 10 then
S = "0" & S
end if
s = d & "_" & m & "_" & y & "_" & h & "_" & Min & "_" & S
BackupPath = "/DumpIB \\Server1CBackup\SQL_Backup\1c_backup\ZUP\BACKUP\ZUP_" & s & ".dt"
LogPath = "/Out \\Server1CBackup\SQL_Backup\1c_backup\ZUP\log\ZUP_Log_" & s & ".log -NoT_runcate"
one1CPath = "" "%systemdrive%\Program Files\1cv81\bin\1cv8.exe" ""
Paramters = "DESIGNER /S Server1C\ZUP /N UserAdmin1C /P PassWordUserAdmin1C /DisableStartupMessages"
Set fs = CreateObject ("Scripting.FileSystemObject" )
WshShell.Run one1CPath & " " & Paramters& " " & LogPath & " " & BackupPath, 0 , True
2. На Server1C создаем Назначенные задания с параметрами как на рисунках ниже:
3. В итоге получаем архивные файлы выгрузок 1С и логи:
Категория:
Администрирование Поиск из 1С в Excel Для 8.х в нижеследующем коде замените
СоздатьОбъект( на
Новый COMОбъект !
Код 1C v 7.x //Пример 1:
Процедура Сформировать()
Екскел=СоздатьОбъект("Excel.Application");
Книга=Екскел.WorkBooks.Open("C:\Ищем.xls");
Книга.Worksheets(1).Unprotect ("1qaz");
Для к=1 По Книга.Worksheets.Count Цикл
Диапазон = Книга.Worksheets(к).UsedRange;
Попытка
Найдено = Диапазон.Find("цу");
Истина=-1;
Исключение
Истина=0;
КонецПопытки;
Если Истина=-1 Тогда
АдресПреж = Найдено.Address;
Пока Истина=-1 Цикл
Сообщить(""+Книга.Worksheets(к).Name+"; "+Найдено.Address);
Попытка
Найдено = Диапазон.FindNext(Найдено);
Истина=-1;
Исключение
Истина=0;
КонецПопытки;
Истина=?((Истина=-1) И (Найдено.Address <> АдресПреж),-1,0);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Сообщить(Книга.Worksheets(1).Cells(1, 1).Text);
КонецПроцедуры
//Пример 2:
Процедура НайтиСтроку(Application,СтрокаПоиска)
S_election=Application.S_election;
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbs cript";
Скрипт.AddObject("S_election",S_election);
Скрипт.AddObject("ActiveCell",Application.ActiveCell);
//res=Скрипт.Eval("S_election.Find("+СтрокаПоиска+",ActiveCell,-4163,1).activate()");
res=Скрипт.Eval("S_election.Find("+СтрокаПоиска+",ActiveCell,-4163,1)");
Сообщить("результат "+res.Address);
КонецПроцедуры
Процедура Сформировать()
Путь="C:\test.xls";
Str="567";
Попытка
Application=СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки(),"!!!");
Сообщить("Возможно, MS Excel не установлен на этом компьютере.");
Возврат;
КонецПопытки;
НайтиСтроку(Application,Str);
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Функции - Экспонента, Степень, Логарифм, Синус, Косинус, Тангенс Встроенные функции 1С 8.х для работы со значениями типа Число:
Код 1C v 8.х
Функция Степень(_База, _Степ)
Результат = 1 ;
Для К = 1 По _Степ Цикл
Результат = Результат * _База;
КонецЦикла ;
Возврат Результат;
КонецФункции
ACos - Вычисляет арккосинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ACos( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ASin - Вычисляет арксинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ASin( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ATan - Вычисляет арктангенс от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ATan( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Cos - Вычисляет косинус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Cos( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Exp - Вычисляет результат возведения основания натурального логарифма (числа е) в степень <Число>.
Синтаксис:
Код 1C v 8.х Exp( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Log - Вычисляет натуральный логарифм числа.
Синтаксис:
Код 1C v 8.х Log( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Log10 - Вычисляет десятичный логарифм числа.
Синтаксис:
Код 1C v 8.х Log10( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Sin - Вычисляет синус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Sin( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Tan - Вычисляет тангенс от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Tan( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Код 1C v 7.x
Перем ДocтaтoчнaяToчнocть;
Перем КoличecтвoЗнaкoв;
Перем КoличecтвoИтepaций;
Перем ЧиcлoПИ;
Функция КвaдpaтныйКopeнь(Apгумeнт) Далее
Функция ЭкcПонeнтa(Apгумeнт) Далее
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2) Далее
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция КвaдpaтныйКopeнь(Apгумeнт)
Если Apгумeнт< 0 Тогда
Сообщить( "..." , "!" ) ;
Возврат ПолучитьПустоеЗначение( ) ;
ИначеЕсли Apгумeнт= 0 Тогда
Возврат 0 ;
КонецЕсли ;
ПpeдыдущaяИтepaция = Apгумeнт/ 2 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
Значeниe = 0.5 * ( ПpeдыдущaяИтepaция+
Apгумeнт/ ПpeдыдущaяИтepaция) ;
Если Значeниe< ПpeдыдущaяИтepaция Тогда
Paзницa = ПpeдыдущaяИтepaция- Значeниe;
Иначе
Paзницa = Значeниe- ПpeдыдущaяИтepaция;
КонецЕсли ;
Если Paзницa< ДocтaтoчнaяToчнocть Тогда
Прервать;
КонецЕсли ;
ПpeдыдущaяИтepaция= Значeниe;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция ЭкcПонeнтa(Apгумeнт)
Значeниe = 1 ;
ПpeдыдущийЧлeн = 1 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн* Apгумeнт/ Cч;
Значeниe = Значeниe+ OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/ Значeниe;
Если ( Toчнocть< ДocтaтoчнaяToчнocть) И ( OчepeднoйЧлeн< 0.1 ) Тогда
Прервать;
КонецЕсли ;
ПpeдыдущийЧлeн= OчepeднoйЧлeн;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2)
Если Apгумeнт1 < 0 Тогда
Сообщить( "..." , "!" ) ;
ИначеЕсли Apгумeнт1 = 0 Тогда
Возврат 0 ;
КонецЕсли ;
Значeниe = 1 ;
ПpeдыдущийЧлeн = 1 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн* Apгумeнт2 * Лог( Apгумeнт1 ) / Cч;
Значeниe = Значeниe+ OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/ Значeниe;
Если Toчнocть< 0 Тогда
Toчнocть = - Toчнocть;
КонецЕсли ;
Если ( Toчнocть< ДocтaтoчнaяToчнocть) И ( OчepeднoйЧлeн< 0.1 ) Тогда
Прервать;
КонецЕсли ;
ПpeдыдущийЧлeн= OчepeднoйЧлeн;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция CлужTaнгeнc(Apгумeнт)
КвApгум = Apгумeнт* Apгумeнт;
Значeниe = Apгумeнт/ ( 1 - КвApгум/ ( 3 - КвApгум/ ( 5 - КвApгум/ ( 7 - КвApгум/ ( 9 - КвApгум/ ( 11 - КвApгум/ ( 13 - КвApгум/ ( 15 - КвApгум) ) ) ) ) ) ) ) ;
Возврат Значeниe;
КонецФункции
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
ЗнaкPeзультaтa= 1 ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( 2 * ЧиcлoПИ) ) * 2 * ЧиcлoПИ;
Если Apгумeнт> ЧиcлoПИ Тогда
Apгумeнт = Apгумeнт- ЧиcлoПИ;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Если Apгумeнт> ЧиcлoПИ/ 2 Тогда
Apгумeнт= ЧиcлoПИ- Apгумeнт;
КонецЕсли ;
Если Apгумeнт> ЧиcлoПИ/ 4 Тогда
Значeниe = ЗнaкPeзультaтa* Кocинуc( ЧиcлoПИ/ 2 - Apгумeнт) ;
Иначе
TaнгeнcПолoвины = CлужTaнгeнc( Apгумeнт/ 2 ) ;
Значeниe = ЗнaкPeзультaтa* 2 * TaнгeнcПолoвины/
( 1 + TaнгeнcПолoвины* TaнгeнcПолoвины) ;
КонецЕсли ;
Возврат Значeниe;
КонецФункции
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( 2 * ЧиcлoПИ) ) * 2 * ЧиcлoПИ;
Если Apгумeнт< ЧиcлoПИ/ 4 Тогда
TaнгeнcПолoвины = CлужTaнгeнc( Apгумeнт/ 2 ) ;
Значeниe = ( 1 - TaнгeнcПолoвины* TaнгeнcПолoвины) /
( 1 + TaнгeнcПолoвины* TaнгeнcПолoвины) ;
Иначе
Значeниe = Cинуc( Apгумeнт+ ЧиcлoПИ/ 2 ) ;
КонецЕсли ;
Возврат Значeниe;
КонецФункции
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
ЗнaкPeзультaтa= 1 ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( ЧиcлoПИ) ) * ЧиcлoПИ;
Если Apгумeнт> ЧиcлoПИ/ 2 Тогда
Apгумeнт= ЧиcлoПИ- Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Если Apгумeнт< ЧиcлoПИ/ 8 Тогда
Значeниe = ЗнaкPeзультaтa* CлужTaнгeнc( Apгумeнт) ;
Иначе
Попытка
Значeниe = ЗнaкPeзультaтa* Cинуc( Apгумeнт) /
Кocинуc( Apгумeнт) ;
Исключение
Сообщить( "..." , "!" ) ;
Значeниe = ПолучитьПустоеЗначение( ) ;
КонецПопытки
КонецЕсли ;
Возврат Значeниe;
КонецФункции
ДocтaтoчнaяToчнocть = 0.00000000001 ;
КoличecтвoИтepaций = 1000 ;
КoличecтвoЗнaкoв = - Лог10 ( ДocтaтoчнaяToчнocть) - 1 ;
ЧиcлoПИ = 3.1415926535897932384626433832795 ;
Код 1C v 7.x VBS =CreateObject("MSScriptControl.ScriptControl");
VBS .Language="VBs cript";
Параметр=1234;
Корень=VBS .Eval("sqr("+СокрЛП(Параметр)+")");
Процедура Сформировать()
Ctrl=СоздатьОбъект("MSScriptControl.ScriptControl");
Ctrl.Language="vbs cript";
Ctrl.AddCode("
|pi=4 * atn(1.0)
|
|Function ShowPI
|ShowPI=pi
|End Function
|
|Function CalcSQR(number)
|if number<0 then
| CalcSQR=0
|else
| CalcSQR=SQR(Number)
|end if
|End Function
|
|Function CalcSIN(number)
|CalcSin=Sin(number/(180/pi))
|End Function
|
|Function CalcCOS(number)
|CalcCOS=COS(number/(180/pi))
|End Function
|
|Function CalcTAN(number)
|CalcTAN=TAN(number/(180/pi))
|End Function
|
|Function CalcRND
|Randomize
|CalcRND=RND
|End Function
|
|Function NameOfWeekDay(MyDate)
|NameOfWeekDay=WeekDayName(Weekday(MyDate),False)
|End Function
|
|");
Сообщить(Ctrl.Run("ShowPI")); // Число ПИ
Сообщить(Ctrl.Run("CalcSQR",4)); // Квадратный корень из 4
Сообщить(Ctrl.Run("CalcSin",90)); // Синус 90 градусов
Сообщить(Ctrl.Run("CalcCOS",180)); // Косинус 180 градусов
Сообщить(Ctrl.Run("CalcTAN",180)); // Тангенс 90 градусов
Сообщить(Ctrl.Run("CalcRND")); // Случайное число от 0 до 1
Сообщить(Ctrl.Run("NameOfWeekDay",ТекущаяДата())); // Название дня недели
Категория:
Работа с Числами Чтение RTF файлов через OpenOffice. Для 8.х заменить СоздатьОбъект( на Новый COMОбъект(
Код 1C v 7.x // Пример от Jaap Vduul
// Пример чтения таблицы из OpenOffice:
// =====================================
ServiceManager = СоздатьОбъект("com.sun.star.ServiceManager");
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
script = СоздатьОбъект("ScriptControl");
script.Language = "vbs ";
script.AddCode
(
"Dim Parameters()
|
|Sub InitParameters(Size)
|
| Erase Parameters
|
| If Size > 0 Then
| Redim Parameters(Size - 1)
| End If
|
|End Sub
|
|Sub SetParameter(ServiceManager, Name, Value, Index)
|
| Set PropertyValue = ServiceManager.Bridge_GetStruct(""com.sun.star.beans.PropertyValue"")
| PropertyValue.Name = Name
| PropertyValue.Value = Value
|
| Set Parameters(Index) = PropertyValue
|
|End Sub
|
|Sub SetBooleanParameter(ServiceManager, Name, Value, Index)
|
| SetParameter ServiceManager, Name, Cbool(Value), Index
|
|End Sub
|
|Function LoadDocument(ComponentLoader, URL, TargetFrameName, SearchFlags)
|
| Set LoadDocument = ComponentLoader.loadComponentFromURL(URL, TargetFrameName, SearchFlags, Parameters)
|
|End Function
|
|Sub CloseDocument(Document)
|
| Document.Close True
|
|End Sub"
);
script.Run("InitParameters", 2);
script.Run("SetBooleanParameter", ServiceManager, "ReadOnly", 1, 0);
script.Run("SetBooleanParameter", ServiceManager, "Hidden", 1, 1);
URL = ПреобразоватьВURL(КаталогПриказов + НомерПриказа + ".rtf");
Документ = script.Run("LoadDocument", Desktop, URL, "_blank", 0);
Таблица = Документ.TextTables.getByIndex(0); // ссылка на первую таблицу
ВсегоСтрок = Таблица.getRows().getCount();
ВсегоСтолбцов = Таблица.getColumns().getCount();
Для ИндексСтроки = 1 По (ВсегоСтрок - 1) Цикл // ИндексСтроки = 1, т.к. пропускаем заголовок
Для ИндексСтолбца = 0 По (ВсегоСтолбцов - 1) Цикл
Ячейка = Таблица.getCellByPosition(ИндексСтолбца, ИндексСтроки);
ТекстЯчейки = Ячейка.getString();
КонецЦикла;
КонецЦикла;
script.Run("CloseDocument", Документ);
Категория:
Работа с Microsoft Office и OpenOffice Функция разбора (разложения) строки в массив Данные функции позволяют разложить строку в массив, используя заданный разделитель
Например есть строка: абв$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Объект("VBS cript.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
Функция ВытащитьДату(Стр)
парсер=СоздатьОбъект("VBS cript.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 Пример обращения к программе 1С:Предприятие из модуля MS Excel В данном примере запускается и инициализируется конфигурация 1С:Предприятие 8.0 с базой данных в каталоге D:\1CBasa.
Далее в программе 1С:Предприятие 8.0 создается объект типа "СправочникМенеджер.Товары" и создается новая группа элементов с названием "***** Экспорт из Excel ******".
Во вновь созданную группу каталога записываются данные из таблицы MS Excel.
Пример представлен на языке MS Visual Basic:
Код VBS Sub Excel_to_trade()
Dim trade As Object
Dim Элемент As Object
Set trade = CreateObject ("V8.Application" )
trade.Connect("File=" "D:\1CBasa" ";Usr=" "Director" ";" )
Set СправочникТоваров = trade.Справочники. Товары
Set ГруппаТоваров = СправочникТоваров.СоздатьГруппу()
ГруппаТоваров.Наименование = "***** Экспорт из Excel ******"
ГруппаТоваров.Записать
N = 100
For Count = 1 To N
Set Элемент = СправочникТоваров.СоздатьЭлемент()
Элемент.Наименование = Application.Cells(Count, 2 ).Value
Элемент.Розн_Цена = Application.Cells(Count, 3 ).Value
Элемент.Мел_Опт_Цена = Application.Cells(Count, 4 ).Value
Элемент.Опт_Цена = Application.Cells(Count, 5 ).Value
Элемент.Родитель = ГруппаТоваров.Ссылка
Элемент.Записать
Next Count
End Sub
Категория:
Работа с Microsoft Office и OpenOffice Скрипт принудительного завершения процессов 1С на всех компьютерах В примере "1cv7s.exe", для 8-ки замениете на "1cv8.exe"
Код VBS
'Скрипт демонстрирует возможность принудительного завершения процессов 1С
'на всех компьютерахуказанного домена. Данный код можно применять непосредственно перед пакетным запуском 1С:Предприятия,
'требующим монопольного входа в базу данных (например, при резервном копировании).
'ВНИМАНИЕ! Задайте нужное значение переменной "DomainName"!
'ВНИМАНИЕ! Для успешной работы скрипта его желательно запускать с правами администратора домена.
'ВНИМАНИЕ! Чтобы опробовать скрипт, не производя деструктивных действий, достаточно закомментировать
'оператор "Proc.Terminate".
Option Explicit
On Error Resume Next
Dim DomainName 'Имя домена
DomainName = "MYDOMAIN"
Dim StrResult 'строка результата работы всей программы
StrResult = StrResult & CStr(Now) & " начало работы скрипта" & VbCrLf
Dim ADSI
Set ADSI = GetObject("WinNT://" & DomainName)
ADSI.Filter = Array("computer")
Dim Comp 'компьютер
Dim WMI 'объект WMI
Dim Proc 'процесс
Dim CurrName 'имя текущего компьютера
CurrName = GetNameComp()
'Цикл по компьютерам домена
For Each Comp In ADSI
If Comp.Name <> CurrName Then
Set WMI = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\" & Trim(Comp.Name) & "\Root\CIMV2")
If Err.Number=0 Then
'Цикл по процессам компьютера
For Each Proc In WMI.ExecQuery("S_elect * FROM Win32_Process WHERE Name = '1cv7s.exe'")
StrResult = StrResult & _
CStr(Now) & " Computer=" & Comp.Name & " PID=" & Proc.ProcessId & _
VbCrLf
'Завершение процесса
Proc.Terminate
Next 'Цикл по процессам компьютера
Else 'Не удалось соединиться с компьютером
If Err.Number <> 462 Then 'The remote server machine does not exist or is unavailable
StrResult = StrResult & _
" " & CStr(Now) & " Computer=" & Comp.Name & " ERROR " & Err.Number & _
VbCrLf
End If
End If
Err.Clear
End If
Next 'Цикл по компьютерам домена
StrResult = StrResult & CStr(Now) & " конец работы скрипта" & VbCrLf
'Отображение результата
ShowInNotepad("Процессы 1cv7s.exe:" & VbCrLf & VbCrLf & StrResult)
'==========================================================================
'Процедура отображает переданную строку в блокноте
Sub ShowInNotepad(StrToFile)
Dim FSO 'Объект файловой системы Scripting.FileSystemObject
Dim TempPath 'Путь к временному файлу
Dim TxtFile 'Поток текстового файла
Set FSO = CreateObject("Scripting.FileSystemObject")
TempPath = GetTempPath() & "\" & FSO.GetTempName
Set TxtFile = FSO.CreateTextFile(TempPath)
TxtFile.WriteLine(StrToFile)
TxtFile.Close
CreateObject("WScript.Shell").Run "notepad.exe " & TempPath
WScript.Sleep 1000
FSO.DeleteFile TempPath
End Sub 'ShowInNotepad
'==========================================================================
'Функция возвращает путь к каталогу временных файлов текущего пользователя
Function GetTempPath()
GetTempPath = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%")
End Function 'GetTempPath
'==========================================================================
'Функция возвращает имя текущего компьютера
Function GetNameComp()
GetNameComp = CreateObject("WScript.Network").ComputerName
End Function 'GetNameComp
Категория:
Администрирование Скрипт запуска 1С:Предприятия от имени Администратора или Пользователя Данные пример для 7.7, для 8-ых версий указать путь к 1Сv8.exe
Код VBS
Dim WshShell, ObjFSO
Set WshShell = CreateObject ("WScript.Shell" )
set objFSO = CreateObject ("Scripting.FileSystemObject" )
appl="C:\1Cv7\BINOP\1CV7s.exe"
users="DomenKompanii\emigachev"
Set objWMIService = GetObject _
("winmgmts:\\.\root\cimv2:Win32_Process" )
errReturn = objWMIService.Create _
("cmd.exe /K " "title RUNAS_AUTO & runas.exe /user:" & users & " " "" & appl & "" "" "" , Null , Null , intProcessID)
wscript.Sleep(1000 )
wshShell.AppActivate "RUNAS_AUTO"
function WriteWord()
WshShell.SendKeys "P@ssw0rd"
end function
wscript.Sleep(1000 )
wshShell.SendKeys "{ENTER}"
или так:
Код VBS
Set WshShell = CreateObject ("Wscript.Shell" )
Set WshEnv = WshShell.Environment("PRocess" )
WshShell.Run "runas.exe /user:DomenKompanii\emigachev C:\WD\1Cv7\BINOP\1CV7s.exe"
Wscript.Sleep 800
WshShell.AppActivate WshEnv("SystemRoot" ) & "\system32\runas.exe"
Wscript.Sleep 200
WshShell.SendKeys "P@ssw0rd"
Wscript.Sleep 500
Категория:
Администрирование Как проиграть wav, mp3 файл Код 1C v 8.х ScriptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
ScriptCtrl.Language = "vbs cript";
ScriptCtrl.AddCode("
Function PlayS()
| Set Wrap = CreateObject(""DynamicWrapper"")
| Wrap.Register ""winmm.dll"", ""sndPlaySound"", ""i=sl"", ""f=s"", "r=l""
| PlayS = Wrap.sndPlaySound(""C:\Sounds\newemail.wav"", SDN_ASYNC)
| End Function");
ScriptCtrl.Run("PlayS");
Категория:
COM-объекты, WMI, WSH Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение( "export.rbc.ru" ) ;
ИмяФайла = ПолучитьИмяВременногоФайла( ".txt" ) ;
СтрокаСоединения= "/free/" + Источник+ "/free.fcgi?period=DAILY&tickers=" + Валюта1 + "&d1=" + День1 + "&m1=" + Месяц1 + "&y1=" + Год1 + "&d2=" + День2 + "&m2=" + Месяц2 + "&y2=" + Год2 + "&separator=%7C&data_format=BROWSER" ;
СтрокаСоединения= СтрЗаменить( СтрокаСоединения, " " , "" ) ;
Попытка
Соединение. Получить( СтрокаСоединения, ИмяФайла) ;
Исключение
Сообщить( "Невозможно получить курс по адресу http://export.rbc.ru" + СтрокаСоединения) ;
КонецПопытки ;
КурсыТекст= Новый ТекстовыйДокумент;
КурсыТекст. Прочитать( ИмяФайла) ;
Код 1C v 8.х
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
соминет. open ( "GET" , Адресс, Ложь ) ;
соминет. send( ) ;
Возврат соминет. responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
Возврат Формат( Дат, "ДФ="" гггг/ММ/дд"" " ) ;
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
Для А = 1 по Список. Количество( ) цикл
Если Список[а- 1 ]. Пометка тогда
Сообщить( "Загружаем курсы для " + Строка( Список[а- 1 ]. Значение) ) ;
Код = Строка( Список[а- 1 ]. Значение. Код) ;
Дат = ПериодС;
Пока Дат < = ПериодПо цикл
Стр = ПолучитьКакСтроку( "http://cbrates.rbc.ru/tsv/" + Код+ "/" + ПреобразоватьДату( Дат) + ".tsv" ) ;
Поз = Найти( Стр, Символы. Таб) ;
Если Поз = 0 Тогда
Дат = Дат + 86400 ;
Продолжить;
КонецЕсли ;
Кратность = Число( СокрЛП( Лев( стр, Поз- 1 ) ) ) ;
курс = Число( СокрЛП( Сред( Стр, Поз+ 1 , СтрДлина( Стр) - Поз) ) ) ;
Сообщить( "Дата=" + Строка( Дат) + " Курс=" + Строка( курс) + " Кратность=" + Строка( Кратность) ) ;
Запись = РегистрыСведений. КурсыВалют. СоздатьМенеджерЗаписи( ) ;
Запись. Период = Дат;
Запись. Валюта = Список[а- 1 ]. Значение. Ссылка;
Запись. Курс = Курс;
Запись. Кратность = Кратность;
Запись. Записать( Истина ) ;
Дат = Дат + 86400 ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbs cript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH Алгоритм шифрования RC4 Для решения некоторых задач, иногда требуется имееть возможность шифровать и дешифровывать, какие-то данные. Но при этом нет возможности использовать стороние внешнии компоненты.
Предлагаем пример реализации алгоритма шифрования RC4 на встроенном языке 1С.
Код 1C v 7.x // оперделим два массива для формирования S-Блока
перем масТемп[254], масSБлок[254];
// переменая для управления объектом Script Control
перем олеШелл;
//*******************************************
// стрКодировать(стрИсточник, стрКлюч)
//
// Параметры:
// стрИсточник - Строка. Набор симвлов для преобразования.
// стрКлюч - Строка. Набор симвлов для формирования S-Блока.
//
// Возвращаемое значение:
// Строка. Набор симвлов после преоброзования.
//
// Описание:
// Функция шифрует или дешифрует набор символов с помощью
// S-Блока сформированного на основе ключа.
//
функция стрКодировать(стрИсточник, стрКлюч)
// Инициализация данных для формирования S-Блока
чисДлинаКлюча = стрдлина(стрКлюч);
у = 0;
для х = 1 по 254 цикл
у = у + 1;
у = ?(у > чисДлинаКлюча, 1, у);
масТемп[х] = кодсимв(сред(стрКлюч, у, 1));
масSБлок[х] = х - 1;
конеццикла;
// Формирование S-Блока
у = 0;
для х = 1 по 254 цикл
у = (у + масТемп[х] + масSБлок[х]) % 254 + 1;
чисТемп = масSБлок[х];
масSБлок[х] = масSБлок[у];
масSБлок[у] = чисТемп;
конеццикла;
// Ну и сообственно преобразование
чисДлинаТекста = стрдлина(стрИсточник);
у = 0;
ч = 0;
для х = 1 по чисДлинаТекста цикл
чисБайт = кодсимв(сред(стрИсточник, х, 1));
у = (у + 1) % 254 + 1;
ч = (ч + масSБлок[у]) % 254 + 1;
чисТемп = масSБлок[у];
масSБлок[у] = масSБлок[ч];
масSБлок[ч] = чисТемп;
чисТемп = масSБлок[(масSБлок[у] + масSБлок[ч]) % 254 + 1];
чисБайт = число(олеШелл.Run("intXOR", чисБайт, чисТемп));
Ответ = Ответ + симв(чисБайт);
конеццикла;
// Возвращаем полученную строку
возврат Ответ;
конецфункции
//*******************************************
// Этот блок обязателен.
// Необходимо что бы он отработал до первого вызова
// функции стрКодировать
//*******************************************
// Создаем объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// Устанавливаем рабочий язык для выполнения скриптов
олеШелл.Language = "VBS cript";
// Сам срипт для проведения логически-исключающего сложение двух операндов
стрКод =
"function intXOR(x, y)
| intXOR = x xor y
|end function";
// Добавим наш скрипт в котрол скриптов
олеШелл.AddCode(стрКод);
Ответ = стрКодировать("Это пример реализации алгоритма шифрования RC4 на языке 1С", "Казахстанский Клуб профессионалов 1С");
сообщить(Ответ);
Ответ = стрКодировать(Ответ, "Казахстанский Клуб профессионалов 1С");
сообщить(Ответ);
Скачивать файлы может только зарегистрированный пользователь!
Решение предложил IUnknown Категория:
COM-объекты, WMI, WSH Получить статус сетевой карты(устройства), Работает или уже нет Код 1C v 7.x // Глобальная переменная в которой будем хранить
// известные нам типы статусов сетевой карты
перем сзТипСтатуса;
// Глобальная переменая
перем обШелл;
//*******************************************
// стрСтатусАдаптера(стрИмя = "")
//
// Параметры:
// стрИмя - Строка. Имя сетевой статус которой надо определить.
// В том виде как показа в сетвых подключениях.
//
// Возвращаемое значение:
// Строка. Статус заданой сетевой.
//
// Описание:
// Функция определяет статус сетевой.
//
функция стрСтатусАдаптера(стрИмя = "")
Ответ = "";
// Попытаемся получить статус через контрол скриптов
попытка
сзСтевые = создатьобъект("списокзначений");
// Выполняем скрипт. Из полученного значения пытаемся
// сформировать список значений
сзСтевые = значениеизстроки(обШелл.Run("strGetAdapterInfo"));
исключение
// По каким-то причинам выполнить скрипт не удалось
Ответ = "Статус установить не удалось";
конецпопытки;
// Если в возращаемом значение пустая строка, то скрипт
// выполнился. Можно смотреть дальше.
если Ответ = "" тогда
// Получаем индекс статуса сетевой.
стрСтатус = строка(сзСтевые.Получить(стрИмя));
// Проверяем на пустое значение индекса.
если пустоезначение(стрСтатус) = 1 тогда
// Если индекс пуст, то сетевая суказанным именем отсуствует
Ответ = "Сетевая с таким именем отсуствует";
иначе
// Ищем индекс статуса в известных нам типов статуса.
чисПозиция = сзТипСтатуса.НайтиЗначение(стрСтатус);
если чисПозиция = 0 тогда
// Не нашли. Смотрим MSDN
Ответ = "Не известный тип статуса сетевой";
иначе
// Получаем строковое представление статуса.
сзТипСтатуса.ПолучитьЗначение(чисПозиция, Ответ);
конецесли;
конецесли;
конецесли;
// Возвращаем полученный статус
возврат Ответ;
конецфункции;
//*******************************************
// Этот блок обязателен.
// Необходимо что бы он отработал до первого вызова
// функции стрСтатусАдаптера
//*******************************************
// Создаем объект для управления скриптами
обШелл = создатьобъект("MSScriptControl.ScriptControl");
// Устанавливаем рабочий язык для выполнения скриптов
обШелл.Language = "VBS cript";
// Сам срипт который соберет статусы всех сетевых устройств
тхтКод = "
|function strGetAdapterInfo()
| dim objNetworkAdapter
| Answer = ""{""""СписокЗначений"""",{""
| set objWMI = getobject(""WinMgmts:\\.\Root\CIMV2"")
| set objNetworkAdapters = objWMI.ExecQuery(""S_elect * FROM Win32_NetworkAdapter"", , 48)
| for each objNetworkAdapter in objNetworkAdapters
| Answer = Answer & ""{{""""Строка"""","""""" & objNetworkAdapter.NetConnectionStatus &_
| """"""}, """""" & objNetworkAdapter.NetConnectionID & """""",""""0""""}""
|
| next
| Answer = Answer & ""}}""
| strGetAdapterInfo = Answer
| end function";
// Добавим наш скрипт в котрол скриптов
обШелл.AddCode(тхтКод);
// Создадим список значений в который поместим все известные нам
// виды статуса сетевых устройств.
сзТипСтатуса = создатьобъект("списокзначений");
// Поместим в список значений виды статусов их строковое представление
сзТипСтатуса.ДобавитьЗначение("0", "Отключенно");
сзТипСтатуса.ДобавитьЗначение("1", "Подключение");
сзТипСтатуса.ДобавитьЗначение("2", "Подключено");
сзТипСтатуса.ДобавитьЗначение("3", "Отключение");
сзТипСтатуса.ДобавитьЗначение("4", "Устройство не представленно");
сзТипСтатуса.ДобавитьЗначение("5", "Устройство отключено");
сзТипСтатуса.ДобавитьЗначение("6", "Устройство не исправно");
сзТипСтатуса.ДобавитьЗначение("7", "Соединение разорвано");
сзТипСтатуса.ДобавитьЗначение("8", "Аутентификация");
сзТипСтатуса.ДобавитьЗначение("9", "Аутентификация прошла успешно");
сзТипСтатуса.ДобавитьЗначение("10", "Аутентификация не прошла");
сзТипСтатуса.ДобавитьЗначение("11", "Неправильный адресс");
сзТипСтатуса.ДобавитьЗначение("12", "Требуется полномочия");
IUnknown Категория:
COM-объекты, WMI, WSH