diff --git a/pkg/collections/collection.go b/pkg/collections/collection.go
index ddb73ecad0151b3f185f069ed503f0b4ba4d9165..7af47c90b809bcc307e4f364a1d24ca5837e0043 100644
--- a/pkg/collections/collection.go
+++ b/pkg/collections/collection.go
@@ -86,6 +86,14 @@ type View struct {
 	Filter       string `json:"filter" bson:"filter,omitempty"`       // Правила фильтрации записей оригинальной коллекции
 }
 
+func (v *View) Equal(v1 *View) bool {
+	return v == v1 || v != nil && v1 != nil &&
+		v.SpaceID == v1.SpaceID &&
+		v.EnvID == v1.EnvID &&
+		v.CollectionID == v1.CollectionID &&
+		v.Filter == v1.Filter
+}
+
 type StateInfo struct {
 	State     State     `json:"state" bson:"state"`
 	Info      string    `json:"info" bson:"info"`
diff --git a/pkg/collections/collection_test.go b/pkg/collections/collection_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..79e16a8e6a397418ef2418979bf0e38947b730c8
--- /dev/null
+++ b/pkg/collections/collection_test.go
@@ -0,0 +1,102 @@
+package collections
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestView_Equal(t *testing.T) {
+	testCases := []struct {
+		name  string
+		view1 *View
+		view2 *View
+		want  bool
+	}{
+		{
+			name:  "Both views are nil",
+			view1: nil,
+			view2: nil,
+			want:  true,
+		},
+		{
+			name:  "View1 is nil",
+			view1: nil,
+			view2: &View{},
+			want:  false,
+		},
+		{
+			name:  "View2 is nil",
+			view1: &View{},
+			view2: nil,
+			want:  false,
+		},
+		{
+			name: "Different views",
+			view1: &View{
+				SpaceID:      "spaceID1",
+				EnvID:        "envID1",
+				CollectionID: "collectionID1",
+				Filter:       "filter1",
+			},
+			view2: &View{
+				SpaceID:      "spaceID2",
+				EnvID:        "envID2",
+				CollectionID: "collectionID2",
+				Filter:       "filter2",
+			},
+			want: false,
+		},
+		{
+			name: "Equal views",
+			view1: &View{
+				SpaceID:      "spaceID",
+				EnvID:        "envID",
+				CollectionID: "collectionID",
+				Filter:       "filter",
+			},
+			view2: &View{
+				SpaceID:      "spaceID",
+				EnvID:        "envID",
+				CollectionID: "collectionID",
+				Filter:       "filter",
+			},
+			want: true,
+		},
+		{
+			name:  "Empty view1 and non-empty view2",
+			view1: &View{},
+			view2: &View{
+				SpaceID:      "spaceID",
+				EnvID:        "envID",
+				CollectionID: "collectionID",
+				Filter:       "filter",
+			},
+			want: false,
+		},
+		{
+			name: "Empty view2 and non-empty view1",
+			view1: &View{
+				SpaceID:      "spaceID",
+				EnvID:        "envID",
+				CollectionID: "collectionID",
+				Filter:       "filter",
+			},
+			view2: &View{},
+			want:  false,
+		},
+		{
+			name:  "Empty view1 and view2",
+			view1: &View{},
+			view2: &View{},
+			want:  true,
+		},
+	}
+
+	for _, tc := range testCases {
+		t.Run(tc.name, func(t *testing.T) {
+			output := tc.view1.Equal(tc.view2)
+			require.Equal(t, tc.want, output)
+		})
+	}
+}