1

Тема: Кодировка vbs при записи в файл 1С

добрый день! В скрипте, который записывает в файл 1С, есть такие строки

Set bases_81_File = ADODB.OpenTextFile(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\1C\1Cv81\ibases.v8i",2,True,-1)
Set bases_82_File = ADODB.OpenTextFile(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\1C\1CEStart\ibases.v8i",2,True,-1)

записать информацию нужно на русском языке, с первым файлом проблем нет. Во-второй если оставить параметр на конце -1, то запись не идет, если убрать то записывает, но русский язык не отображается. Как можно решить эту проблему?

2

Re: Кодировка vbs при записи в файл 1С

A13, приведите весь код. Что такое «ADODB»?

3

Re: Кодировка vbs при записи в файл 1С

Option Explicit

Const OverwriteExisting = True

Dim ADODB, WshShell
set WshShell = WScript.CreateObject("WScript.Shell")
Set ADODB = WScript.CreateObject("Scripting.FileSystemObject")

4

Re: Кодировка vbs при записи в файл 1С

Действительно, ADODB вводит в заблуждение .
A13, ознакомьтесь, в Вашем случае не помешает.

5

Re: Кодировка vbs при записи в файл 1С

A13, Вы по-прежнему приводите огрызки кода. Повторяю: приведите весь код.

6 (изменено: alexii, 2013-07-15 12:22:04)

Re: Кодировка vbs при записи в файл 1С

Option Explicit

Const OverwriteExisting = True

Dim FSO, WshShell
set WshShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")


dim objSysInfo,strUserDN,UserObj,GroupObj,UserGroups
Set objSysInfo = CreateObject("ADSystemInfo") 
strUserDN = objSysInfo.userName
Set UserObj = GetObject("LDAP://" & strUserDN)
For Each GroupObj In UserObj.Groups
UserGroups=UserGroups & "[" & GroupObj.Name & "]"
Next

dim bases_81_File,strText,bases_82_File,strText82

Set bases_81_File = FSO.OpenTextFile(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\1C\1Cv81\ibases.v8i",2,True,-1)
Set bases_82_File = FSO.OpenTextFile(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\1C\1CEStart\ibases.v8i",2,True)

Function Check_1cv81(GroupName,BaseName,pathToBase)
 If InStr(UserGroups,"[CN="+GroupName+"]") Then
  bases_81_File.WriteLine("["+BaseName+"]" & vbcrlf & "Connect="+pathToBase & vbcrlf & "ID=f2926bd0-b233-4353-9e35-bfce27d92759" & vbcrlf & "OrderInList=24576"& vbcrlf &"Folder=/"& vbcrlf &"OrderInTree=49152"& vbcrlf &"External=0")
  End If
End function

Check_1cv81 "1cv81_тест","1C тест","File=\\SRV1C\1cdb\test;"

Function Check_1cv82(GroupName,BaseName,pathToBase,id)
 If InStr(UserGroups,"[CN="+GroupName+"]") Then
  bases_82_File.WriteLine("["+BaseName+"]" & vbcrlf & "Connect="+pathToBase & vbcrlf & "ID=f2926bd0-b233-4353-9e35-bfce27d92"+id & vbcrlf & "OrderInList=24576"& vbcrlf &"Folder=/"& vbcrlf &"OrderInTree=49152"& vbcrlf &"External=0")
  End If
End function

Check_1cv82 "1cv82_тест","1C тест","Srvr=1c:1641;Ref=test","730"

bases_81_File.Close
bases_82_File.Close

7

Re: Кодировка vbs при записи в файл 1С

A13, судя по описанию, кодировка файла «ibases.v8i» — «UTF-8». Если в данном файле наличествует кириллица, либо 1С потребен BOM — это существенно, и методы «Scripting.FileSystemObject» не вполне применимы.

Как я понимаю, Вы, при совпадении, тупо переписываете эти файлы поверх и целиком, так?

Упакуйте существующие образцы оригинальных «ibases.v8i» для обеих версий в архив и выложите на RGhost.

8

Re: Кодировка vbs при записи в файл 1С

http://rghost.ru/47433115
http://rghost.ru/47433200

9

Re: Кодировка vbs при записи в файл 1С

A13, как-то так (не проверялось):

Option Explicit

Dim objFSO

Dim objIADsGroup
Dim strUserGroups

Dim strAppData
Dim strPath
Dim strContent


strUserGroups = ""

For Each objIADsGroup In GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").UserName).Groups
    strUserGroups = strUserGroups & "[" & objIADsGroup.Name & "]"
Next


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strAppData = WScript.CreateObject("Shell.Application").NameSpace("shell:AppData").self.Path

If InStr(strUserGroups, "[CN=1cv81_тест]") Then
    strPath = objFSO.BuildPath(strAppData, "1C\1Cv81")
    
    If objFSO.FolderExists(strPath) Then
        strContent = _
            "[1C тест]" & vbCrLf & _
            "Connect=File=""\\SRV1C\1cdb\test"";" & vbCrLf & _
            "ID=f2926bd0-b233-4353-9e35-bfce27d92759" & vbCrLf & _
            "OrderInList=24576" & vbCrLf & _
            "Folder=/" & vbCrLf & _
            "OrderInTree=49152" & vbCrLf & _
            "External=0"
        
        SaveToFile objFSO.BuildPath(strPath, "ibases.v8i"), strContent
    Else
        WScript.Echo "Path [" & strPath & "] not exists."
    End If
End If

If InStr(strUserGroups, "[CN=1cv82_тест]") Then
    strPath = objFSO.BuildPath(strAppData, "1C\1CEStart")
    
    If objFSO.FolderExists(strPath) Then
        strContent = _
            "[1C тест]" & vbCrLf & _
            "Connect=Srvr=1c:1641;Ref=test" & vbCrLf & _
            "ID=f2926bd0-b233-4353-9e35-bfce27d92" & "730" & vbCrLf & _
            "OrderInList=24576" & vbCrLf & _
            "Folder=/" & vbCrLf & _
            "OrderInTree=49152" & vbCrLf & _
            "External=0"
        
        SaveToFile objFSO.BuildPath(strPath, "ibases.v8i"), strContent
    Else
        WScript.Echo "Path [" & strPath & "] not exists."
    End If
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function SaveToFile(ByVal strFullFileName, ByVal strContent)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    Const adSaveCreateOverWrite = 2
    
    
    With WScript.CreateObject("ADODB.Stream")
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = "utf-8"
        .WriteText strContent
        
        .SaveToFile strFullFileName, adSaveCreateOverWrite
        
        .Close
    End With
End Function
'=============================================================================

10

Re: Кодировка vbs при записи в файл 1С

Спасибо!
Только вопрос, если необходимо несколько баз прописать, то какие копируем строчки?

11

Re: Кодировка vbs при записи в файл 1С

если необходимо несколько баз прописать,

Как это будет выглядеть?

12

Re: Кодировка vbs при записи в файл 1С

если смотреть мой скрипт:
Function Check_1cv81(GroupName,BaseName,pathToBase)
If InStr(UserGroups,"[CN="+GroupName+"]") Then
  bases_81_File.WriteLine("["+BaseName+"]" & vbcrlf & "Connect="+pathToBase & vbcrlf & "ID=f2926bd0-b233-4353-9e35-bfce27d92759" & vbcrlf & "OrderInList=24576"& vbcrlf &"Folder=/"& vbcrlf &"OrderInTree=49152"& vbcrlf &"External=0")
  End If
End function

Check_1cv81 "1cv81_тест","1C тест","File=\\SRV1C\1cdb\тест;"
Check_1cv81 "1cv81_тест2","1C тест2","Srvr=srv1c;Ref=тест2;"
Check_1cv81 "1cv81_тест3","1C тест3","Srvr=srv1c;Ref=тест3;"

13

Re: Кодировка vbs при записи в файл 1С

файл ibases
[1C тест]
Connect=File=\\SRV1C\1cdb\тест;
ID=f2926bd0-b233-4353-9e35-bfce27d92759
OrderInList=24576
Folder=/
OrderInTree=49152
External=0
[1C тест2]
Connect=Srvr=srv1c;Ref=тест2;
ID=f2926bd0-b233-4353-9e35-bfce27d92759
OrderInList=40960
Folder=/
OrderInTree=65536
External=0
[1C тест3]
Connect=Srvr=srv1c;Ref=тест3;
ID=f2926bd0-b233-4353-9e35-bfce27d92759
OrderInList=57344
Folder=/
OrderInTree=81920
External=0

14

Re: Кодировка vbs при записи в файл 1С

A13, а ко второй версии Вы ещё ID приписывали — это что?

15

Re: Кодировка vbs при записи в файл 1С

какой-то идентификатор базы, роли особой я не увидел, если будет повторяться не страшно

16

Re: Кодировка vbs при записи в файл 1С

A13, примерно так (не проверялось):

Option Explicit

Const strConfigFileName = "ibases.v8i"

Dim objFSO

Dim objIADsGroup
Dim strUserGroups

Dim strAppData
Dim strPath
Dim strContent


strUserGroups = ""

For Each objIADsGroup In GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").UserName).Groups
    strUserGroups = strUserGroups & "[" & objIADsGroup.Name & "]"
Next


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strAppData = WScript.CreateObject("Shell.Application").NameSpace("shell:AppData").self.Path

If InStr(strUserGroups, "[CN=1cv81_тест]") Then
    CreateConfig objFSO.BuildPath(strAppData, "1C\1Cv81"), "1C тест", "File=\\SRV1C\1cdb\test;", "f2926bd0-b233-4353-9e35-bfce27d92759"
    CreateConfig objFSO.BuildPath(strAppData, "1C\1Cv81"), "1C тест2", "File=\\SRV1C\1cdb\test2;", "bla-bla-bla"
End If

If InStr(strUserGroups, "[CN=1cv82_тест]") Then
    CreateConfig objFSO.BuildPath(strAppData, "1C\1CEStart"), "1C тест", "Srvr=1c:1641;Ref=test", "f2926bd0-b233-4353-9e35-bfce27d92730"
    CreateConfig objFSO.BuildPath(strAppData, "1C\1CEStart"), "1C тест2", "Srvr=1c:1641;Ref=test2;", "bla-bla-bla2"
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub CreateConfig(strPath2Config, strBase, strPath2Base, strID)
        If objFSO.FolderExists(strPath2Config) Then
            strContent = _
                "[" & strBase & "]" & vbCrLf & _
                "Connect=" & strPath2Base & vbCrLf & _
                "ID=" & strID & vbCrLf & _
                "OrderInList=24576" & vbCrLf & _
                "Folder=/" & vbCrLf & _
                "OrderInTree=49152" & vbCrLf & _
                "External=0"
            
            SaveToFile objFSO.BuildPath(strPath2Config, strConfigFileName), strContent
        Else
            WScript.Echo "Path [" & strPath2Config & "] not exists."
        End If
    End If
End Sub
'=============================================================================

'=============================================================================
Function SaveToFile(ByVal strFullFileName, ByVal strContent)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    Const adSaveCreateOverWrite = 2
    
    
    With WScript.CreateObject("ADODB.Stream")
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = "utf-8"
        .WriteText strContent
        
        .SaveToFile strFullFileName, adSaveCreateOverWrite
        
        .Close
    End With
End Function
'=============================================================================

17

Re: Кодировка vbs при записи в файл 1С

не совсем то имелось в веду: сначала, к примеру, смотрим только базы 1с 81. Есть две-три базы, мы должны проверить если пользователь добавлен в группу этой базы, то записываем ее в файл, если он же добавлен еще  и в другую группу, то записываем и эту базу в файл и так в скольких группах находится пользователь, столько баз у него в файл должно записаться

18

Re: Кодировка vbs при записи в файл 1С

A13, предложения начинаются с заглавной буквы и заканчиваются точкой.

19

Re: Кодировка vbs при записи в файл 1С

Тогда Вы должны завести какой-то список, что, дескать, группа «X» соответствует таким-то версиям и таким-то параметрам, группа «Y» — таким-то версиям и таким-то параметрам, группа «Z» — таким-то версиям и таким-то параметрам, соответственно. И т.д.

Поскольку структуры в VBScript отсутствуют, проще всего. пожалуй, будет использовать вложенные массивы, наподобие (совсем не проверялось):

Option Explicit

Const strConfigFileName = "ibases.v8i"

Dim arrBases
Dim arrBase

Dim objIADsGroup
Dim strUserGroups

Dim objFSO

Dim strAppData
Dim strPath2Config

Dim strContent81
Dim strContent82


'          Группа,        Версия, Имя базы,   Путь к базе,                ID
arrBases = Array( _
    Array("1cv81_тест",  "8.1",  "1C тест",  "File=\\SRV1C\1cdb\test;",  "f2926bd0-b233-4353-9e35-bfce27d92759"), _
    Array("1cv81_тест",  "8.1",  "1C тест2", "File=\\SRV1C\1cdb\test2;", "bla-bla-bla"), _
    Array("1cv81_тест3", "8.1",  "1C тест3", "File=\\SRV1C\1cdb\test3;", "bla-bla-bla3"), _
    Array("1cv81_тест4", "8.1",  "1C тест3", "File=\\SRV1C\1cdb\test3;", "bla-bla-bla3"), _
    Array("1cv82_тест",  "8.2",  "1C тест4", "Srvr=1c:1641;Ref=test",    "f2926bd0-b233-4353-9e35-bfce27d92730"), _
    Array("1cv82_тест2", "8.2",  "1C тест5", "Srvr=1c:1641;Ref=test2;",  "bla-bla-bla2") _
)
' Например, группе «1cv81_тест» соответствуют две базы,
'           группе «1cv81_тест2» — одна база.
' Ну, и база может соответствовать нескольким группам (в примере — база «1C тест3»).

strContent81 = ""
strContent82 = ""

For Each objIADsGroup In GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").UserName).Groups
    For Each arrBase In arrBases
        If objIADsGroup.Name = "CN=" & arrBase(0) Then
            Select Case arrBase(1)
                Case "8.1"
                    strContent81 = strContent81 & _
                        "[" & arrBase(2) & "]" & vbCrLf & _
                        "Connect=" & arrBase(3) & vbCrLf & _
                        "ID=" & arrBase(4) & vbCrLf & _
                        "OrderInList=24576" & vbCrLf & _
                        "Folder=/" & vbCrLf & _
                        "OrderInTree=49152" & vbCrLf & _
                        "External=0"
                Case "8.2"
                    strContent82 = strContent82 & _
                        "[" & arrBase(2) & "]" & vbCrLf & _
                        "Connect=" & arrBase(3) & vbCrLf & _
                        "ID=" & arrBase(4) & vbCrLf & _
                        "OrderInList=24576" & vbCrLf & _
                        "Folder=/" & vbCrLf & _
                        "OrderInTree=49152" & vbCrLf & _
                        "External=0"
            End Select
        End If
    Next
Next

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
strAppData = WScript.CreateObject("Shell.Application").NameSpace("shell:AppData").self.Path


strPath2Config = objFSO.BuildPath(strAppData, "1C\1Cv81")

If objFSO.FolderExists(strPath2Config) Then
    SaveToFile objFSO.BuildPath(strPath2Config, strConfigFileName), strContent81
Else
    WScript.Echo "Path [" & strPath2Config & "] not exists."
End If


strPath2Config = objFSO.BuildPath(strAppData, "1C\1CEStart")

If objFSO.FolderExists(strPath2Config) Then
    SaveToFile objFSO.BuildPath(strPath2Config, strConfigFileName), strContent82
Else
    WScript.Echo "Path [" & strPath2Config & "] not exists."
End If


Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function SaveToFile(ByVal strFullFileName, ByVal strContent)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    Const adSaveCreateOverWrite = 2
    
    
    With WScript.CreateObject("ADODB.Stream")
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = "utf-8"
        .WriteText strContent
        
        .SaveToFile strFullFileName, adSaveCreateOverWrite
        
        .Close
    End With
End Function
'=============================================================================

20

Re: Кодировка vbs при записи в файл 1С

alexii, выдаёт ошибку
Строка:1
Символ:1
Ошибка: недопустимый знак
Код: 800А0408

21

Re: Кодировка vbs при записи в файл 1С

Строка:1

Символ:1

Это что-то новенькое. Вы корректно скопировали код?

22

Re: Кодировка vbs при записи в файл 1С

A13 пишет:

Строка:1
Символ:1

Похоже кодировка, нужно в ansi.

23

Re: Кодировка vbs при записи в файл 1С

dab00, похоже на то. Я, конечно, в Unicode-1200 попробовал — там нормально, а вот что кому-то захочется сохранять код в UTF-8 — мне как-то даже и в голову не пришло .

24

Re: Кодировка vbs при записи в файл 1С

Пересохранил в ansi, скрипт запускается. Только берет данные странно, название не соответствует базе.

' Например, группе «1cv81_тест» соответствуют две базы,
'           группе «1cv81_тест2» — одна база.
' Ну, и база может соответствовать нескольким группам (в примере — база «1C тест3»).

Нужно чтоб одной группе соответствовала 1 база. Но пользователь может состоять в нескольких. Например, если он состоит в группе 1cv81_тест то ему прописывается база тест. Если же он состоит в группе 1cv81_тест и 1cv81_тест2. то соответственно он видит базы тест и тест2.
в файл ibases записывается:
[1C тест]
Connect=File=\\SRV1C\1cdb\тест;
ID=f2926bd0-b233-4353-9e35-bfce27d92759
OrderInList=24576
Folder=/
OrderInTree=49152
External=0
[1C тест2]
Connect=Srvr=srv1c;Ref=тест2;
ID=f2926bd0-b233-4353-9e35-bfce27d92759
OrderInList=40960
Folder=/
OrderInTree=65536
External=0

Сейчас он пишет:
[1C Тест]
Connect=Srvr=srv1c:1641;Ref=Тест2;
ID=f2926bd0-b233-4353-9e35-bfce27d92730
OrderInList=24576
Folder=/
OrderInTree=49152
External=0

25

Re: Кодировка vbs при записи в файл 1С

A13, я лишь привёл пример. Приведите Ваш код.

26

Re: Кодировка vbs при записи в файл 1С

alexii, в том то и дело, что мой вариант пока только тот, что я писал в начале. Пытаюсь понять ваш пример, но плохо это получается. В написание скриптов я самый что ни на есть новичок, а сроки как всегда поджимают.

27

Re: Кодировка vbs при записи в файл 1С

Как я понимаю, вот эта часть кода:

Function SaveToFile(ByVal strFullFileName, ByVal strContent)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    Const adSaveCreateOverWrite = 2
   
   
    With WScript.CreateObject("ADODB.Stream")
        .Type      = adTypeText
        .Mode      = adModeReadWrite
       
        .Open
       
        .Charset   = "utf-8"
        .WriteText strContent
       
        .SaveToFile strFullFileName, adSaveCreateOverWrite
       
        .Close
    End With
End Function

отвечает за сохранение файла в нужной кодировке. К моему варианту нельзя никак прикрутить, только полная переделка скрипта?

28

Re: Кодировка vbs при записи в файл 1С

Как я понимаю, вот эта часть кода… отвечает за сохранение файла в нужной кодировке.

Именно. Передаёте в функцию полный путь к файлу и строку, которую надо будет сохранить в файл. Существующий файл будет перезаписан.

К моему варианту нельзя никак прикрутить, только полная переделка скрипта?

Почему нет?! Пробуйте.

29

Re: Кодировка vbs при записи в файл 1С

alexii, большое спасибо за помощь! Буду пробовать...