diff --git a/perxis-proto b/perxis-proto
index f000812a1eef24093c0d0abf1318e3179b679773..3459e1839d2a65bff0ca681b50670f4829b9546b 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit f000812a1eef24093c0d0abf1318e3179b679773
+Subproject commit 3459e1839d2a65bff0ca681b50670f4829b9546b
diff --git a/pkg/environments/options.go b/pkg/environments/options.go
index 02f1a1fea3229ccfe702401c2dfa06e5094d9671..e92919312c109ac6699124c1cc15c30fc7ee0acc 100644
--- a/pkg/environments/options.go
+++ b/pkg/environments/options.go
@@ -2,8 +2,11 @@ package environments
 
 type MigrateOptions struct {
 
-	// Ожидать завершения миграции в синхронном режиме
+	// Deprecated - миграция по умолчанию выполняется синхронно
 	Wait bool
+
+	// Async - запустить миграцию в асинхронном режиме
+	Async bool
 }
 
 func MergeMigrateOptions(opts ...*MigrateOptions) *MigrateOptions {
@@ -12,6 +15,9 @@ func MergeMigrateOptions(opts ...*MigrateOptions) *MigrateOptions {
 		if opt.Wait {
 			o.Wait = true
 		}
+		if opt.Async {
+			o.Async = true
+		}
 	}
 	return o
 }
diff --git a/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go b/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
index cb9ee820f529f6ae1389415735dccbcdcd1bfee5..fc48a7df17300fecc73e0715821e9005cf394455 100644
--- a/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/environments/transport/grpc/protobuf_type_converters.microgen.go
@@ -88,12 +88,12 @@ func ProtoToListPtrEnvironment(protoEnvs []*pb.Environment) ([]*service.Environm
 
 func ElPtrMigrateOptionsToProto(options []*service.MigrateOptions) (*pb.MigrateOptions, error) {
 	opts := service.MergeMigrateOptions(options...)
-	return &pb.MigrateOptions{Wait: opts.Wait}, nil
+	return &pb.MigrateOptions{Wait: opts.Wait, Async: opts.Async}, nil
 }
 
 func ProtoToElPtrMigrateOptions(protoOptions *pb.MigrateOptions) ([]*service.MigrateOptions, error) {
 	if protoOptions == nil {
 		return nil, nil
 	}
-	return []*service.MigrateOptions{{Wait: protoOptions.Wait}}, nil
+	return []*service.MigrateOptions{{Wait: protoOptions.Wait, Async: protoOptions.Async}}, nil
 }
diff --git a/proto/clients/clients.pb.go b/proto/clients/clients.pb.go
index b9b1cea0655d744c267d3aeeb2b816a4c6451d12..4c75762d6119e199e3113a4086a198f102ef09aa 100644
--- a/proto/clients/clients.pb.go
+++ b/proto/clients/clients.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: clients/clients.proto
 
 package clients
@@ -35,11 +35,12 @@ type Client struct {
 	// Описание клиента, назначение
 	Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"`
 	// Приложение отключено и не может авторизоваться
-	Disabled *bool          `protobuf:"varint,7,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"`
-	RoleId   string         `protobuf:"bytes,8,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
-	Oauth    *Client_OAuth  `protobuf:"bytes,10,opt,name=oauth,proto3" json:"oauth,omitempty"`
-	Tls      *Client_TLS    `protobuf:"bytes,11,opt,name=tls,proto3" json:"tls,omitempty"`
-	ApiKey   *Client_APIKey `protobuf:"bytes,12,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"`
+	Disabled *bool `protobuf:"varint,7,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"`
+	// Идентификатор роли клиента
+	RoleId string         `protobuf:"bytes,8,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	Oauth  *Client_OAuth  `protobuf:"bytes,10,opt,name=oauth,proto3" json:"oauth,omitempty"`
+	Tls    *Client_TLS    `protobuf:"bytes,11,opt,name=tls,proto3" json:"tls,omitempty"`
+	ApiKey *Client_APIKey `protobuf:"bytes,12,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"`
 }
 
 func (x *Client) Reset() {
diff --git a/proto/clients/clients_grpc.pb.go b/proto/clients/clients_grpc.pb.go
index f442fc157b74957f29c2559b616154fb7167abe4..9b701db881a10acc1021de4e49cbf3b5ff4acd8a 100644
--- a/proto/clients/clients_grpc.pb.go
+++ b/proto/clients/clients_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: clients/clients.proto
 
 package clients
diff --git a/proto/collections/collections.pb.go b/proto/collections/collections.pb.go
index 9c70451d3ba2ea24fad8b403a27564d426b89594..71712728599d799f2bbeb975196a8fc75b77e042 100644
--- a/proto/collections/collections.pb.go
+++ b/proto/collections/collections.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: collections/collections.proto
 
 package collections
@@ -154,19 +154,23 @@ type Collection struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id        string                `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	SpaceId   string                `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId     string                `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	Name      string                `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
-	Single    *bool                 `protobuf:"varint,5,opt,name=single,proto3,oneof" json:"single,omitempty"`
-	System    *bool                 `protobuf:"varint,6,opt,name=system,proto3,oneof" json:"system,omitempty"`
+	Id      string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	SpaceId string `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId   string `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	Name    string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Коллекция может содержать ровно одну запись. При работе с записью в такой коллекции идентификатор записи в
+	// обращениях в API можно не указывать и предполагать, что запись всегда есть (ее не нужно создавать)
+	Single *bool `protobuf:"varint,5,opt,name=single,proto3,oneof" json:"single,omitempty"`
+	System *bool `protobuf:"varint,6,opt,name=system,proto3,oneof" json:"system,omitempty"`
+	// Коллекция не содержит данных. Возможно создание таких коллекций для использования как подключаемые подсхемы в
+	// других коллекциях
 	NoData    *bool                 `protobuf:"varint,12,opt,name=no_data,json=noData,proto3,oneof" json:"no_data,omitempty"`
 	Schema    string                `protobuf:"bytes,7,opt,name=schema,proto3" json:"schema,omitempty"`
 	Hidden    bool                  `protobuf:"varint,13,opt,name=hidden,proto3" json:"hidden,omitempty"`
 	View      *Collection_View      `protobuf:"bytes,9,opt,name=view,proto3" json:"view,omitempty"`
 	StateInfo *Collection_StateInfo `protobuf:"bytes,10,opt,name=state_info,json=stateInfo,proto3" json:"state_info,omitempty"`
 	Tags      []string              `protobuf:"bytes,16,rep,name=tags,proto3" json:"tags,omitempty"`
-	Access    *Access               `protobuf:"bytes,20,opt,name=access,proto3" json:"access,omitempty"`
+	Access    *Access               `protobuf:"bytes,20,opt,name=access,proto3" json:"access,omitempty"` // Возможные действия с коллекцией на основе контекста запроса
 }
 
 func (x *Collection) Reset() {
diff --git a/proto/collections/collections_grpc.pb.go b/proto/collections/collections_grpc.pb.go
index 824303740bd9b178f09b627052dbf464b75a3d95..eef27369eed0b0501ee45365e6195e4c52ea85c5 100644
--- a/proto/collections/collections_grpc.pb.go
+++ b/proto/collections/collections_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: collections/collections.proto
 
 package collections
@@ -32,11 +32,25 @@ const (
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type CollectionsClient interface {
+	// Создать коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Create` игнорируется
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
+	// Получить коллекцию. Схема коллекции возвращается полная, т.е. включая все подключаемые подсхемы, если не указано
+	// обратное в `GetRequest.options`
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
+	// Возвращает список коллекций, отсортированных в алфавитном порядке. По умолчанию не возвращает коллекции без данных
+	// и скрытые коллекции, подробнее см. `ListRequest.filter`
 	List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error)
+	// Обновить коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Update` игнорируется
 	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Установить схему коллекции. По результатам вызова метода не происходит *применение* схемы - например,
+	// не перестраиваются индексы БД коллекции, поскольку это может быть длительный процесс. После редактирования всех
+	// необходимых схем окружения необходимо их применить - выполнить миграцию путем вызова метода `Environments.Migrate`.
+	// Если схема коллекции изменена, но миграция еще не была запущена, коллекция будет находиться в состоянии `CHANGED`.
+	//
+	// Если в процессе миграции возникли ошибки, в соответствующие коллекции в поле `Collection.state_info` будет записано
+	// содержание ошибки и установлено состояние `ERROR`
 	SetSchema(ctx context.Context, in *SetSchemaRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Удалить коллекцию
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 }
 
@@ -106,11 +120,25 @@ func (c *collectionsClient) Delete(ctx context.Context, in *DeleteRequest, opts
 // All implementations must embed UnimplementedCollectionsServer
 // for forward compatibility
 type CollectionsServer interface {
+	// Создать коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Create` игнорируется
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
+	// Получить коллекцию. Схема коллекции возвращается полная, т.е. включая все подключаемые подсхемы, если не указано
+	// обратное в `GetRequest.options`
 	Get(context.Context, *GetRequest) (*GetResponse, error)
+	// Возвращает список коллекций, отсортированных в алфавитном порядке. По умолчанию не возвращает коллекции без данных
+	// и скрытые коллекции, подробнее см. `ListRequest.filter`
 	List(context.Context, *ListRequest) (*ListResponse, error)
+	// Обновить коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Update` игнорируется
 	Update(context.Context, *UpdateRequest) (*emptypb.Empty, error)
+	// Установить схему коллекции. По результатам вызова метода не происходит *применение* схемы - например,
+	// не перестраиваются индексы БД коллекции, поскольку это может быть длительный процесс. После редактирования всех
+	// необходимых схем окружения необходимо их применить - выполнить миграцию путем вызова метода `Environments.Migrate`.
+	// Если схема коллекции изменена, но миграция еще не была запущена, коллекция будет находиться в состоянии `CHANGED`.
+	//
+	// Если в процессе миграции возникли ошибки, в соответствующие коллекции в поле `Collection.state_info` будет записано
+	// содержание ошибки и установлено состояние `ERROR`
 	SetSchema(context.Context, *SetSchemaRequest) (*emptypb.Empty, error)
+	// Удалить коллекцию
 	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
 	mustEmbedUnimplementedCollectionsServer()
 }
diff --git a/proto/environments/environments.pb.go b/proto/environments/environments.pb.go
index fdae1371c354aa97141b6f23598730e3656c9fd0..cec837936e68784f4edc1615f8139194fb1e7027 100644
--- a/proto/environments/environments.pb.go
+++ b/proto/environments/environments.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: environments/environments.proto
 
 package environments
@@ -871,7 +871,8 @@ type MigrateOptions struct {
 
 	// Ожидать завершения миграции в синхронном режиме. Если в запрос передан контекст с таймаутом,
 	// то после истечения таймаута миграция продолжится в асинхронном режиме
-	Wait bool `protobuf:"varint,1,opt,name=wait,proto3" json:"wait,omitempty"`
+	Wait  bool `protobuf:"varint,1,opt,name=wait,proto3" json:"wait,omitempty"`   // Deprecated - миграция по умолчанию выполняется синхронно
+	Async bool `protobuf:"varint,2,opt,name=async,proto3" json:"async,omitempty"` // Выполнить миграцию в асинхронном режиме
 }
 
 func (x *MigrateOptions) Reset() {
@@ -913,6 +914,13 @@ func (x *MigrateOptions) GetWait() bool {
 	return false
 }
 
+func (x *MigrateOptions) GetAsync() bool {
+	if x != nil {
+		return x.Async
+	}
+	return false
+}
+
 var File_environments_environments_proto protoreflect.FileDescriptor
 
 var file_environments_environments_proto_rawDesc = []byte{
@@ -1009,54 +1017,55 @@ var file_environments_environments_proto_rawDesc = []byte{
 	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
 	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67,
 	0x72, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x4f,
+	0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x4f,
 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x32, 0x81, 0x05, 0x0a, 0x0c, 0x45,
-	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x06, 0x43,
-	0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-	0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73,
+	0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63,
+	0x32, 0x81, 0x05, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x12, 0x55, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f,
 	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x12, 0x4f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x47, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
-	0x74, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, 0x53, 0x65,
-	0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x65,
-	0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76,
-	0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65,
-	0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65,
-	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
-	0x79, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x24,
+	0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,
+	0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21,
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
-	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x3e,
-	0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-	0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69,
+	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
+	0x12, 0x4b, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+	0x6e, 0x74, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a,
+	0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x28, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+	0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
+	0x12, 0x47, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x07, 0x4d, 0x69, 0x67,
+	0x72, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65,
+	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x22, 0x00, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
+	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
+	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+	0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/proto/environments/environments_grpc.pb.go b/proto/environments/environments_grpc.pb.go
index 6679d70738a62e277e9c41c6bd237246d7b88e76..0ccbe114f6bdfd02aeb9aed7c016a62d807f935a 100644
--- a/proto/environments/environments_grpc.pb.go
+++ b/proto/environments/environments_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: environments/environments.proto
 
 package environments
@@ -41,6 +41,13 @@ type EnvironmentsClient interface {
 	SetAlias(ctx context.Context, in *SetAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	RemoveAlias(ctx context.Context, in *RemoveAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	// Выполнить миграцию окружения. По умолчанию выполняется в асинхронном режиме, для синхронного выполнения можно
+	// передать соответствующую настройку в опциях `MigrateRequest.options`
+	//
+	// При вызове миграции:
+	// - выполняются миграции для всех коллекций окружения
+	//
+	// В случае возникновения ошибок миграции они записываются в поле `Environment.state`
 	Migrate(ctx context.Context, in *MigrateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 }
 
@@ -135,6 +142,13 @@ type EnvironmentsServer interface {
 	SetAlias(context.Context, *SetAliasRequest) (*emptypb.Empty, error)
 	RemoveAlias(context.Context, *RemoveAliasRequest) (*emptypb.Empty, error)
 	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
+	// Выполнить миграцию окружения. По умолчанию выполняется в асинхронном режиме, для синхронного выполнения можно
+	// передать соответствующую настройку в опциях `MigrateRequest.options`
+	//
+	// При вызове миграции:
+	// - выполняются миграции для всех коллекций окружения
+	//
+	// В случае возникновения ошибок миграции они записываются в поле `Environment.state`
 	Migrate(context.Context, *MigrateRequest) (*emptypb.Empty, error)
 	mustEmbedUnimplementedEnvironmentsServer()
 }
diff --git a/proto/extensions/extension.pb.go b/proto/extensions/extension.pb.go
index ffeb45ce3549c26d76aea4ac2bb997fb76e4e46d..23120cb2360e06a7b62529ff92183044efebe791 100644
--- a/proto/extensions/extension.pb.go
+++ b/proto/extensions/extension.pb.go
@@ -10,8 +10,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.23.4
 // source: extensions/extension.proto
 
 package extensions
@@ -978,20 +978,20 @@ func (x *ActionResponse) GetRefs() []*references.Reference {
 	return nil
 }
 
-// *
-// Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
-// получения ответа  (см. `ActionResponse.next`)
+//*
+//Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
+//получения ответа  (см. `ActionResponse.next`)
 //
-// Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
+//Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
 //
-// Коллекция: space_actions (Пространство/Действия)
-// Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
+//Коллекция: space_actions (Пространство/Действия)
+//Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
 //
-// Пользовательские действия добавляются при установке расширений или при
-// настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
-// им действий в коллекции.
+//Пользовательские действия добавляются при установке расширений или при
+//настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
+//им действий в коллекции.
 //
-// Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
+//Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
 type Action struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1027,6 +1027,7 @@ type Action struct {
 	// - :envId
 	// - :colId
 	// - :itemId
+	//
 	NavigationRoute string `protobuf:"bytes,10510,opt,name=navigation_route,json=navigationRoute,proto3" json:"navigation_route,omitempty"`
 }
 
diff --git a/proto/extensions/extension_grpc.pb.go b/proto/extensions/extension_grpc.pb.go
index 2d19448ba786db2501c69cf31b34cb8c91de714b..550f0bdfada581863151e88ec94e4732d9a94508 100644
--- a/proto/extensions/extension_grpc.pb.go
+++ b/proto/extensions/extension_grpc.pb.go
@@ -11,7 +11,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.23.4
 // source: extensions/extension.proto
 
 package extensions
@@ -63,10 +63,10 @@ type ExtensionClient interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
+	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//   параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.
@@ -153,10 +153,10 @@ type ExtensionServer interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
+	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//   параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.