Проверка на корректность адреса Электронной Почты, e-mail Каким образом можно организовать проверку на корректность адреса электронной почты?
Код 1C v 8.х Шаблон = ".+@.+\..+" ;
СтрокаАдреса = "ivanov@mail.com" ;
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. MultiLine = Ложь ;
RegExp. Global = Истина ;
RegExp. IgnoreCase = Истина ;
RegExp. Pattern = Шаблон;
Если RegExp. Test( СтрокаАдреса) Тогда
Сообщить( "Корректный адрес" ) ;
Иначе
Сообщить( "Некорректный адрес" ) ;
КонецЕсли ;
Для 7.7 в вышеуказанном коде заменить создание объекта на:
Код 1C v 7.x RegExp = CreateObject ("VBScript.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"
'Путь к фалу запуска программы 1С
one1CPath = """%systemdrive%\Program Files\1cv81\bin\1cv8.exe"""
'Параметры запуска базы (SQL) имя кластера\имя базы пользователь пароль
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С и логи:
Категория:
Администрирование Установка атрибутов файлу на закладке "Сводка" Смысл в следующем. В windows присутствует файл библиотеки dsofile.dll (
Скачивать файлы может только зарегистрированный пользователь! ), при помощи которого эти самые свойства можно получать или устанавливать.
Небольшая процедурка, как установить свойства:
Код 1C v 7.x Процедура глУстановитьСвойстваЗакладкиСводка(текФайл, тОписание="", тАвтор="", тКлючевыеСлова="", тФирма="", тКатегория="", тЗаголовок="", тТема="") Экспорт
Попытка
ФайлДляУстановки = CreateObject ("DSOFile.OleDocumentProperties");
ФайлДляУстановки.Open(текФайл);
ФайлДляУстановки.SummaryProperties.Author = тАвтор;
ФайлДляУстановки.SummaryProperties.Keywords = тКлючевыеСлова;
ФайлДляУстановки.SummaryProperties.Company = тФирма;
ФайлДляУстановки.SummaryProperties.Category = тКатегория;
ФайлДляУстановки.SummaryProperties.Comments = тОписание;
ФайлДляУстановки.SummaryProperties.Subject = тТема;
ФайлДляУстановки.SummaryProperties.Title = тЗаголовок;
ФайлДляУстановки.Save();
ФайлДляУстановки=0;
Исключение
Сообщить("Не удалось установить параметры файла, не зарегистрирована библиотека!","!!!");
КонецПопытки;
КонецПроцедуры
и как получить:
Код 1C v 7.x Процедура глПолучитьСвойстваЗакладкиСводка(текФайл) Экспорт
Попытка
ФайлДляУстановки = CreateObject ("DSOFile.OleDocumentProperties");
ФайлДляУстановки.Open(текФайл);
тАвтор = ФайлДляУстановки.SummaryProperties.Author;
тКлючевыеСлова= ФайлДляУстановки.SummaryProperties.Keywords;
тФирма= ФайлДляУстановки.SummaryProperties.Company;
тКатегория= ФайлДляУстановки.SummaryProperties.Category;
тОписание= ФайлДляУстановки.SummaryProperties.Comments;
тТема= ФайлДляУстановки.SummaryProperties.Subject;
тЗаголовок= ФайлДляУстановки.SummaryProperties.Title;
ФайлДляУстановки=0;
Исключение
Сообщить("Не удалось прочитать параметры файла, не зарегистрирована библиотека!","!!!");
КонецПопытки;
КонецПроцедуры
Автор: maxpiter
Категория:
COM-объекты, WMI, WSH Работа с буфером обмена средствами 1С Копировать из 1С в буфер обмена( без ВК):
Код 1C v 8.х ЭлементыФормы. Добавить( Тип( "ПолеHTMLДокумента" ) , "Поле_HTML_Документа_acb123" , Ложь ) ;
Окно = ЭлементыФормы. Поле_HTML_Документа_acb123. Документ. ParentWindow;
Окно. ClipboardData. SetData( "Text" , ТекстПисьма) ;
ЭлементыФормы. Удалить( ЭлементыФормы. Индекс( ЭлементыФормы. Найти( "Поле_HTML_Документа_acb123" ) ) ) ;
Вставить в 1С из буфера обмена:
Код 1C v 8.х ЭлементыФормы. Добавить( Тип( "ПолеHTMLДокумента" ) , "Поле_HTML_Документа_acb123" , Ложь ) ;
Окно = ЭлементыФормы. Поле_HTML_Документа_acb123. Документ. ParentWindow;
СодержимоеБуфера = Окно. ClipboardData. GetData( "Text" ) ;
ЭлементыФормы. Удалить( ЭлементыФормы. Индекс( ЭлементыФормы. Найти( "Поле_HTML_Документа_acb123" ) ) ) ;
ТекстПисьма = ТекстПисьма + СодержимоеБуфера;
При определенных настройках политики безопасности, способ с ПолеHTMLДокумента НЕ работает, используйте:
Код 1C v 8.х
Функция ПолучитьТекстБуфераОбмена() Экспорт
#Если Клиент Тогда
Объект = Новый COMОбъект( "htmlfile" ) ;
Возврат Объект. ParentWindow. ClipboardData. Getdata( "Text" ) ;
#КонецЕсли
КонецФункции
Функция УстановитьТекстВБуферОбмена(Текст) Экспорт
#Если Клиент Тогда
Объект = Новый COMОбъект( "htmlfile" ) ;
Объект. ParentWindow. ClipboardData. Setdata( "Text" , Текст) ;
Возврат Текст;
#КонецЕсли
КонецФункции
Для 7.7:
Код 1C v 7.x Set objHTM = CreateObject ("htmlfile");
Текст = "Помощь в 1С";
objHTM.ParentWindow.ClipboardData.Setdata("Text", Текст);
Текст = objHTM.ParentWindow.ClipboardData.GetData("text");
Используя
WSH :
Код 1C v 8.х
wsh= Новый COMОбъект( "WScript.Shell" ) ;
wsh. SendKeys( "^c" ) ;
wsh. SendKeys( "^v" ) ;
Код 1C v 7.x
wsh= СоздатьОбъект( "WScript.Shell" ) ;
wsh. SendKeys( "^c" ) ;
wsh. SendKeys( "^v" ) ;
WshExtra = СоздатьОбъект( "WshExtra.Clipboard" ) ;
WshExtra. Copy( "Запись в буфер обмена" )
Текст = WshExtra. Paste( ) ;
Категория:
Полезные, Универсальные Функции Получить имя принтера выбранного по умолчанию Код 1C v 7.x // maharbA
Функция Hex(Пар)
Результат="";
Пока Пар>0 Цикл
Результат=Сред("0123456789ABCDEF",Пар+1,1)+Результат;
Пар=Цел(Пар/16) ;
КонецЦикла;
Возврат ""+Результат;
КонецФункции
Функция ПолучитьПринтерПоУмолчанию()
ПринтерПоУмолчанию="";
Scr = CreateObject ("MSScriptControl.ScriptControl");
Scr.Language = "javascript";
Scr.Timeout=-1;
КоллекцияПринтеров = Service.ExecQuery("S_elect Name,Attributes from Win32_Printer");
Scr.AddObject("o",КоллекцияПринтеров);
e=Scr.eval("new Enumerator(o);");
Пока e.atEnd(0)=0 Цикл
БайтАтрибута=Прав(Hex(e.item(0).Attributes),1);
Если ((БайтАтрибута>"3") И (БайтАтрибута<"8")) или (БайтАтрибута>"B") Тогда
ПринтерПоУмолчанию=e.item(0).Name;
Прервать;
КонецЕсли;
e.moveNext(0);
КонецЦикла;
Возврат ПринтерПоУмолчанию;
КонецФункции
Категория:
COM-объекты, WMI, WSH Функции - Экспонента, Степень, Логарифм, Синус, Косинус, Тангенс Встроенные функции 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="VBscript";
Параметр=1234;
Корень=VBS.Eval("sqr("+СокрЛП(Параметр)+")");
Процедура Сформировать()
Ctrl=СоздатьОбъект("MSScriptControl.ScriptControl");
Ctrl.Language="vbscript";
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",ТекущаяДата())); // Название дня недели
Категория:
Работа с Числами Как в 1С автоматически переключать раскладку клавиатуры? Для этого можно использовать функционал следующих внешних компонент:
1. FormEx смотрите тут.
Код 1C v 7.x Сервис= СоздатьОбъект( "Сервис" ) ;
Сервис. РаскладкаКлавиатуры( "Russian" ) ;
2. Miracle смотрите тут.
3. NetaTable смотрите тут.
Код 1C v 7.x Если ( ЗагрузитьВнешнююКомпоненту( "NetaTable.dll" ) = 1 ) Тогда
РовнаяТаблица= СоздатьОбъект( "AddIn.NTable" ) ;
Иначе
Предупреждение( "Внешняя компонента AddIn.NetaTable НЕ подключена!!!" + РазделительСтрок+ "Работа программы невозможна!!!" ) ;
СтатусВозврата( 0 ) ;
Возврат
КонецЕсли ;
Процедура ПриНачалеВыбораЗначения(ИдентЭлемента,ФлагОтбора)
Если ИдентЭлемента = "Диагноз" Тогда
РовнаяТаблица. УстановитьРаскладку( 67699721 ) ;
ИначеЕсли ИдентЭлемента = "ИсточникФинансирования" Тогда
РовнаяТаблица. УстановитьРаскладку( 68748313 ) ;
КонецЕсли ;
КонецПроцедуры
А можно и без внешних компонент:
Код 1C v 7.x //примеры Sserj
Процедура СменитьРаскладку(Реж)
//Можно и просто через wrapper.dll
//Wrapper = CreateObject ("DynamicWrapper");
//Wrapper.Register("USER32.DLL", "ActivateKeyboardLayout", "i=ll", "f=s", "r=l");
//Wrapper.Register("USER32.DLL", "LoadKeyboardLayout", "i=sl", "f=s", "r=l");
//rus = Wrapper.LoadKeyboardLayout("00000419", 0);
//eng = Wrapper.LoadKeyboardLayout("00000409", 0);
//Если Реж = "RUS" Тогда
// Wrapper.ActivateKeyboardLayout(rus, 0);
//ИначеЕсли Реж = "EN" Тогда
// Wrapper.ActivateKeyboardLayout(eng , 0);
//КонецЕсли;
Если Не (Константа.ВключатьНамЛоокВТелефонах = Истина) Тогда
Возврат;
КонецЕсли;
wshShell=createObject ("wScript.shell");
Если Реж = "RUS" Тогда
wshShell.SendKeys("^(8)",0);
ИначеЕсли Реж = "EN" Тогда
wshShell.SendKeys("^(9)",0);
КонецЕсли;
КонецПроцедуры // СменитьРаскладку(Реж)
//ЕЩЕ
//Обновляем хоткеи смены языков, для подмены в полях где нужна английская раскладка
текст = СоздатьОбъект("текст");
текст.ДобавитьСтроку("Windows Registry Editor Version 5.00");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000100]");
текст.ДобавитьСтроку("""Virtual Key""=hex:39,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:09,04,09,04");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000101]");
текст.ДобавитьСтроку("""Virtual Key""=hex:38,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:19,04,19,04");
ИмяФайла = КаталогИБ() + "LangHotKey.reg";
Попытка
текст.Записать(ИмяФайла);
wshShell=createObject ("wScript.shell");
StrComand = "regedit /S " + СокрЛП(ИмяФайла);
wshShell.Run(StrComand,1);
//Задерживаемся, иначе скрипт не успевает прочитать файл
Для Сч=1 По 50000 Цикл
КонецЦикла;
ФС.УдалитьФайл(ИмяФайла);
Исключение
КонецПопытки;
Категория:
Полезные, Универсальные Функции Как подключиться (присоединится) к базе 1С 8 через СОМ Код 1C v 8.х //Пример 1
v8 = CreateObject ("V8.COMConnector");
//Строку подключения можно получить так:
Если ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + КаталогБазыДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Сервер + "'; ref='" + БазаДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "';";
КонецЕсли;
Попытка
//Соединение = V8.Connect("Usr=""admin"";Pwd="""";File=""\\srvr\1C\V8\UPP""");
Соединение = V8.Connect(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Пример 2
Функция ОткрытьСоединение(ОписаниеОшибки) Экспорт
СтрокаПодключения = СформироватьСтрокуПодключения();
Connector = Новый COMОбъект("V8.ComConnector");
Попытка
DataSource = Connector.Connect(СтрокаПодключения);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
КонецПопытки;
Если DataSource = Неопределено И ПустаяСтрока(ОписаниеОшибки) Тогда
ОписаниеОшибки = "Неизвестная ошибка подключения к 1С:Предприятие 8.0";
КонецЕсли;
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
DataSource = Неопределено;
Connector = Неопределено;
КонецЕсли;
Возврат DataSource;
КонецФункции
Функция СформироватьСтрокуПодключения()
СтрокаПодключения = "";
Если ЭтоСервер Тогда
СтрокаПодключения = СтрокаПодключения + "Srvr=" + Сервер + ";Ref=" + Имя + ";";
Иначе
СтрокаПодключения = СтрокаПодключения + "File=""" + Сервер + """;";
КонецЕсли;
СтрокаПодключения = СтрокаПодключения + ?(ПустаяСтрока(Пользователь), "", "Usr=""" + Пользователь + """;");
СтрокаПодключения = СтрокаПодключения + ?(ПустаяСтрока(Пароль), "", "Pwd=""" + Пароль + """;");
Возврат СтрокаПодключения;
КонецФункции
Посмотрите еще ответ на вопрос:
Как определить Информационная База файловая или SQL? Категория:
COM-объекты, WMI, WSH Выгрузка используемых видов расчетов в таблицу значений Код 1C v 7.x ТЗВидыРасчётов = Новый ТаблицаЗначений;
ТЗВидыРасчётов.Колонки.Добавить("ВидРасчёта");
ЖРЗарплата = v7.CreateObject ("ЖурналРасчетов.Зарплата");
ЖРЗарплата.ВыбратьЗаписи(НачДата,КонДата);
Пока ЖРЗарплата.ПолучитьЗапись() = 1 Цикл
СтрВидыРасчётов = ТЗВидыРасчётов.Добавить();
СтрВидыРасчётов.ВидРасчёта = ЖРЗарплата.ВидРасч.Наименование;
КонецЦикла;
ЖРДополнительный = v7.CreateObject ("ЖурналРасчетов.Дополнительный");
ЖРДополнительный.ВыбратьЗаписи(НачДата,КонДата);
Пока ЖРДополнительный.ПолучитьЗапись() = 1 Цикл
СтрВидыРасчётов = ТЗВидыРасчётов.Добавить();
СтрВидыРасчётов.ВидРасчёта = ЖРДополнительный.ВидРасч.Наименование;
КонецЦикла;
ЖРНалогиСФОТ = v7.CreateObject ("ЖурналРасчетов.НалогиСФОТ");
ЖРНалогиСФОТ.ВыбратьЗаписи(НачДата,КонДата);
Пока ЖРНалогиСФОТ.ПолучитьЗапись() = 1 Цикл
СтрВидыРасчётов = ТЗВидыРасчётов.Добавить();
СтрВидыРасчётов.ВидРасчёта = ЖРНалогиСФОТ.ВидРасч.Наименование;
КонецЦикла;
ЖРСтраховыеВзносы = v7.CreateObject ("ЖурналРасчетов.СтраховыеВзносы");
ЖРСтраховыеВзносы.ВыбратьЗаписи(НачДата,КонДата);
Пока ЖРСтраховыеВзносы.ПолучитьЗапись() = 1 Цикл
СтрВидыРасчётов = ТЗВидыРасчётов.Добавить();
СтрВидыРасчётов.ВидРасчёта = ЖРСтраховыеВзносы.ВидРасч.Наименование;
КонецЦикла;
Написал
IKSparrow Категория:
Виды расчетов Работа с журналом расчетов в 1С7.7 из 1С 8.1 через Com соединение Недавно делал перенос справочников и документов из 1С 7.7 "Зарплата и кадры" в 1С 8.1 "Управление торговым предприятием" через Com соединение. Во время переноса столкнулся с некоторыми проблемами. Одна из них - это при выполнении запроса очень важно правильно указать синтаксис передаваемых значений, особенно даты, иначе запрос не будет выполняться. Как правильно написать запрос? Смотрим:
Код 1C v 8.х //Создадим Com объект для подключения к 1С 77
База77 = Новый COMObject("V77.Application");
//Устанавливаем соединение
Открыта = База77.Initialize(База77.RMTrade,"/d" + ПутьКБазе77,"NO_SPLASH_SHOW");
Если Открыта Тогда
Предупреждение("Ошибка открытия информационной базы!");
Иначе
Сообщить("БАЗА ОТКРЫТА УСПЕШНО!");
Конецесли;
//Определим дату из периода за который
//необходимо выбрать данные
ДатаПериода = ТекущаяДата();
//Подключимся к журналу расчетов
Зрп = База77.CreateObject ("ЖурналРасчетов.Зарплата");
//Получим период журнала расчета по нашей дате
//переведем в формат без времени
НТП = Формат(Зрп.НачалоПериодаПоДате(ДатаПериода),"ДЛФ=Д");
КТП = Формат(Зрп.КонецПериодаПоДате(ДатаПериода),"ДЛФ=Д");
//Напишем текст запроса
//обратите внимание на установку периода в запросе
//Если неправильно написать, будет вылазить ошибка
ТекстЗапр = "//{{ЗАПРОС(ВидыРасч)
|Период с '" + НТП + "' по '" + КТП + "';
|Вир = ЖурналРасчетов.Зарплата.ВидРасч;
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Дни = ЖурналРасчетов.Зарплата.Дни;
|ДатаНачала = ЖурналРасчетов.Зарплата.ДатаНачала;
|ДатаОкончания = ЖурналРасчетов.Зарплата.ДатаОкончания;
|Часы = ЖурналРасчетов.Зарплата.Часы;
|Субконто = ЖурналРасчетов.Зарплата.Субконто;
|Сот = ЖурналРасчетов.Зарплата.Объект;
|КодОбъекта = ЖурналРасчетов.Зарплата.Объект.Код;
|Функция РезСумма = Сумма(Рез);
|Группировка Сот;
|Группировка Вир;
|"//}}ЗАПРОС
;
//Создаем объект типа запрос
Запр = База77.CreateObject ("Запрос");
//Выполним запрос, если успешно делаем выборку
Если Запр.Выполнить(ТекстЗапр) <> 0 Тогда
Пока Запр.Группировка("Сот") = 1 Цикл
Пока Запр.Группировка("Вир") = 1 Цикл
//...................
//Здесь пишем код выборки и обработки полученных данных
Конеццикла;
Конеццикла;
Конецесли;
Если нам необходимо установить отбор в журнале, например по сотруднику, то сделать это можно следующим образом:
Код 1C v 8.х
"|КодОбъекта = ЖурналРасчетов.Зарплата.Объект.Код;"
"|Условие(КодОбъекта = " + Сотр. код + ");"
Из журнала расчетов можно выбрать записи без запроса, методом прямой выборки. В некоторых ситуациях этот способ может быть даже удобней чем через запрос. В данном случае синтаксис будет довольно простым:
Код 1C v 7.x Запр = База77.CreateObject ("ЖурналРасчетов.Зарплата");
Запр.ВыбратьЗаписиПоОбъекту(Сотр,НТП,КТП);
Пока Запр.ПолучитьЗапись() = 1 Цикл
//Делаем обработку выборки
Конеццикла;
Написал Валецкий Станислав Категория:
Журналы расчетов Как получить уникальный идентификатор объекта, GUID? GUID (Globally 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 Цикл
Объект = БазаОле. ЗначениеВстрокуВнутр( Док_Источник. ТекущийДокумент( ) ) ;
ИдентификаторДокумента = СокрЛП( ПолучитьИД( Объект) ) ;
КонецЦикла ;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Категория:
Встроенные Функции Пример переноса данных из 1С 7.7 в 8.1 посредством XML файла Код 1C v 7.x xmldoc = CreateObject ("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2 . Найти( Кош, "Описатель" ) ;
Возврат Стр. Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2 . Найти( Кош, "Описатель" ) ;
Возврат Стр. Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20" + сред( дат, 7 , 2 ) + сред( дат, 4 , 2 ) + лев( дат, 2 ) ;
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект( "MSXML2.DOMDocument" ) ;
xmlDoc. load( "C:\budjet.xml" ) ;
nodeRoot = xmlDoc. documentElement;
Для каждого nod из nodeRoot. childNodes цикл
Если nod. nodeName = "СправочникРасходы" тогда
Сообщить( "нашли СправочникРасходы" ) ;
ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Код" ) ;
ТЗ. Колонки. Добавить( "Наименование" ) ;
ТЗ. Колонки. Добавить( "Родитель" ) ;
ТЗ. Колонки. Добавить( "Цена" ) ;
ТЗ. Колонки. Добавить( "Количество" ) ;
ТЗ. Колонки. Добавить( "ЭтоГруппа" ) ;
Для Каждого Расход из nod. childNodes Цикл
Строка = ТЗ. Добавить( ) ;
Строка. Код = Расход. getAttribute( "Код" ) ;
Строка. Наименование = Расход. getAttribute( "Наименование" ) ;
Строка. Родитель = Расход. getAttribute( "Родитель" ) ;
Строка. Цена = Число( Расход. getAttribute( "Цена" ) ) ;
Строка. Количество = Число( Расход. getAttribute( "Количество" ) ) ;
Строка. ЭтоГруппа = ? ( Расход. getAttribute( "ЭтоГруппа" ) = "1" , True, Ложь ) ;
КонецЦикла ;
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники. СтатьиЗатрат. НайтиПоНаименованию( Стр. Родитель, истина ) ;
Справ = Справочники. СтатьиЗатрат. НайтиПоНаименованию( Стр. Наименование, истина ) ;
Если Справ = Справочники. СтатьиЗатрат. ПустаяСсылка( ) тогда
Если Стр. ЭтоГруппа тогда
Справ = Справочники. СтатьиЗатрат. СоздатьГруппу( ) ;
Справ. Код = Стр. Код;
Справ. Наименование = Стр. Наименование;
Справ. Родитель = Родитель;
Справ. Записать( ) ;
Иначе
Справ = Справочники. СтатьиЗатрат. СоздатьЭлемент( ) ;
Справ. Код = Стр. Код;
Справ. Наименование = Стр. Наименование;
Справ. Родитель = Родитель;
Справ. Цена = Стр. Цена;
Справ. Количество = Стр. Количество;
Справ. Записать( ) ;
КонецЕсли ;
Иначе
КонецЕсли ;
КонецЦикла ;
ИначеЕсли nod. nodeName = "ДвижениеСчетов" тогда
Сообщить( "нашли движения счетов" ) ;
ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Приход" ) ;
ТЗ. Колонки. Добавить( "Дата" ) ;
ТЗ. Колонки. Добавить( "Описатель" ) ;
ТЗ. Колонки. Добавить( "Статья" ) ;
ТЗ. Колонки. Добавить( "Цена" ) ;
ТЗ. Колонки. Добавить( "Количество" ) ;
Для каждого движ из nod. childNodes цикл
Строка = ТЗ. Добавить( ) ;
Строка. Приход = ? ( движ. getAttribute( "Приход" ) = "1" , True, Ложь ) ;
Строка. Дата = Дата( Дата1 С( движ. getAttribute( "Дата" ) ) ) ;
Строка. Описатель = движ. getAttribute( "Описатель" ) ;
Строка. Статья = Справочники. СтатьиЗатрат. НайтиПоНаименованию( движ. getAttribute( ? ( Строка. Приход, "СтатьяПоступлений" , "СтатьяРасходов" ) ) , истина ) ;
Строка. Цена = Число( движ. getAttribute( "Остаток" ) ) ;
Строка. Количество = Число( движ. getAttribute( "Количество" ) ) ;
КонецЦикла ;
ТЗ. ВыбратьСтроку( ) ;
Доки = Новый ТаблицаЗначений;
Доки. Колонки. Добавить( "Док" ) ;
Доки. Колонки. Добавить( "Дата" ) ;
Доки. Колонки. Добавить( "КошелекС" ) ;
Доки. Колонки. Добавить( "КошелекНа" ) ;
Доки. Колонки. Добавить( "Статья" ) ;
Доки. Колонки. Добавить( "ВалютаС" ) ;
Доки. Колонки. Добавить( "ВалютаНа" ) ;
Доки. Колонки. Добавить( "ЦенаС" ) ;
Доки. Колонки. Добавить( "ЦенаНа" ) ;
Доки. Колонки. Добавить( "Количество" ) ;
УжеЕстьДок= Ложь ;
док= 0 ;
Для Каждого Стр Из ТЗ цикл
Если Стр. Приход Тогда
Если УжеЕстьДок тогда
Док. КошелекНа = Кошель( Стр. Описатель) ;
Док. ВалютаНа = Вал( Стр. Описатель) ;
Док. ЦенаНа = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
УжеЕстьДок= Ложь ;
Иначе
Док = Доки. Добавить( ) ;
Док. КошелекНа = Кошель( Стр. Описатель) ;
Док. ВалютаНа = Вал( Стр. Описатель) ;
Док. ЦенаНа = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
Док. Док = "ПоступлениеСредств" ;
КонецЕсли ;
Иначе
Док = Доки. Добавить( ) ;
Док. КошелекС = Кошель( Стр. Описатель) ;
Док. ВалютаС = Вал( Стр. Описатель) ;
Док. ЦенаС = Стр. Цена;
Док. Количество = Стр. Количество;
Док. Статья = Стр. Статья;
Если СокрЛП( Стр. Статья. Наименование) = "Обмен валюты" тогда
Док. Док = "ОбменВалюты" ;
УжеЕстьДок= истина ;
ИначеЕсли СокрЛП( Стр. Статья. Наименование) = "Перевод средств" тогда
Док. Док = "ПереводСредств" ;
УжеЕстьДок= истина ;
Иначе
Док. Док = "РасходСредств" ;
УжеЕстьДок= Ложь ;
КонецЕсли ;
КонецЕсли ;
Док. Дата = Стр. Дата;
КонецЦикла ;
Доки. ВыбратьСтроку( ) ;
КонецЕсли ;
КонецЦикла ;
Для Каждого Док из Доки Цикл
Если Док. Док = "ПоступлениеСредств" тогда
Докум = Документы. ПоступлениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекНа;
Докум. Валюта = Док. ВалютаНа;
Докум. Сумма = Док. ЦенаНа;
Докум. Статья = Док. Статья;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
ИначеЕсли Док. Док = "ПереводСредств" тогда
Докум = Документы. ПеремещениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. КошелекКуда = Док. КошелекНа;
Докум. КошелекОтКуда = Док. КошелекС;
Докум. Валюта = Док. ВалютаНа;
Докум. Сумма = Док. ЦенаНа;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
ИначеЕсли Док. Док = "ОбменВалюты" тогда
Докум = Документы. ПеремещениеСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. КошелекКуда = Док. КошелекНа;
Докум. КошелекОтКуда = Док. КошелекС;
Докум. Валюта = Док. ВалютаС;
Докум. Сумма = Док. ЦенаС;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
Докум = Документы. ОбменВалюты. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекНа;
Докум. ВалютаС = Док. ВалютаС;
Докум. ВалютаНа = Док. ВалютаНа;
Докум. СуммаС = Док. ЦенаС;
Докум. СуммаНа = Док. ЦенаНа;
Докум. Курс = Докум. СуммаС / Докум. СуммаНа;
Докум. Переключатель = 1 ;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
Иначе
Докум = Документы. РасходСредств. СоздатьДокумент( ) ;
Докум. Дата = Док. Дата;
Докум. Кошелек = Док. КошелекС;
Докум. Валюта = Док. ВалютаС;
тч = Докум. Затраты. Добавить( ) ;
тч. Сумма = Док. ЦенаС;
тч. Статья = Док. Статья;
тч. Цена = Док. ЦенаС;
тч. Количество = Док. Количество;
Докум. Записать( РежимЗаписиДокумента. Проведение) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект( "MSXML2.DOMDocument" ) ;
xmlDoc. load( "C:\budjet.xml" ) ;
nodeRoot = xmlDoc. documentElement;
Для каждого nod из nodeRoot. childNodes цикл
Если nod. nodeName = "ДвижениеСчетов" тогда
Сообщить( "нашли движения счетов" ) ;
ТП1 = Новый ТаблицаЗначений;
ТП1 . Колонки. Добавить( "Описатель" ) ;
Типы = Новый Массив( 1 ) ; Типы[0 ] = Тип( "СправочникСсылка.Кошельки" ) ;
Тип = Новый ОписаниеТипов( Типы) ;
ТП1 . Колонки. Добавить( "Счет" , Тип) ;
Типы[0 ] = Тип( "СправочникСсылка.Валюты" ) ;
Тип = Новый ОписаниеТипов( Типы) ;
ТП1 . Колонки. Добавить( "Валюта" , Тип) ;
Для каждого движ из nod. childNodes цикл
Описатель = движ. getAttribute( "Описатель" ) ;
если ТП1 . Найти( Описатель, "Описатель" ) = Неопределено тогда
стр = ТП1 . Добавить( ) ;
Стр. Описатель = Описатель;
КонецЕсли ;
КонецЦикла ;
ТП2 = ТП1 ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Пример простой реализации OLE доступа из 8 к 77 Код 1C v 8.х V77 = Новый COMОбъект("V77M.Application");
Если V77.Initialize(V77.RMTrade,"ИсточникСтр","") Тогда
Сообщить("Успех");
Накл= V77.EvalExpr("CreateObject (""Документ.РасходнаяНакладная"")");
ДокОсн= V77.EvalExpr("CreateObject (""Документ"")");
Накл.ВыбратьДокументы();
Пока Накл.ПолучитьДокумент()=1 Цикл
Номер=СокрЛП(Накл.НомерДок);
ДокСоотв=Документы.РеализацияТоваров.НайтиПоНомеру(СокрЛП(Номер), Накл.ДатаДок);
Если Накл.Проведен()=0 Тогда
Продолжить;
КонецЕсли;
Если ДокСоотв=Документы.РеализацияТоваров.ПустаяСсылка() Тогда
Сообщить("! для "+Накл.Вид()+" "+Накл.НомерДок+" не найдено соответстствие");
Продолжить;
КонецЕсли;
Если Накл.ДокументОснование.Выбран()=0 Тогда
Продолжить;
КонецЕсли;
// и т.д.
Иначе Предупреждение("Ошибка открытия информационной базы");
Возврат;
КонецЕсли;
Категория:
COM-объекты, WMI, WSH Функция формирует объект Структура, содержащая метаданные 77 для составления прямых запросов Код 1C v 8.х Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт
МД = Новый Структура;
Состояние("Подключение к " + КаталогИБ);
V7 = Новый COMОбъект("V77.Application");
Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда
Сообщить("Нет доступа к информационной базе.");
Возврат Ложь;
КонецЕсли;
MDW = V7.CreateObject ("MetaDataWork");
MD = V7.Метаданные;
Состояние("Загрузка справочников..");
Ст1 = Новый Структура;
МД.Вставить("Справочник", Ст1);
Для Номер1 = 1 По MD.Справочник() Цикл
МДСправочник = MD.Справочник(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДСправочник.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник));
Для Номер2 = 1 По МДСправочник.Реквизит() Цикл
МДРеквизит = МДСправочник.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка перечислений..");
Ст1 = Новый Структура;
МД.Вставить("Перечисление", Ст1);
Для Номер1 = 1 По MD.Перечисление() Цикл
МДПеречисление = MD.Перечисление(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДПеречисление.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление));
Для Номер2 = 1 По МДПеречисление.Значение() Цикл
МДЗначение = МДПеречисление.Значение(Номер2);
Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+" ");
КонецЦикла;
КонецЦикла;
Состояние("Загрузка документов..");
Ст1 = Новый Структура;
МД.Вставить("Документ", Ст1);
Для Номер1 = 1 По MD.Документ() Цикл
МДДокумент = MD.Документ(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДДокумент.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент));
Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл
МДРеквизит = МДДокумент.РеквизитШапки(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл
МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка регистров..");
Ст1 = Новый Структура;
МД.Вставить("Регистр", Ст1);
Для Номер1 = 1 По MD.Регистр() Цикл
МДРегистр = MD.Регистр(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДРегистр.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр));
Для Номер2 = 1 По МДРегистр.Измерение() Цикл
МДИзмерение = МДРегистр.Измерение(Номер2);
Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Ресурс() Цикл
МДРесурс = МДРегистр.Ресурс(Номер2);
Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Реквизит() Цикл
МДРеквизит = МДРегистр.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
Возврат Истина;
КонецФункции
Формируется конечно не быстро, но Структура - объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.
Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
DmitrO Категория:
COM-объекты, WMI, WSH