diff --git a/modules/quikexport/quikexport.go b/modules/quikexport/quikexport.go index 7e1848f..76ff330 100644 --- a/modules/quikexport/quikexport.go +++ b/modules/quikexport/quikexport.go @@ -540,9 +540,23 @@ func quikExportRenderExportINI(s QuikExportSettings) (string, error) { t = iniSet(t, "General", "LimitKinds", s.LimitKinds) t = iniSet(t, "Files", "LogDepth", "3") t = iniOutputTables(t, s.Tables) + t = iniClearTables(t, s.Tables) return t, nil } +// iniClearTables — [ClearTables]: таблицы-срезы экспортёр очищает в начале сессии. Без этого повторная +// загрузка бьётся о первичный ключ (ошибки вставки текут памятью, как было с Portfolio) либо копит +// дубликаты. Portfolio не очищаем — на нём история НПР; журналы изменений очищать нельзя по смыслу. +func iniClearTables(text string, enabled []string) string { + for _, name := range enabled { + if name == "Portfolio" || strings.HasSuffix(name, "Journal") { + continue + } + text = iniSet(text, "ClearTables", name, "1") + } + return text +} + func quikExportRenderInfoINI(s QuikExportSettings) (string, error) { b, err := quikExportFS.ReadFile("web/quikexport/info.ini.tmpl") if err != nil { diff --git a/modules/quikexport/quikexport_cleartables_test.go b/modules/quikexport/quikexport_cleartables_test.go new file mode 100644 index 0000000..8ca2140 --- /dev/null +++ b/modules/quikexport/quikexport_cleartables_test.go @@ -0,0 +1,26 @@ +package quikexport + +import ( + "strings" + "testing" +) + +// [ClearTables]: включённые таблицы-срезы очищаются, Portfolio и журналы — нет. +func TestIniClearTables(t *testing.T) { + ini := "[Output tables]\n;SettleCodes=SettleCodes\nPortfolio=Portfolio\n\n[ClearTables]\nClasses=1\n;Securities=1\n" + out := iniClearTables(ini, []string{"Portfolio", "SettleCodes", "Securities", "DepoLimitsJournal"}) + for _, want := range []string{"SettleCodes=1", "Securities=1", "Classes=1"} { + if !strings.Contains(out, want) { + t.Errorf("нет %q в:\n%s", want, out) + } + } + if strings.Contains(out, "Portfolio=1") { + t.Errorf("Portfolio очищать нельзя:\n%s", out) + } + if strings.Contains(out, "DepoLimitsJournal=1") { + t.Errorf("журнал очищать нельзя:\n%s", out) + } + if strings.Contains(out, ";Securities=1") { + t.Errorf("строка осталась закомментированной:\n%s", out) + } +}