diff --git a/README.md b/README.md index 417817b..bd45ea8 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ func main() { infobase := v8.NewFileIB("./infobase") //infobase := v8.NewServerIB("app", "demobase") - what := v8.LoadCfg("./1cv8.cf) + what := v8.LoadCfg("./1cv8.cf") //what := v8.DumpCfg("./1cv8.cf) //what := v8.DumpIB("./1cv8.dt) diff --git a/agent.go b/agent.go index b43e9af..5cd47f4 100644 --- a/agent.go +++ b/agent.go @@ -4,6 +4,7 @@ import ( "github.com/v8platform/designer" ) +// AgentMode получает команду запуска в режиме агента конфигуратора func AgentMode(visible bool) designer.AgentModeOptions { command := designer.AgentModeOptions{ diff --git a/api.go b/api.go index 0ba942d..48eecf9 100644 --- a/api.go +++ b/api.go @@ -7,18 +7,29 @@ import ( "strings" ) +// Run выполняет запуск команды пакетного режима 1С.Предприятие +// where - место выполнения команды +// what - команда покетного режима +// opts - дополнительные опции запуска func Run(where runner.Infobase, what runner.Command, opts ...interface{}) error { return runner.Run(where, what, opts...) } +// Background выполняет запуск команды пакетного режима 1С.Предприятие в контексте +// ctx - контекст выполнения команды +// where - место выполнения команды +// what - команда покетного режима +// opts - дополнительные опции запуска +// Подробные примеры см. v8.Run func Background(ctx context.Context, where runner.Infobase, what runner.Command, opts ...interface{}) (runner.Process, error) { return runner.Background(ctx, where, what, opts...) } +// CreateInfobase выполняет создаение новой информационной базы по переданным параметрам func CreateInfobase(create runner.Command, opts ...interface{}) (*Infobase, error) { if create.Command() != runner.CreateInfobase { @@ -35,3 +46,11 @@ func CreateInfobase(create runner.Command, opts ...interface{}) (*Infobase, erro connectionString := strings.Join(connectionStringValues, ";") return ParseConnectionString(connectionString) } + +// CreateTempInfobase выполняет создаение новой временной информационной базы +func CreateTempInfobase(opts ...interface{}) (*Infobase, error) { + + create := CreateFileInfobase(NewTempDir("", "v8_temp_ib")) + + return CreateInfobase(create, opts...) +} diff --git a/api_test.go b/api_test.go index 3f80bfb..bcbc9b1 100644 --- a/api_test.go +++ b/api_test.go @@ -1,6 +1,7 @@ package v8 import ( + "github.com/stretchr/testify/assert" "github.com/v8platform/designer" "github.com/v8platform/runner" "reflect" @@ -54,3 +55,379 @@ func TestCreateInfobase(t *testing.T) { }) } } + +func TestApiConfig(t *testing.T) { + + ib := NewFileInfobase("./test_ib") + + tests := []struct { + name string + where ConnectionString + want Command + opts []interface{} + wantArgs []string + }{ + { + "LoadCfg", + ib, + LoadCfg("./1cv8.cf"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadCfg ./1cv8.cf", + }, + }, + { + "LoadCfg_UpdateDBCfg", + ib, + LoadCfg("./1cv8.cf", UpdateDBCfg(true, true)), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadCfg ./1cv8.cf", + "/UpdateDBCfg", + "-Dynamic+", + "-Server", + }, + }, + { + "LoadConfigFromFiles", + ib, + LoadConfigFromFiles("./src"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadConfigFromFiles ./src", + }, + }, + { + "LoadConfigFromFiles_WithFiles", + ib, + LoadConfigFromFiles("./src").WithFiles("./src/file1.xml", "./src/file2.xml"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadConfigFromFiles ./src", + "-files ./src/file1.xml,./src/file2.xml", + }, + }, + { + "LoadConfigFromFiles_WithListFile", + ib, + LoadConfigFromFiles("./src").WithListFile("./file_list.xml"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadConfigFromFiles ./src", + "-listFile ./file_list.xml", + }, + }, + { + "LoadConfigFromFiles_WithUpdateDumpInfo", + ib, + LoadConfigFromFiles("./src").WithUpdateDumpInfo(), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadConfigFromFiles ./src", + "-updateConfigDumpInfo", + }, + }, + { + "LoadConfigFromFiles_UpdateDBCfg", + ib, + LoadConfigFromFiles("./src", UpdateDBCfg(true, true)), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/LoadConfigFromFiles ./src", + "/UpdateDBCfg", + "-Dynamic+", + "-Server", + }, + }, + { + "UpdateCfg", + ib, + UpdateCfg("./1cv8.cf", false), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/UpdateCfg ./1cv8.cf", + }, + }, + { + "UpdateCfg_force", + ib, + UpdateCfg("./1cv8.cf", true), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/UpdateCfg ./1cv8.cf", + "-Force", + }, + }, + { + "UpdateCfg_UpdateDBCfg", + ib, + UpdateCfg("./1cv8.cf", true, UpdateDBCfg(true, true)), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/UpdateCfg ./1cv8.cf", + "-Force", + "/UpdateDBCfg", + "-Dynamic+", + "-Server", + }, + }, + { + "DumpCfg", + ib, + DumpCfg("./1cv8.cf"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpCfg ./1cv8.cf", + }, + }, + { + "DumpConfigToFiles", + ib, + DumpConfigToFiles("./src", false), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + }, + }, + { + "DumpConfigToFiles_force", + ib, + DumpConfigToFiles("./src", true), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-Force", + }, + }, + { + "DumpConfigToFiles_update", + ib, + DumpConfigToFiles("./src", false).WithUpdate(false, ""), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-update", + }, + }, + { + "DumpConfigToFiles_configDumpInfo", + ib, + DumpConfigToFiles("./src", false).WithUpdate(false, "./dumpInfo.xml"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-update", + "-configDumpInfoForChanges ./dumpInfo.xml", + }, + }, + { + "GetChangesForConfigDump", + ib, + GetChangesForConfigDump("./src", "./dumpInfo.xml", false), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-getChanges ./dumpInfo.xml", + }, + }, + { + "GetChangesForConfigDump_force", + ib, + GetChangesForConfigDump("./src", "./dumpInfo.xml", true), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-getChanges ./dumpInfo.xml", + "-force", + }, + }, + { + "GetChangesForConfigDump_WithConfigDumpInfo", + ib, + GetChangesForConfigDump("./src", "./dumpInfo.xml", false). + WithConfigDumpInfo("./old_dumpInfo.xml"), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/DumpConfigToFiles ./src", + "-getChanges ./dumpInfo.xml", + "-configDumpInfoForChanges ./old_dumpInfo.xml", + }, + }, + { + "DisableCfgSupport", + ib, + DisableCfgSupport(), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/ManageCfgSupport", + "-disableSupport", + }, + }, + { + "DisableCfgSupport_force", + ib, + DisableCfgSupport(true), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/ManageCfgSupport", + "-disableSupport", + "-force", + }, + }, + { + "RollbackCfg", + ib, + RollbackCfg(), + nil, + []string{ + "DESIGNER", + "/IBConnectionString File='./test_ib';", + "/DisableStartupDialogs", + "/RollbackCfg", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + runTestCase(t, tt) + + }) + } + +} + +func TestApiOptions(t *testing.T) { + + //ib := NewFileInfobase("./test_ib") + + tests := []struct { + name string + where ConnectionString + want Command + opts []interface{} + wantArgs []string + }{ + { + "options", + Infobase{ + Connect: ServerPath{ + Server: "app-server", + Ref: "ib_name", + }, + User: "administrator", + Password: "password", + AllowServerLicenses: true, + SeparatorList: DatabaseSeparatorList{DatabaseSeparator{ + Use: true, + Value: "sep1", + }}, + UsePrivilegedMode: true, + Locale: "ru_RU", + }, + designer.LoadCfgOptions{ + File: "./1cv8.cf", + Designer: designer.NewDesigner(), + }, + []interface{}{ + WithCredentials("admin", "pwd"), + WithOut("./out_file", true), + WithUC("UnlockCode"), + }, + []string{ + "DESIGNER", + "/IBConnectionString Srvr=app-server;Ref='ib_name';Usr=administrator;Pwd=password;LicDstr=Y;ZN=+sep1;Prmod=1;Locale=ru_RU", + "/DisableStartupDialogs", + "/LoadCfg ./1cv8.cf", + "/Out ./out_file -NoTruncate", + "/UC UnlockCode", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + runTestCase(t, tt) + + }) + } + +} + +func runTestCase(t *testing.T, tt struct { + name string + where ConnectionString + want Command + opts []interface{} + wantArgs []string +}) { + v8run := runner.NewPlatformRunner(tt.where, tt.want, tt.opts...) + got := v8run.Args() + + for _, arg := range tt.wantArgs { + assert.Contains(t, got, arg) + } + +} diff --git a/base.go b/base.go index 5e4c540..a33bbd4 100644 --- a/base.go +++ b/base.go @@ -4,40 +4,52 @@ import ( "fmt" "github.com/v8platform/errors" "github.com/v8platform/marshaler" + "os" + "path/filepath" "strings" ) var _ ConnectPath = (*FilePath)(nil) var _ ConnectPath = (*ServerPath)(nil) +// ConnectPath Описание интерфейса для создания пути подключения к информационной базе type ConnectPath interface { + // Должно возвращать: + // 1. Для подключения файловой базе "File='./file_path';" + // 2. Для подключения серверной базе "Srvr=localhost;Ref='infobase_name'" + // 1. Для подключения по тонкому клиенту "Ws=http://localhost/ws/buh;" String() string } +// FilePath Описывает подключение к файловой базе данных type FilePath struct { // имя каталога, в котором размещается файл информационной базы; File string `v8:"File, equal_sep, quotes" json:"file"` } +// String Полученияе строки подлючения по заданным полям func (f FilePath) String() string { v, _ := marshaler.Marshal(f) connString := strings.Join(v, ";") return connString + ";" } +// WsPath Описывает подключение по тонкому клиенту type WsPath struct { - // имя каталога, в котором размещается файл информационной базы; + // путь подключения для тонкого клиента Ws string `v8:"Ws, equal_sep" json:"ws"` } +// String Полученияе строки подлючения по заданным полям func (f WsPath) String() string { v, _ := marshaler.Marshal(f) connString := strings.Join(v, ";") return connString + ";" } +// ServerPath Описывает подключение к серверной базе данных type ServerPath struct { //имя сервера «1С:Предприятия» в формате: [<протокол>://]<адрес>[:<порт>], где: //<протокол> – не обязателен, поддерживается только протокол TCP, @@ -49,6 +61,7 @@ type ServerPath struct { Ref string `v8:"Ref, equal_sep, quotes" json:"ref"` } +// String Полученияе строки подлючения по заданным полям func (s ServerPath) String() string { v, _ := marshaler.Marshal(s) connString := strings.Join(v, ";") @@ -57,7 +70,16 @@ func (s ServerPath) String() string { var _ ConnectionString = (*Infobase)(nil) +// Infobase Описание структуры подключения к информационной базе +// +// Пример создания файловой базы базы: +// ib := &v8.Infobase{ +// Connect: v8.FilePath{File: "./infobase_path"}, +// User: "Admin", +// Password: "password", +// } type Infobase struct { + // Описание подключения к информационной базе Connect ConnectPath `v8:",inherit" json:"path"` // имя пользователя; @@ -109,6 +131,7 @@ type Infobase struct { Locale string `v8:"Locale, optional, equal_sep" json:"locale"` } +// ConnectionString Реализация интерфейса для v8.ConnectionString func (ib Infobase) ConnectionString() string { v, _ := marshaler.Marshal(ib) @@ -116,6 +139,7 @@ func (ib Infobase) ConnectionString() string { return fmt.Sprintf("/IBConnectionString %s%s", ib.Connect.String(), connString) } +// NewFileInfobase Получает новую файловую информационную базы по ее каталогу func NewFileInfobase(file string) *Infobase { ib := &Infobase{ @@ -124,12 +148,25 @@ func NewFileInfobase(file string) *Infobase { }, } - ib.Connect.String() - return ib } +// NewInfobase Получает новую информационную базы из переданной строки +func NewInfobase(connectingString string) (ib *Infobase, err error) { + + file, _ := filepath.Abs(connectingString) + _, err = os.Stat(file) + if err == nil || os.IsExist(err) { + return NewFileInfobase(connectingString), nil + } + + return ParseConnectionString(connectingString) + +} + +// ParseConnectionString Парсит строки подключения к информационной базе и +// получение из нее информаицонную базу func ParseConnectionString(connectingString string) (ib *Infobase, err error) { switch { @@ -153,7 +190,7 @@ func parseIBConnectionString(connectingString string) (ib *Infobase, err error) ib = &Infobase{} - valuesMap, err := ConnectionStringtoMap(connectingString) + valuesMap, err := connectionStringToMap(connectingString) if err != nil { return nil, err } @@ -207,7 +244,7 @@ func parseIBConnectionString(connectingString string) (ib *Infobase, err error) return } -func ConnectionStringtoMap(connectingString string) (map[string]string, error) { +func connectionStringToMap(connectingString string) (map[string]string, error) { valuesMap := make(map[string]string) values := strings.Split(connectingString, ";") diff --git a/config.go b/config.go index de01747..bddec66 100644 --- a/config.go +++ b/config.go @@ -4,40 +4,56 @@ import ( "github.com/v8platform/designer" ) -func LoadCfg(file string) designer.LoadCfgOptions { +// LoadCfg получает команду загрузки конфигурации из файла +// Подробнее в пакете designer.LoadCfgOptions +func LoadCfg(file string, updateDBCfg ...designer.UpdateDBCfgOptions) designer.LoadCfgOptions { command := designer.LoadCfgOptions{ File: file, Designer: designer.NewDesigner(), } + if len(updateDBCfg) > 0 { + command.UpdateDBCfg = &updateDBCfg[0] + } + return command } -func LoadConfigFromFiles(dir string) designer.LoadConfigFromFiles { +// LoadConfigFromFiles получает команду загрузки конфигурации из файлов каталога +func LoadConfigFromFiles(dir string, updateDBCfg ...designer.UpdateDBCfgOptions) designer.LoadConfigFromFiles { command := designer.LoadConfigFromFiles{ Dir: dir, Designer: designer.NewDesigner(), } + if len(updateDBCfg) > 0 { + command.UpdateDBCfg = &updateDBCfg[0] + } return command } -func UpdateCfg(file string, force bool) designer.UpdateCfgOptions { +// UpdateCfg получает команду обновления конфигурации из файла +// Подробнее в пакете designer.UpdateCfgOptions +func UpdateCfg(file string, force bool, updateDBCfg ...designer.UpdateDBCfgOptions) designer.UpdateCfgOptions { command := designer.UpdateCfgOptions{ File: file, Force: force, Designer: designer.NewDesigner(), } + if len(updateDBCfg) > 0 { + command.UpdateDBCfg = &updateDBCfg[0] + } return command } +// DumpCfg получает команду сохранения конфигурации в файл func DumpCfg(file string) designer.DumpCfgOptions { command := designer.DumpCfgOptions{ @@ -49,40 +65,51 @@ func DumpCfg(file string) designer.DumpCfgOptions { } -func DumpConfigToFiles(dir string, force bool) designer.DumpConfigToFilesOptions { +// DumpConfigToFiles получает команду сохранения конфигурации в файлы указанного каталога +func DumpConfigToFiles(dir string, force ...bool) designer.DumpConfigToFilesOptions { command := designer.DumpConfigToFilesOptions{ Designer: designer.NewDesigner(), Dir: dir, - Force: force, + } + if len(force) > 0 { + command.Force = force[0] } return command } -func GetChangesForConfigDump(file string, force bool) designer.GetChangesForConfigDumpOptions { +// GetChangesForConfigDump получает команду получения измнений конфигурации для указаного файла выгрузки конфигурации +func GetChangesForConfigDump(dir, file string, force ...bool) designer.GetChangesForConfigDumpOptions { command := designer.GetChangesForConfigDumpOptions{ Designer: designer.NewDesigner(), + Dir: dir, GetChanges: file, - Force: force, } + if len(force) > 0 { + command.Force = force[0] + } return command } -func DisableCfgSupport(force bool) designer.ManageCfgSupportOptions { +// DisableCfgSupport получает команду отключение поддержки конфигурации +func DisableCfgSupport(force ...bool) designer.ManageCfgSupportOptions { command := designer.ManageCfgSupportOptions{ Designer: designer.NewDesigner(), DisableSupport: true, - Force: force, + } + if len(force) > 0 { + command.Force = force[0] } return command } +// DisableCfgSupport получает команду возврата конфигруации к конфигурации БД func RollbackCfg() designer.RollbackCfgOptions { command := designer.RollbackCfgOptions{ diff --git a/config_test.go b/config_test.go new file mode 100644 index 0000000..91be37b --- /dev/null +++ b/config_test.go @@ -0,0 +1 @@ +package v8 diff --git a/enterprise.go b/enterprise.go index bf781ba..aac7b45 100644 --- a/enterprise.go +++ b/enterprise.go @@ -2,10 +2,18 @@ package v8 import "github.com/v8platform/enterprise" -func Execute(file string) enterprise.ExecuteOptions { +// Execute получает команду выполнения внешней обработки в режиме предприятия +// ВАЖНО! Обработка должна обязательно после работы закрывать приложение +func Execute(file string, params ...map[string]string) enterprise.ExecuteOptions { + + var lparams map[string]string + if len(params) > 0 { + lparams = params[0] + } command := enterprise.ExecuteOptions{ - File: file, + File: file, + Params: lparams, } return command diff --git a/enterprise_test.go b/enterprise_test.go new file mode 100644 index 0000000..8aa612f --- /dev/null +++ b/enterprise_test.go @@ -0,0 +1,57 @@ +package v8 + +import ( + "github.com/v8platform/enterprise" + "reflect" + "testing" +) + +func TestExecute(t *testing.T) { + type args struct { + file string + params []map[string]string + } + tests := []struct { + name string + args args + want enterprise.ExecuteOptions + }{ + { + "run epf", + args{ + file: "./path_to_epf.epf", + params: nil, + }, + enterprise.ExecuteOptions{ + File: "./path_to_epf.epf", + Params: nil, + }, + }, + { + "run epf with params", + args{ + file: "./path_to_epf.epf", + params: []map[string]string{ + { + "param1": "any_string", + "param2": "any_string", + }, + }, + }, + enterprise.ExecuteOptions{ + File: "./path_to_epf.epf", + Params: map[string]string{ + "param1": "any_string", + "param2": "any_string", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := Execute(tt.args.file, tt.args.params...); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Execute() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/example_test.go b/example_test.go new file mode 100644 index 0000000..102d3f2 --- /dev/null +++ b/example_test.go @@ -0,0 +1,528 @@ +package v8_test + +// Output: +// Go is a general-purpose language designed with systems programming in mind. + +import ( + "fmt" + v8 "github.com/v8platform/v8" + "io/ioutil" + "log" + "os" + "path/filepath" +) + +func ExampleNewTempDir() { + content := []byte("temporary file's content") + dir := v8.NewTempDir("", "example") + + defer os.RemoveAll(dir) // clean up + + tmpfn := filepath.Join(dir, "tmpfile") + if err := ioutil.WriteFile(tmpfn, content, 0666); err != nil { + log.Fatal(err) + } +} + +func ExampleExecute() { + + where, err := v8.CreateTempInfobase() + + if err != nil { + log.Fatal(err) + } + + epfFilePath := "./user_any.epf" + + what := v8.Execute(epfFilePath) + + if err := v8.Run(where, what); err != nil { + log.Fatal(err) + } +} + +func ExampleExecute_params() { + + where, err := v8.CreateTempInfobase() + + if err != nil { + log.Fatal(err) + } + + epfFilePath := "./path_to_epf.epf" + + what := v8.Execute(epfFilePath, map[string]string{ + "param1": "any_string", + "param2": "any_string", + }) + + if err := v8.Run(where, what); err != nil { + log.Fatal(err) + } +} + +func ExampleInfobase_file() { + + ib := &v8.Infobase{ + Connect: v8.FilePath{File: "./infobase_path"}, + User: "Admin", + Password: "password", + } + + connStr := ib.ConnectionString() + + fmt.Printf("ConnectionString: %s", connStr) + + // Output: + // ConnectionString: /IBConnectionString File='./infobase_path';Usr=Admin;Pwd=password + +} + +func ExampleInfobase_ConnectionString_file() { + + ib := &v8.Infobase{ + Connect: v8.FilePath{File: "./infobase_path"}, + User: "Admin", + Password: "password", + } + + connStr := ib.ConnectionString() + + fmt.Printf("ConnectionString: %s", connStr) + + // Output: + // ConnectionString: /IBConnectionString File='./infobase_path';Usr=Admin;Pwd=password + +} + +func ExampleInfobase_ConnectionString_server() { + + ib := &v8.Infobase{ + Connect: v8.ServerPath{Server: "server", Ref: "ib_name"}, + User: "Admin", + Password: "password", + } + + connStr := ib.ConnectionString() + + fmt.Printf("ConnectionString: %s", connStr) + + // Output: + // ConnectionString: /IBConnectionString Srvr=server;Ref='ib_name';Usr=Admin;Pwd=password + +} + +func ExampleNewInfobase_from_path() { + + ib, err := v8.NewInfobase("./.github") + + if err != nil { + log.Fatal(err) + } + + connStr := ib.ConnectionString() + + fmt.Printf("ConnectionString: %s", connStr) + + // Output: + // ConnectionString: /IBConnectionString File='./.github'; + +} + +func ExampleNewInfobase_connect() { + + ib, err := v8.NewInfobase("File=./file_ib;Locale=ru_RU;Usr=User;Pwd=Password;Prmod=1;LicDstr=Y;") + + if err != nil { + log.Fatal(err) + } + + connStr := ib.ConnectionString() + + fmt.Printf("ConnectionString: %s", connStr) + + // Output: + // ConnectionString: /IBConnectionString File='./file_ib';Usr=User;Pwd=Password;LicDstr=Y;Prmod=1;Locale=ru_RU + +} + +func ExampleDumpIB_file() { + + infobase, err := v8.NewInfobase("File=./file_ib;Locale=ru_RU;Usr=User;Pwd=Password;Prmod=1;LicDstr=Y;") + + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.DumpIB("./1cv8.dt") + //what := v8.DumpCfg("./1cv8.cf) + //what := v8.DumpIB("./1cv8.dt) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleDumpIB_server() { + + infobase := v8.NewServerIB("app", "demobase") + + what := v8.DumpIB("./1cv8.dt") + //what := v8.DumpCfg("./1cv8.cf) + //what := v8.DumpIB("./1cv8.dt) + + err := v8.Run(infobase, what) + //err := v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleRestoreIB_file() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.RestoreIB("./1cv8.dt") + //what := v8.DumpCfg("./1cv8.cf) + //what := v8.DumpIB("./1cv8.dt) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleRun() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.RestoreIB("./1cv8.dt") + //what := v8.DumpCfg("./1cv8.cf) + //what := v8.DumpIB("./1cv8.dt) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleRun_with_opts() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.RestoreIB("./1cv8.dt") + //what := v8.DumpCfg("./1cv8.cf) + //what := v8.DumpIB("./1cv8.dt) + + err = v8.Run(infobase, what, + v8.WithTimeout(1), // указание таймаута выполнения в секундах + //v8.WithPath("path-to-exe"), // указание пути к исполняемому файлу 1С.Предприятие + //v8.WithUnlockCode("123"), // указание кода блокировки информационной базы + //v8.WithDumpResult("./dump_result.txt"), // указание файла результата выполенния операции + //v8.WithOut("./out.txt", false), // указание файла в который будет записан вывод консоли 1С.Предприятие + //v8.WithVersion("8.3.16"), // Указание конкретной версии. Не работает с опцией v8.WithPath + //v8.WithCredentials("Администратор", ""), // Указание пользователя и пароля для информационной базы + //v8.WithCommonValues("/Visible", "/DisableStartupDialogs"), // Указание дополнительных опций запуска + ) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleLoadCfg() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.LoadCfg("./1cv8.cf") + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleDumpCfg() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.DumpCfg("./1cv8.cf") + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleLoadCfg_with_updateDBCfg() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.LoadCfg("./1cv8.cf"). + WithUpdateDBCfg(v8.UpdateDBCfg(false, false)) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleLoadConfigFromFiles() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.LoadConfigFromFiles("./src") + //what := v8.LoadConfigFromFiles("./src", v8.UpdateDBCfg(false, false)) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleLoadConfigFromFiles_with_files() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.LoadConfigFromFiles("./src").WithListFile("./listFiles.txt") + //what := v8.LoadConfigFromFiles("./src").WithFiles("./src/file.xml", "./src/file2.xml") + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleLoadConfigFromFiles_with_update_dump_info() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.LoadConfigFromFiles("./src").WithUpdateDumpInfo() + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleDumpConfigToFiles() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.DumpConfigToFiles("./src") + //what := v8.DumpConfigToFiles("./src", true) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleDumpConfigToFiles_with_update() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.DumpConfigToFiles("./src").WithUpdate(false, "./src/dumpInfo.xml") + //what := v8.DumpConfigToFiles("./src", true) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleGetChangesForConfigDump() { + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.GetChangesForConfigDump("./src", "./src/dumpInfo.xml") + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleGetChangesForConfigDump_custom_dumpInfo() { + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.GetChangesForConfigDump("./src", "./src/dumpInfo.xml"). + WithConfigDumpInfo("./src/old_dumpInfo.xml") + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleUpdateCfg() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.UpdateCfg("./1cv8.cf", false) + //what := v8.UpdateCfg("./1cv8.cf", false, v8.UpdateDBCfg(false, false)) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleDisableCfgSupport() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + what := v8.DisableCfgSupport() + //what := v8.DisableCfgSupport(true) + + err = v8.Run(infobase, what) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} + +func ExampleRollbackCfg() { + + infobase, err := v8.CreateTempInfobase() + if err != nil { + log.Fatal(err) + } + //infobase := v8.NewFileIB("./infobase") + //infobase := v8.NewServerIB("app", "demobase") + + err = v8.Run(infobase, v8.RollbackCfg()) + //err := v8.Run(infobase, what, v8.WithTimeout(1), v8.WithPath("path-to-exe")) + //err := v8.Run(infobase, what, v8.WithCredentials("infobase-user","pwd"), v8.WithUnlockCode("123")) + + if err != nil { + log.Fatal(err) + } +} diff --git a/extentions.go b/extentions.go index eb76ff3..c1d3a6e 100644 --- a/extentions.go +++ b/extentions.go @@ -2,6 +2,7 @@ package v8 import "github.com/v8platform/designer" +// LoadExtensionCfg получает команду загрузки конфигурации из файла для расширения func LoadExtensionCfg(file, extension string) designer.LoadCfgOptions { command := LoadCfg(file) @@ -11,6 +12,7 @@ func LoadExtensionCfg(file, extension string) designer.LoadCfgOptions { } +// LoadExtensionCfg получает команду выгрузки конфигурации в файл для расширения func DumpExtensionCfg(file, extension string) designer.DumpCfgOptions { command := DumpCfg(file) @@ -19,6 +21,7 @@ func DumpExtensionCfg(file, extension string) designer.DumpCfgOptions { } +// LoadExtensionConfigFromFiles получает команду загрузки конфигурации расширения из файлов каталога func LoadExtensionConfigFromFiles(dir, extension string) designer.LoadConfigFromFiles { command := LoadConfigFromFiles(dir) @@ -28,6 +31,7 @@ func LoadExtensionConfigFromFiles(dir, extension string) designer.LoadConfigFrom } +// DumpExtensionConfigToFiles получает команду сохранения конфигурации расширения в файлы указанного каталога func DumpExtensionConfigToFiles(dir, extension string, force bool) designer.DumpConfigToFilesOptions { command := DumpConfigToFiles(dir, force) @@ -37,12 +41,21 @@ func DumpExtensionConfigToFiles(dir, extension string, force bool) designer.Dump } +// UpdateExtensionDBCfg получает команду обновление конфигурации расширения в информационной базы +func UpdateExtensionDBCfg(extension string, server bool, dynamic bool) designer.UpdateDBCfgOptions { + + command := UpdateDBCfg(server, dynamic) + command.Extension = extension + + return command + +} + +// RollbackExtensionCfg получает команду возврата конфигруации расширения к конфигурации хранящейся БД func RollbackExtensionCfg(extension string) designer.RollbackCfgOptions { - command := designer.RollbackCfgOptions{ - Designer: designer.NewDesigner(), - Extension: extension, - } + command := RollbackCfg() + command.Extension = extension return command diff --git a/go.mod b/go.mod index e7dd1be..6c06780 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module github.com/v8platform/v8 go 1.15 require ( - github.com/v8platform/designer v0.1.0 + github.com/stretchr/testify v1.6.1 + github.com/v8platform/designer v0.1.1 github.com/v8platform/enterprise v0.1.0 github.com/v8platform/errors v0.1.0 github.com/v8platform/marshaler v0.1.1 diff --git a/go.sum b/go.sum index 273374f..cf8e300 100644 --- a/go.sum +++ b/go.sum @@ -21,9 +21,10 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/v8platform/agent v0.0.0-20200703051804-b06e6737a7b5 h1:exdR2JPaLRuRvaLLyPzVHAZV7KkQGrblL2ch5J3Dkpg= github.com/v8platform/agent v0.0.0-20200703051804-b06e6737a7b5/go.mod h1:fLdJkSja8K++qa7+Lw4RQBHsEdS18GcE2F2BlFK33Z4= -github.com/v8platform/designer v0.1.0 h1:KrKGSO+Fah7h66D5TK+urNYezC3KyhTEEvwCT0+rAys= -github.com/v8platform/designer v0.1.0/go.mod h1:crJehQ/us/JoDy/jgKFxFLJsPTAQXX1SKSa0CMQKbYw= +github.com/v8platform/designer v0.1.1 h1:YnC2+GVP7t/9QfAsRD2+dm3BaQVKi2PCGO56acvgcSk= +github.com/v8platform/designer v0.1.1/go.mod h1:LdRGRiHK3+eIIMJcI1eEF90VSzYqU2cMhXOWeJu2bHE= github.com/v8platform/enterprise v0.1.0 h1:OKJ3ig9AvUDvIN+R0GRWJUPVNy5rPNtOKoqS2JPLnvw= github.com/v8platform/enterprise v0.1.0/go.mod h1:A2XY7UYAi/o9xdKrHzU63XnVD8wvIe6jMBUlUrNANQs= github.com/v8platform/errors v0.1.0 h1:7167okMmxBb76FA3+irT4LW9KTVura0vhMWnFDMHcZw= diff --git a/helpers.go b/helpers.go index d5fceec..9783621 100644 --- a/helpers.go +++ b/helpers.go @@ -4,9 +4,7 @@ import ( "io/ioutil" ) -//////////////////////////////////////////////////////// -// Create InfoBases - +// NewTempDir получает имя нового временного каталога func NewTempDir(dir, pattern string) string { t, _ := ioutil.TempDir(dir, pattern) @@ -15,6 +13,7 @@ func NewTempDir(dir, pattern string) string { } +// NewTempFile получает имя нового временного файла func NewTempFile(dir, pattern string) string { tempFile, _ := ioutil.TempFile(dir, pattern) @@ -23,4 +22,4 @@ func NewTempFile(dir, pattern string) string { return tempFile.Name() -} \ No newline at end of file +} diff --git a/infobase.go b/infobase.go index 68baab5..d3f65b8 100644 --- a/infobase.go +++ b/infobase.go @@ -4,6 +4,7 @@ import ( "github.com/v8platform/designer" ) +// DumpIB получает команду выгрузки данных информационной базы в файл func DumpIB(file string) designer.DumpIBOptions { command := designer.DumpIBOptions{ @@ -14,6 +15,7 @@ func DumpIB(file string) designer.DumpIBOptions { return command } +// RestoreIB получает команду восстановления данных информационной базы из файла func RestoreIB(file string) designer.RestoreIBOptions { command := designer.RestoreIBOptions{ @@ -24,6 +26,7 @@ func RestoreIB(file string) designer.RestoreIBOptions { return command } +// IBRestoreIntegrity получает команду восстановления структуры информационной базы func IBRestoreIntegrity() designer.IBRestoreIntegrityOptions { return designer.IBRestoreIntegrityOptions{ @@ -31,6 +34,7 @@ func IBRestoreIntegrity() designer.IBRestoreIntegrityOptions { } } +// UpdateDBCfg получает команду обновление конфигурации информационной базы func UpdateDBCfg(server bool, Dynamic bool) designer.UpdateDBCfgOptions { command := designer.UpdateDBCfgOptions{ @@ -43,6 +47,7 @@ func UpdateDBCfg(server bool, Dynamic bool) designer.UpdateDBCfgOptions { } +// UpdateDBExtensionCfg получает команду обновление конфигурации расшинения информационной базы func UpdateDBExtensionCfg(extension string, server bool, Dynamic bool) designer.UpdateDBCfgOptions { command := UpdateDBCfg(server, Dynamic) @@ -52,6 +57,7 @@ func UpdateDBExtensionCfg(extension string, server bool, Dynamic bool) designer. } +// CreateFileInfobase получает команду создания файловой информационной базы func CreateFileInfobase(file string) designer.CreateFileInfoBaseOptions { command := designer.CreateFileInfoBaseOptions{ diff --git a/options.go b/options.go index b222d45..c4f3522 100644 --- a/options.go +++ b/options.go @@ -5,44 +5,59 @@ import ( "github.com/v8platform/runner" ) +// WithTimeout указании таймаута выполнения операции (в секундах) func WithTimeout(timeout int64) runner.Option { return runner.WithTimeout(timeout) } +// WithContext указании контекста выполнения операции func WithContext(ctx context.Context) runner.Option { return runner.WithContext(ctx) } +// WithContext указание файла в который будет записан вывод консоли 1С.Предприятие func WithOut(file string, noTruncate bool) runner.Option { return runner.WithOut(file, noTruncate) } +// WithPath указание пути к исполняемому файлу 1С.Предприятие func WithPath(path string) runner.Option { return runner.WithPath(path) } +// WithDumpResult указание файла результата выполенния операции func WithDumpResult(file string) runner.Option { return runner.WithDumpResult(file) } +// WithVersion указание конкретной версии. Не работает с опцией v8.WithPath func WithVersion(version string) runner.Option { return runner.WithVersion(version) } -func WithCommonValues(cv []string) runner.Option { +// WithCommonValues указание дополнительных произвольных ключей выполнения операции +// Например следующие ключи: +// "/Visible", "/DisableStartupDialogs" +func WithCommonValues(cv ...string) runner.Option { return runner.WithCommonValues(cv) } +// WithCredentials указание пользователя и пароля для авторизации в информационной базе +// Дополнительно будут указаны следующие ключи: +// /U +// /P func WithCredentials(user, password string) runner.Option { return runner.WithCredentials(user, password) } +// WithUnlockCode указание ключа доступа к информационной базе func WithUnlockCode(uc string) runner.Option { return runner.WithUnlockCode(uc) } +// WithUC см. v8.WithUnlockCode func WithUC(uc string) runner.Option { return WithUnlockCode(uc) diff --git a/repository.go b/repository.go index 91be37b..480aaf4 100644 --- a/repository.go +++ b/repository.go @@ -1 +1,38 @@ package v8 + +import ( + "github.com/v8platform/designer" + "github.com/v8platform/designer/repository" +) + +func NewRepository(path string, userAndPassword ...string) repository.Repository { + + repo := repository.Repository{ + Path: path, + } + + if len(userAndPassword) > 0 && len(userAndPassword[0]) > 0 { + repo.User = userAndPassword[0] + if len(userAndPassword) == 2 && len(userAndPassword[1]) > 0 { + repo.Password = userAndPassword[1] + } + } + + return repo +} + +// RepositoryUpdateCfg получает команду обновления конфигурации из хранилища конфигурации +// Подробнее в пакете designer.UpdateCfgOptions +func RepositoryUpdateCfg(repo repository.Repository, updateDBCfg ...designer.UpdateDBCfgOptions) repository.RepositoryUpdateCfgOptions { + + command := repository.RepositoryUpdateCfgOptions{ + Repository: repo, + Designer: designer.NewDesigner(), + } + + if len(updateDBCfg) > 0 { + command.UpdateDBCfg = &updateDBCfg[0] + } + + return command +} diff --git a/types.go b/types.go index 7ca01d8..340231d 100644 --- a/types.go +++ b/types.go @@ -5,21 +5,27 @@ import ( "io/ioutil" ) +// ConnectionString описывает интерфейс для получения строки подключения +// Пример: +// /IBConnectionString File='./file_ib';Usr=User;Pwd=Password;LicDstr=Y;Prmod=1;Locale=ru_RU; type ConnectionString interface { ConnectionString() string } +// Command описывает интерфейс команд пакетного запуска конфигуратора type Command interface { runner.Command } -func NewTempIB() Infobase { +// NewTempIB создает новую временную информационную базы +func NewTempIB() (*Infobase, error) { path, _ := ioutil.TempDir("", "1c_DB_") + return CreateInfobase(CreateFileInfobase(path)) - return NewFileIB(path) } +// NewFileIB получет файловую информационную базы по пути к каталогу func NewFileIB(path string) Infobase { ib := Infobase{ @@ -31,6 +37,7 @@ func NewFileIB(path string) Infobase { return ib } +// NewServerIB получет серверную информационную базы по имени сервера и базы на нем func NewServerIB(server, ref string) Infobase { ib := Infobase{