diff --git a/assets/extension-manager/assets.go b/assets/extension-manager/assets.go
new file mode 100644
index 0000000000000000000000000000000000000000..1fe221bb1869f051dfb3e55d0c887ae621c58535
--- /dev/null
+++ b/assets/extension-manager/assets.go
@@ -0,0 +1,6 @@
+package extension_manager
+
+import "embed"
+
+//go:embed *
+var FS embed.FS
diff --git a/assets/extension-manager/collections/actions.yaml b/assets/extension-manager/collections/actions.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..80f4ac1ca7c98089f1b7d5855b07264be5602ace
--- /dev/null
+++ b/assets/extension-manager/collections/actions.yaml
@@ -0,0 +1,226 @@
+id: space_actions
+name: Настройки/Действия
+hidden: true
+schema:
+  ui:
+    options:
+      fields:
+        - action
+        - extension
+        - name
+        - description
+        - icon
+        - image
+        - kind
+        - autorun
+        - confirm
+        - target
+        - view
+        - parent
+        - order
+        - groups
+        - classes
+        - refs
+        - params_collection
+        - navigation_action
+        - navigation_route
+      title: name
+      subtitle: action
+      collection_icon: SettingOutlined/RocketOutlined
+    list_view:
+      options:
+        fields:
+          - icon
+          - name
+          - action
+          - kind
+          - updated_at
+          - updated_by
+          - state
+        sort:
+          - name
+        page_size: 50
+  includes:
+    - ref: hoop_item_options
+      optional: true
+  single_locale: true
+  type: object
+  params:
+    inline: false
+    fields:
+      navigation_action:
+        title: Навигация (Deprecated)
+        description: Выполняется переход пользователя в пользовательском интерфейсе
+        ui:
+          widget: Checkbox
+        type: bool
+        params: { }
+      navigation_route:
+        title: Путь в интерфейсе (Deprecated)
+        type: string
+        params: { }
+      image:
+        title: Изображение
+        ui:
+          widget: Media
+        type: reference
+        params:
+          allowedCollections:
+            - media
+      autorun:
+        title: Автозапуск
+        description: Действие выполняется автоматически каждый раз при загрузке приложения
+        ui:
+          widget: Checkbox
+        type: bool
+        params: { }
+      target:
+        title: Отображение результата действия
+        ui:
+          widget: Select
+        options:
+          enum:
+            - name: DEFAULT
+              value: 0
+            - name: MODAL
+              value: 1
+            - name: WIDE
+              value: 2
+            - name: MAIN
+              value: 4
+            - name: DRAWER
+              value: 5
+            - name: NOTIFICATION
+              value: 6
+            - name: BLANK
+              value: 7
+            - name: NONE
+              value: 100
+        type: number
+        params:
+          format: int
+      params_collection:
+        title: Коллекция параметров
+        description: ID коллекции для хранения параметров действия
+        ui:
+          widget: Collection
+        type: string
+        params: { }
+      classes:
+        title: Класс
+        description: Классы данных, к которым применимо действие
+        ui:
+          widget: SelectList
+        indexed: true
+        type: array
+        params:
+          item:
+            additional_values: true
+            type: string
+            params: { }
+      name:
+        title: Название
+        text_search: true
+        type: string
+        params: { }
+      confirm:
+        title: С подтверждением
+        description: Пользователь должен подтвердить запуск действия
+        ui:
+          widget: Checkbox
+        type: bool
+        params: { }
+      order:
+        title: Порядок отображения
+        description: Порядок отображения действия в интерфейсе (Для пунктов меню)
+        type: number
+        params:
+          format: int
+      groups:
+        title: Группы
+        description: Группировка действий в пользовательском интерфейсе
+        ui:
+          widget: SelectList
+        type: array
+        params:
+          item:
+            additional_values: true
+            type: string
+            params: { }
+      kind:
+        title: Р’РёРґ
+        ui:
+          widget: Select
+        options:
+          enum:
+            - name: DEFAULT
+              value: 0
+            - name: SPACE
+              value: 1
+            - name: ENVIRONMENT
+              value: 2
+            - name: COLLECTION
+              value: 3
+            - name: ITEM
+              value: 4
+            - name: ITEMS
+              value: 5
+            - name: REVISION
+              value: 6
+            - name: CREATE
+              value: 7
+        type: number
+        params:
+          format: int
+      view:
+        title: Отображение действия в интерфейсе
+        ui:
+          widget: Select
+        options:
+          enum:
+            - name: DEFAULT_VIEW
+              value: 0
+            - name: HIDDEN_VIEW
+              value: 1
+            - name: MAIN_MENU_VIEW
+              value: 2
+            - name: MAIN_MENU_BOTTOM_VIEW
+              value: 3
+        type: number
+        params:
+          format: int
+      parent:
+        title: Идентификатор родительского действия
+        type: string
+        params: { }
+      refs:
+        title: Ссылки
+        ui:
+          widget: BlockList
+        type: array
+        params:
+          item:
+            type: reference
+            params:
+              allowedCollections:
+      action:
+        title: Действие
+        text_search: true
+        options:
+          required: true
+        type: string
+        params: { }
+      extension:
+        title: Расширение (Deprecated)
+        type: string
+        params: { }
+      description:
+        title: Описание
+        type: string
+        params: { }
+      icon:
+        title: Название иконки
+        ui:
+          widget: Icon
+        type: string
+        params: { }
diff --git a/assets/extension-manager/collections/extensions.yaml b/assets/extension-manager/collections/extensions.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ec04234c662f769cf7c143230aa0ae5d1c3fb473
--- /dev/null
+++ b/assets/extension-manager/collections/extensions.yaml
@@ -0,0 +1,73 @@
+id: space_extensions
+name: Настройки/Расширения
+hidden: true
+schema:
+  ui:
+    options:
+      fields:
+        - id
+        - title
+        - version
+        - status_error
+        - status_msg
+        - extension_state
+      title: title
+      subtitle: id
+      key: id
+      collection_icon: SettingOutlined/ApiOutlined
+    list_view:
+      options:
+        fields:
+          - id
+          - title
+          - extension_state
+          - updated_at
+          - updated_by
+        sort:
+          - title
+        page_size: 50
+  single_locale: true
+  type: object
+  params:
+    inline: false
+    fields:
+      id:
+        title: Расширение
+        unique: true
+        options:
+          required: true
+        type: string
+        params: { }
+      title:
+        title: Название
+        type: string
+        params: { }
+      version:
+        title: Установленная версия
+        type: string
+        params: { }
+      status_error:
+        title: Ошибка
+        type: string
+        params: { }
+      status_msg:
+        title: Сообщение
+        type: string
+        params: { }
+      extension_state:
+        title: Состояние
+        ui:
+          widget: Select
+        options:
+          enum:
+            - name: INSTALLED
+              value: 1
+            - name: FAIL
+              value: 3
+            - name: PENDING
+              value: 4
+            - name: IN_PROGRESS
+              value: 2
+        type: number
+        params:
+          format: int
diff --git a/pkg/extension/schema.go b/pkg/extension/schema.go
index 83a0f14275f552f4ee7a2f3eefd813e47789540d..fce794b2f25bccb9391a3abd2901e47e87d3875d 100644
--- a/pkg/extension/schema.go
+++ b/pkg/extension/schema.go
@@ -1,149 +1,12 @@
 package extension
 
 import (
-	"sort"
-
-	"git.perx.ru/perxis/perxis-go/pkg/collections"
-	"git.perx.ru/perxis/perxis-go/pkg/references"
-	"git.perx.ru/perxis/perxis-go/pkg/schema"
-	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
-	"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
+	assets "git.perx.ru/perxis/perxis-go/assets/extension-manager"
+	"git.perx.ru/perxis/perxis-go/pkg/setup"
 )
 
-const (
-	ExtensionsCollectionID   = "space_extensions"
-	ExtensionsCollectionName = "Настройки/Расширения"
-
-	ActionsCollectionID   = "space_actions"
-	ActionsCollectionName = "Настройки/Действия"
+var (
+	Config               = setup.NewConfig().MustLoad(assets.FS)
+	ExtensionsCollection = Config.Collections.Get("space_extensions").Value(nil)
+	ActionsCollection    = Config.Collections.Get("space_actions").Value(nil)
 )
-
-// NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
-func NewActionsCollection(spaceID, envID string) *collections.Collection {
-	sch := schema.New(
-		"action", field.String(validate.Required()).SetTitle("Действие").SetTextSearch(true),
-		"extension", field.String().SetTitle("Расширение (Deprecated)"),
-		"name", field.String().SetTitle("Название").SetTextSearch(true),
-		"description", field.String().SetTitle("Описание"),
-		"icon", field.String().SetTitle("Название иконки").WithUI(&field.UI{Widget: "Icon"}),
-		"image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
-		"kind", field.Number(
-			field.NumberFormatInt,
-			validate.Enum(getEnumOpt(ActionKindName)...),
-		).SetTitle("Р’РёРґ").WithUI(&field.UI{Widget: "Select"}),
-		"autorun", field.Bool().SetTitle("Автозапуск").
-			SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
-			WithUI(&field.UI{Widget: "Checkbox"}),
-		"confirm", field.Bool().SetTitle("С подтверждением").
-			SetDescription("Пользователь должен подтвердить запуск действия").
-			WithUI(&field.UI{Widget: "Checkbox"}),
-		"target", field.Number(
-			field.NumberFormatInt,
-			validate.Enum(getEnumOpt(ActionTargetName)...),
-		).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
-		"view", field.Number(
-			field.NumberFormatInt,
-			validate.Enum(getEnumOpt(ActionViewName)...),
-		).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
-		"parent", field.String().SetTitle("Идентификатор родительского действия"),
-		"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
-			SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
-		"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
-			SetDescription("Группировка действий в пользовательском интерфейсе").
-			WithUI(&field.UI{Widget: "SelectList"}),
-		"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
-			WithUI(&field.UI{Widget: "SelectList"}).
-			SetDescription("Классы данных, к которым применимо действие").
-			SetIndexed(true),
-		"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
-			WithUI(&field.UI{Widget: "BlockList"}),
-		"params_collection", field.String().SetTitle("Коллекция параметров").
-			SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
-		"navigation_action", field.Bool().SetTitle("Навигация (Deprecated)").
-			SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
-			WithUI(&field.UI{Widget: "Checkbox"}),
-		"navigation_route", field.String().SetTitle("Путь в интерфейсе (Deprecated)"),
-	).SetSingleLocale(true)
-
-	// Includes
-	sch.SetIncludes(
-		field.Include{Ref: "hoop_item_options", Optional: true},
-	)
-
-	// UI
-	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
-		"fields":    []interface{}{"icon", "name", "action", "kind", "updated_at", "updated_by", "state"},
-		"sort":      []interface{}{"name"},
-		"page_size": float64(50),
-	}}
-
-	sch.Field.UI.Options["title"] = "name"
-	sch.Field.UI.Options["subtitle"] = "action"
-	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
-
-	return &collections.Collection{
-		ID:      ActionsCollectionID,
-		SpaceID: spaceID,
-		EnvID:   envID,
-		Name:    ActionsCollectionName,
-		Schema:  sch,
-		Hidden:  true,
-	}
-}
-
-func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
-	keys := make([]int32, 0, len(opts))
-	for k := range opts {
-		keys = append(keys, k)
-	}
-	sort.Slice(keys, func(i, j int) bool {
-		return keys[i] < keys[j]
-	})
-
-	enum := make([]validate.EnumOpt, len(opts))
-	for i, n := range keys {
-		enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
-	}
-	return enum
-}
-
-// NewExtensionsCollection - создает коллекцию для хранения статусов расширений в пространстве
-func NewExtensionsCollection(spaceID, envID string) *collections.Collection {
-	sch := schema.New(
-		"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
-		"title", field.String().SetTitle("Название"),
-		"version", field.String().SetTitle("Установленная версия"),
-		"status_error", field.String().SetTitle("Ошибка"),
-		"status_msg", field.String().SetTitle("Сообщение"),
-		"extension_state", field.Number(
-			field.NumberFormatInt,
-			validate.Enum(
-				validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
-				validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
-				validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
-				validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
-			),
-		).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
-	).SetSingleLocale(true)
-
-	// UI
-	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
-		"fields":    []interface{}{"id", "title", "extension_state", "updated_at", "updated_by"},
-		"sort":      []interface{}{"title"},
-		"page_size": float64(50),
-	}}
-
-	sch.Field.UI.Options["title"] = "title"
-	sch.Field.UI.Options["subtitle"] = "id"
-	sch.Field.UI.Options["key"] = "id"
-	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
-
-	return &collections.Collection{
-		ID:      ExtensionsCollectionID,
-		SpaceID: spaceID,
-		EnvID:   envID,
-		Name:    ExtensionsCollectionName,
-		Schema:  sch,
-		Hidden:  true,
-	}
-}
diff --git a/pkg/extension/schema_test.go b/pkg/extension/schema_test.go
index 4b4f235ae6a43bbb7e9c39a56b45c51b530d7103..e17e891e0368888d8797b251fbec6c2fb833615b 100644
--- a/pkg/extension/schema_test.go
+++ b/pkg/extension/schema_test.go
@@ -2,54 +2,183 @@ package extension
 
 import (
 	"encoding/json"
-	"reflect"
+	"sort"
 	"testing"
 
 	"git.perx.ru/perxis/perxis-go/pkg/collections"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
 	"git.perx.ru/perxis/perxis-go/pkg/schema"
+	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
 	"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
+	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
 
-func Test_getEnumOpt(t *testing.T) {
-	tests := []struct {
-		name string
-		opts map[int32]string
-		want []validate.EnumOpt
-	}{
-		{
-			name: "#1",
-			opts: map[int32]string{1: "a", 2: "b", 3: "c", 1000: "w"},
-			want: []validate.EnumOpt{
-				{Name: "a", Value: float64(1)},
-				{Name: "b", Value: float64(2)},
-				{Name: "c", Value: float64(3)},
-				{Name: "w", Value: float64(1000)},
-			},
-		},
+// NewActionsCollection и NewExtensionsCollection добавлены сюда для тестов
+// NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
+func NewActionsCollection(spaceID, envID string) *collections.Collection {
+	sch := schema.New(
+		"action", field.String(validate.Required()).SetTitle("Действие").SetTextSearch(true),
+		"extension", field.String().SetTitle("Расширение (Deprecated)"),
+		"name", field.String().SetTitle("Название").SetTextSearch(true),
+		"description", field.String().SetTitle("Описание"),
+		"icon", field.String().SetTitle("Название иконки").WithUI(&field.UI{Widget: "Icon"}),
+		"image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
+		"kind", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(getEnumOpt(ActionKindName)...),
+		).SetTitle("Р’РёРґ").WithUI(&field.UI{Widget: "Select"}),
+		"autorun", field.Bool().SetTitle("Автозапуск").
+			SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
+			WithUI(&field.UI{Widget: "Checkbox"}),
+		"confirm", field.Bool().SetTitle("С подтверждением").
+			SetDescription("Пользователь должен подтвердить запуск действия").
+			WithUI(&field.UI{Widget: "Checkbox"}),
+		"target", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(getEnumOpt(ActionTargetName)...),
+		).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
+		"view", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(getEnumOpt(ActionViewName)...),
+		).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
+		"parent", field.String().SetTitle("Идентификатор родительского действия"),
+		"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
+			SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
+		"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
+			SetDescription("Группировка действий в пользовательском интерфейсе").
+			WithUI(&field.UI{Widget: "SelectList"}),
+		"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
+			WithUI(&field.UI{Widget: "SelectList"}).
+			SetDescription("Классы данных, к которым применимо действие").
+			SetIndexed(true),
+		"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
+			WithUI(&field.UI{Widget: "BlockList"}),
+		"params_collection", field.String().SetTitle("Коллекция параметров").
+			SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
+		"navigation_action", field.Bool().SetTitle("Навигация (Deprecated)").
+			SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
+			WithUI(&field.UI{Widget: "Checkbox"}),
+		"navigation_route", field.String().SetTitle("Путь в интерфейсе (Deprecated)"),
+	).SetSingleLocale(true)
+
+	// Includes
+	sch.SetIncludes(
+		field.Include{Ref: "hoop_item_options", Optional: true},
+	)
+
+	// UI
+	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
+		"fields":    []interface{}{"icon", "name", "action", "kind", "updated_at", "updated_by", "state"},
+		"sort":      []interface{}{"name"},
+		"page_size": float64(50),
+	}}
+
+	sch.Field.UI.Options["title"] = "name"
+	sch.Field.UI.Options["subtitle"] = "action"
+	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
+
+	return &collections.Collection{
+		ID:      ActionsCollection.ID,
+		SpaceID: spaceID,
+		EnvID:   envID,
+		Name:    ActionsCollection.Name,
+		Schema:  sch,
+		Hidden:  true,
+	}
+}
+
+// NewExtensionsCollection - создает коллекцию для хранения статусов расширений в пространстве
+func NewExtensionsCollection(spaceID, envID string) *collections.Collection {
+	sch := schema.New(
+		"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
+		"title", field.String().SetTitle("Название"),
+		"version", field.String().SetTitle("Установленная версия"),
+		"status_error", field.String().SetTitle("Ошибка"),
+		"status_msg", field.String().SetTitle("Сообщение"),
+		"extension_state", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(
+				validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
+				validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
+				validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
+				validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
+			),
+		).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
+	).SetSingleLocale(true)
+
+	// UI
+	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
+		"fields":    []interface{}{"id", "title", "extension_state", "updated_at", "updated_by"},
+		"sort":      []interface{}{"title"},
+		"page_size": float64(50),
+	}}
+
+	sch.Field.UI.Options["title"] = "title"
+	sch.Field.UI.Options["subtitle"] = "id"
+	sch.Field.UI.Options["key"] = "id"
+	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
+
+	return &collections.Collection{
+		ID:      ExtensionsCollection.ID,
+		SpaceID: spaceID,
+		EnvID:   envID,
+		Name:    ExtensionsCollection.Name,
+		Schema:  sch,
+		Hidden:  true,
 	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := getEnumOpt(tt.opts); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("getEnumOpt() = %v, want %v", got, tt.want)
-			}
-		})
+}
+func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
+	keys := make([]int32, 0, len(opts))
+	for k := range opts {
+		keys = append(keys, k)
 	}
+	sort.Slice(keys, func(i, j int) bool {
+		return keys[i] < keys[j]
+	})
+
+	enum := make([]validate.EnumOpt, len(opts))
+	for i, n := range keys {
+		enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
+	}
+	return enum
 }
 
 func TestEqualSchema(t *testing.T) {
-	for _, collection := range []*collections.Collection{
-		NewActionsCollection("", ""),
-		NewExtensionsCollection("", ""),
-	} {
-		s1 := collection.Schema
-		b, err := s1.MarshalJSON()
-		require.NoError(t, err)
-		s2 := schema.New()
-		err = json.Unmarshal(b, s2)
-		s1.ClearState()
-		s2.ClearState()
-		require.NoError(t, err)
-		require.Equal(t, s1.Field, s2.Field)
-	}
+	t.Run("After marshal", func(t *testing.T) {
+		for _, collection := range []*collections.Collection{
+			ActionsCollection,
+			ExtensionsCollection,
+		} {
+			s1 := collection.Schema
+			b, err := s1.MarshalJSON()
+			require.NoError(t, err)
+			s2 := schema.New()
+			err = json.Unmarshal(b, s2)
+			s1.ClearState()
+			s2.ClearState()
+			require.NoError(t, err)
+			require.Equal(t, s1.Field, s2.Field)
+		}
+	})
+	t.Run("ActionsCollection", func(t *testing.T) {
+		coll := NewActionsCollection("", "")
+		schOld := coll.Schema
+		schNew := ActionsCollection.Schema
+		_ = schOld.ConvertTypes()
+		schOld.ClearState()
+		_ = schNew.ConvertTypes()
+		schNew.ClearState()
+		assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Действия должны совпадать")
+	})
+	t.Run("ExtensionsCollection", func(t *testing.T) {
+		coll := NewExtensionsCollection("", "")
+		schOld := coll.Schema
+		schNew := ExtensionsCollection.Schema
+		_ = schOld.ConvertTypes()
+		schOld.ClearState()
+		_ = schNew.ConvertTypes()
+		schNew.ClearState()
+		assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Расширения должны совпадать")
+	})
 }
diff --git a/pkg/extension/storage.go b/pkg/extension/storage.go
index 6cb8055c957cec7fc4df9a9361f054ba77285b82..c7dd628566b54c9ce2f43e03ff4129a544046a1c 100644
--- a/pkg/extension/storage.go
+++ b/pkg/extension/storage.go
@@ -68,7 +68,7 @@ func infoFromItem(extension string, item *items.Item) *Info {
 
 // GetExtension возвращает состояние расширения в пространстве
 func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, extension string) (*Info, error) {
-	res, err := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension)
+	res, err := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollection.ID, extension)
 	if err != nil && !strings.Contains(err.Error(), "not found") {
 		return nil, err
 	}
@@ -77,7 +77,7 @@ func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, exten
 
 // FindExtensions возвращает состояния расширений в пространстве
 func (s *storage) FindExtensions(ctx context.Context, spaceID, envID string, extensions ...string) ([]*Info, error) {
-	itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, &items.Filter{ID: extensions})
+	itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollection.ID, &items.Filter{ID: extensions})
 	if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) {
 		return nil, err
 	}
@@ -99,7 +99,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
 		ID:           extension,
 		SpaceID:      spaceID,
 		EnvID:        envID,
-		CollectionID: ExtensionsCollectionID,
+		CollectionID: ExtensionsCollection.ID,
 		Data:         make(map[string]interface{}),
 	}
 
@@ -110,7 +110,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
 	_ = item.Set("status_msg", status.Msg)
 	_ = item.Set("status_error", status.Error)
 
-	i, _ := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension)
+	i, _ := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollection.ID, extension)
 	if i == nil {
 		_, err := s.content.Items.Create(ctx, item)
 		return err
@@ -125,7 +125,7 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex
 		ID:           extension,
 		SpaceID:      spaceID,
 		EnvID:        envID,
-		CollectionID: ExtensionsCollectionID,
+		CollectionID: ExtensionsCollection.ID,
 	}
 	return s.content.Items.Delete(ctx, item)
 }
@@ -133,9 +133,8 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex
 func (s *storage) init(ctx context.Context, spaceID, envID string) error {
 	// миграция окружения не должна запуститься, поскольку окружение может быть сломано
 	// расширениями - нужно дать возможность восстановиться
-	stp := setup.NewSetup(s.content, spaceID, envID, s.logger).AddCollections([]*collections.Collection{
-		NewExtensionsCollection(spaceID, envID),
-		NewActionsCollection(spaceID, envID),
-	}, setup.SkipMigration())
+	cfg := Config.Clone()
+	cfg.Collections.WithOptions(func(c *collections.Collection) bool { return true }, setup.SkipMigration())
+	stp := setup.NewSetup(s.content, spaceID, envID, s.logger).WithConfig(cfg)
 	return stp.Install(ctx)
 }