diff --git a/id/bson.go b/id/bson.go
index 8f8cae7d479e4c6f4770fafe2845f09093b94877..4aa98c09428cc86dde3053c517c0cd0db53c922d 100644
--- a/id/bson.go
+++ b/id/bson.go
@@ -1,18 +1,12 @@
 package id
 
 import (
-	"fmt"
-
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/bsonrw"
 	"go.mongodb.org/mongo-driver/bson/bsontype"
 )
 
-//func (id *ID) MarshalBSON() ([]byte, error) {
-//	return bson.Marshal(id.String())
-//}
-
 func (id *ID) MarshalBSONValue() (bsontype.Type, []byte, error) {
 	data := id.String()
 	return bson.MarshalValue(data)
@@ -20,13 +14,12 @@ func (id *ID) MarshalBSONValue() (bsontype.Type, []byte, error) {
 
 func (id *ID) UnmarshalBSONValue(btype bsontype.Type, data []byte) error {
 	if btype != bson.TypeString {
-		return errors.New("cannot unmarshal non-string bson value to MyTime")
+		return errors.New("cannot unmarshal non-string bson value to ID")
 	}
 	dec, err := bson.NewDecoder(bsonrw.NewBSONValueReader(btype, data))
 	if err != nil {
 		return err
 	}
-	fmt.Println(string(data))
 	var str string
 	if err = dec.Decode(&str); err != nil {
 		return err
diff --git a/id/bson_test.go b/id/bson_test.go
index 4a7ca5dedbf8842d02b80c035c638c8aa4babcff..952ecf596c23373bd2a7917645b863e03331cc06 100644
--- a/id/bson_test.go
+++ b/id/bson_test.go
@@ -8,40 +8,96 @@ import (
 	"go.mongodb.org/mongo-driver/bson"
 )
 
-func TestID_BSON(t *testing.T) {
+func TestID_MarshalUnmarshalBSON(t *testing.T) {
+	tests := []struct {
+		name string
+		id   *ID
+	}{
+		{
+			name: "OrganizationID",
+			id:   &ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
+		},
+		{
+			name: "UserID",
+			id:   &ID{Descriptor: &UserID{UserID: "1"}},
+		},
+		{
+			name: "ServiceID",
+			id:   &ID{Descriptor: &ServiceID{ServiceID: "1"}},
+		},
+		{
+			name: "SpaceID",
+			id:   &ID{Descriptor: &SpaceID{SpaceID: "1"}},
+		},
+		{
+			name: "EnvironmentID",
+			id:   &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
+		},
+		{
+			name: "ClientID",
+			id:   &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
+		},
+		{
+			name: "RoleID",
+			id:   &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
+		},
+		{
+			name: "CollectionID",
+			id:   &ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
+		},
+		{
+			name: "SchemaID",
+			id:   &ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
+		},
+		{
+			name: "ItemID",
+			id:   &ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
+		},
+		{
+			name: "RevisionID",
+			id:   &ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
+		},
+		{
+			name: "FieldID",
+			id:   &ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
+		},
+	}
+	type test struct {
+		Text string
+		ID   *ID
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := &test{Text: tt.name, ID: tt.id}
+
+			b, err := bson.Marshal(s)
+			require.NoError(t, err)
+
+			var v *test
+			require.NoError(t, bson.Unmarshal(b, &v))
+			assert.Equal(t, s, v, "после Unmarshal объект должен быть идентичен исходному")
+		})
+	}
+}
+
+func TestID_ExampleBSON(t *testing.T) {
 	type data struct {
 		ID     *ID
 		Text   string
 		Number int
 	}
 
-	test1 := &data{
+	test := &data{
 		ID:     &ID{Descriptor: &SpaceID{SpaceID: Space}},
 		Text:   "text",
 		Number: 1,
 	}
 
-	b, err := bson.Marshal(test1)
-	require.NoError(t, err)
-	str := string(b)
-	_ = str
-
-	test2 := new(data)
-	err = bson.Unmarshal(b, &test2)
-	require.NoError(t, err)
-	assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
-
-	test1 = &data{
-		ID:     &ID{Descriptor: &OrganizationID{OrganizationID: Organization}},
-		Text:   "text2",
-		Number: 2,
-	}
-
-	b, err = bson.Marshal(test1)
+	b, err := bson.Marshal(test)
 	require.NoError(t, err)
 
-	test2 = new(data)
-	err = bson.Unmarshal(b, &test2)
+	buf := new(data)
+	err = bson.Unmarshal(b, &buf)
 	require.NoError(t, err)
-	assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
+	assert.Equal(t, test, buf, "после Unmarshal объект должен совпадать с исходным")
 }
diff --git a/id/id.go b/id/id.go
index f580c52f7535bf9f601df0b24c734b774111498c..920b4edba74cd60c9bf62733de553722d22c66f4 100644
--- a/id/id.go
+++ b/id/id.go
@@ -126,6 +126,9 @@ func (id *ID) FromMap(m map[string]any) error {
 	default:
 		return errors.New("unknown type")
 	}
-	_ = id.Descriptor.FromMap(m)
+	if err := id.Descriptor.FromMap(m); err != nil {
+		return err
+	}
+
 	return nil
 }
diff --git a/id/json_test.go b/id/json_test.go
index 8308019dd8dc55b58205c9826325076c5ac96f7f..b67bcb3fd15a366c458df0ac91b96d1e82940eea 100644
--- a/id/json_test.go
+++ b/id/json_test.go
@@ -8,191 +8,90 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func TestID_MarshalJSON(t *testing.T) {
+func TestID_MarshalUnmarshalJSON(t *testing.T) {
 	tests := []struct {
 		name string
-		id   ID
-		want string
+		id   *ID
 	}{
 		{
 			name: "OrganizationID",
-			id:   ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
-			want: `"/orgs/1"`,
+			id:   &ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
 		},
 		{
 			name: "UserID",
-			id:   ID{Descriptor: &UserID{UserID: "1"}},
-			want: `"/users/1"`,
+			id:   &ID{Descriptor: &UserID{UserID: "1"}},
 		},
 		{
 			name: "ServiceID",
-			id:   ID{Descriptor: &ServiceID{ServiceID: "1"}},
-			want: `"/services/1"`,
+			id:   &ID{Descriptor: &ServiceID{ServiceID: "1"}},
 		},
 		{
 			name: "SpaceID",
-			id:   ID{Descriptor: &SpaceID{SpaceID: "1"}},
-			want: `"/spaces/1"`,
+			id:   &ID{Descriptor: &SpaceID{SpaceID: "1"}},
 		},
 		{
 			name: "EnvironmentID",
-			id:   ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			want: `"/spaces/1/envs/1"`,
+			id:   &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
 		},
 		{
 			name: "ClientID",
-			id:   ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			want: `"/spaces/1/clients/1"`,
+			id:   &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
 		},
 		{
 			name: "RoleID",
-			id:   ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			want: `"/spaces/1/roles/1"`,
+			id:   &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
 		},
 		{
 			name: "CollectionID",
-			id:   ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
-			want: `"/spaces/1/envs/1/cols/1"`,
+			id:   &ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
 		},
 		{
 			name: "SchemaID",
-			id:   ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
-			want: `"/spaces/1/envs/1/schema/1"`,
+			id:   &ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
 		},
 		{
 			name: "ItemID",
-			id:   ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
-			want: `"/spaces/1/envs/1/cols/1/items/1"`,
+			id:   &ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
 		},
 		{
 			name: "RevisionID",
-			id:   ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
-			want: `"/spaces/1/envs/1/cols/1/items/1/revs/1"`,
+			id:   &ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
 		},
 		{
 			name: "FieldID",
-			id:   ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
-			want: `"/spaces/1/envs/1/cols/1/items/1/fields/1"`,
+			id:   &ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := jsoniter.Marshal(&tt.id)
+			b, err := jsoniter.Marshal(&tt.id)
 			require.NoError(t, err)
-			assert.Equal(t, tt.want, string(got))
-		})
-	}
-}
 
-func TestID_UnmarshalJSON(t *testing.T) {
-	tests := []struct {
-		id   string
-		want ID
-		b    []byte
-	}{
-		{
-			id:   "OrganizationID",
-			want: ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
-			b:    []byte(`"/orgs/1"`),
-		},
-		{
-			id:   "UserID",
-			want: ID{Descriptor: &UserID{UserID: "1"}},
-			b:    []byte(`"/users/1"`),
-		},
-		{
-			id:   "ServiceID",
-			want: ID{Descriptor: &ServiceID{ServiceID: "1"}},
-			b:    []byte(`"/services/1"`),
-		},
-		{
-			id:   "SpaceID",
-			want: ID{Descriptor: &SpaceID{SpaceID: "1"}},
-			b:    []byte(`"/spaces/1"`),
-		},
-		{
-			id:   "EnvironmentID",
-			want: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			b:    []byte(`"/spaces/1/envs/1"`),
-		},
-		{
-			id:   "ClientID",
-			want: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			b:    []byte(`"/spaces/1/clients/1"`),
-		},
-		{
-			id:   "RoleID",
-			want: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
-			b:    []byte(`"/spaces/1/roles/1"`),
-		},
-		{
-			id:   "CollectionID",
-			want: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
-			b:    []byte(`"/spaces/1/envs/1/cols/1"`),
-		},
-		{
-			id:   "SchemaID",
-			want: ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
-			b:    []byte(`"/spaces/1/envs/1/schema/1"`),
-		},
-		{
-			id:   "ItemID",
-			want: ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
-			b:    []byte(`"/spaces/1/envs/1/cols/1/items/1"`),
-		},
-		{
-			id:   "RevisionID",
-			want: ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
-			b:    []byte(`"/spaces/1/envs/1/cols/1/items/1/revs/1"`),
-		},
-		{
-			id:   "FieldID",
-			want: ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
-			b:    []byte(`"/spaces/1/envs/1/cols/1/items/1/fields/1"`),
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.id, func(t *testing.T) {
 			var i ID
-			err := jsoniter.Unmarshal(tt.b, &i)
-			require.NoError(t, err)
-			assert.Equal(t, tt.want, i)
+			require.NoError(t, jsoniter.Unmarshal(b, &i))
+			assert.Equal(t, tt.id, &i, "после Unmarshal объект должен быть идентичен исходному")
 		})
 	}
 }
 
-func TestID_JSON(t *testing.T) {
+func TestID_ExampleJSON(t *testing.T) {
 	type data struct {
 		ID     *ID
 		Text   string
 		Number int
 	}
 
-	test1 := &data{
+	test := &data{
 		ID:     &ID{Descriptor: &SpaceID{SpaceID: Space}},
 		Text:   "text",
 		Number: 1,
 	}
 
-	b, err := jsoniter.Marshal(test1)
-	require.NoError(t, err)
-
-	test2 := new(data)
-	err = jsoniter.Unmarshal(b, &test2)
-	require.NoError(t, err)
-	assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
-
-	test1 = &data{
-		ID:     &ID{Descriptor: &OrganizationID{OrganizationID: Organization}},
-		Text:   "text2",
-		Number: 2,
-	}
-
-	b, err = jsoniter.Marshal(test1)
+	b, err := jsoniter.Marshal(test)
 	require.NoError(t, err)
 
-	test2 = new(data)
-	err = jsoniter.Unmarshal(b, &test2)
+	buf := new(data)
+	err = jsoniter.Unmarshal(b, &test)
 	require.NoError(t, err)
-	assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
+	assert.Equal(t, test, buf, "после Unmarshal объект должен совпадать с исходным")
 }