diff --git a/pkg/files/field.go b/pkg/files/field.go
index bd237bd622f657861cef5bf608fcf5bf2aba1898..ff4e7db1b4640e3be2cc587059a83171cdf662d5 100644
--- a/pkg/files/field.go
+++ b/pkg/files/field.go
@@ -33,14 +33,21 @@ func (p FileParameters) GetField(f *field.Field, name string) *field.Field {
 }
 
 func (p FileParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field {
-	return []*field.Field{
+	var res []*field.Field
+
+	for _, fld := range []*field.Field{
 		f.SetFieldState("id", field.String()),
 		f.SetFieldState("name", field.String()),
 		f.SetFieldState("mimeType", field.String()),
 		f.SetFieldState("size", field.Number(field.NumberFormatInt)),
 		f.SetFieldState("url", field.String()),
 		f.SetFieldState("key", field.String()),
+	} {
+		if field.ApplyFilterFunc(filter, fld) {
+			res = append(res, fld)
+		}
 	}
+	return res
 }
 
 type FileType struct {
diff --git a/pkg/files/field_test.go b/pkg/files/field_test.go
index 7b6317309654c9027ca0b373b2362b7d3aad54af..a51fbe46b582a8118fb4acc1afd96c80f35f6e97 100644
--- a/pkg/files/field_test.go
+++ b/pkg/files/field_test.go
@@ -6,6 +6,7 @@ import (
 	"git.perx.ru/perxis/perxis-go/pkg/schema"
 	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 
 func TestFileField_Get(t *testing.T) {
@@ -32,3 +33,43 @@ func TestFileField_Get(t *testing.T) {
 	assert.Equal(t, field.String(), sch.GetField("b.file.key"))
 	assert.Equal(t, field.Number(field.NumberFormatInt), sch.GetField("b.file.size"))
 }
+
+func TestFileField_ListFields(t *testing.T) {
+	tests := []struct {
+		name   string
+		file   *field.Field
+		filter field.FieldFilterFunc
+		want   []*field.Field
+	}{
+		{
+			name: "Without filter",
+			file: Field(),
+			want: []*field.Field{
+				field.String(),                      // id
+				field.String(),                      // name
+				field.String(),                      // mimeType
+				field.Number(field.NumberFormatInt), // size
+				field.String(),                      // url
+				field.String(),                      // key
+			},
+		},
+		{
+			name:   "With filter",
+			file:   Field(),
+			filter: func(f *field.Field) bool { return f.GetType().Name() == "number" },
+			want: []*field.Field{
+				field.Number(field.NumberFormatInt), // size
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var filters []field.FieldFilterFunc
+			if tt.filter != nil {
+				filters = append(filters, tt.filter)
+			}
+			got := tt.file.ListFields(filters...)
+			require.Equal(t, tt.want, got)
+		})
+	}
+}
diff --git a/pkg/references/field.go b/pkg/references/field.go
index f80e7b5a564efe81df2969fb35f14d69fd23a1c8..f64143cee3d3814dec0fb735f82ad05dd4c3079e 100644
--- a/pkg/references/field.go
+++ b/pkg/references/field.go
@@ -37,11 +37,18 @@ func (p ReferenceParameters) GetField(f *field.Field, name string) *field.Field
 	return f.SetFieldState(name, fld)
 }
 func (p ReferenceParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field {
-	return []*field.Field{
+	var res []*field.Field
+
+	for _, fld := range []*field.Field{
 		f.SetFieldState("id", field.String()),
 		f.SetFieldState("collection_id", field.String()),
 		f.SetFieldState("disabled", field.Bool()),
+	} {
+		if field.ApplyFilterFunc(filter, fld) {
+			res = append(res, fld)
+		}
 	}
+	return res
 }
 
 type ReferenceType struct{}
diff --git a/pkg/references/field_test.go b/pkg/references/field_test.go
index ac9d5c03db107ed8f284cab3c9205afe95f1502b..8f2458c8820bfb2d5ad8d6a024bb97c65bb88b1d 100644
--- a/pkg/references/field_test.go
+++ b/pkg/references/field_test.go
@@ -318,3 +318,40 @@ func TestReferenceField_Get(t *testing.T) {
 	assert.Equal(t, field.Bool(), sch.GetField("b.ref.disabled"))
 
 }
+
+func TestReferenceField_ListFields(t *testing.T) {
+	tests := []struct {
+		name   string
+		file   *field.Field
+		filter field.FieldFilterFunc
+		want   []*field.Field
+	}{
+		{
+			name: "Without filter",
+			file: Field([]string{}),
+			want: []*field.Field{
+				field.String(), // id
+				field.String(), // collection_id
+				field.Bool(),   // disabled
+			},
+		},
+		{
+			name:   "With filter",
+			file:   Field([]string{}),
+			filter: func(f *field.Field) bool { return f.GetType().Name() == "bool" },
+			want: []*field.Field{
+				field.Bool(), // disabled
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var filters []field.FieldFilterFunc
+			if tt.filter != nil {
+				filters = append(filters, tt.filter)
+			}
+			got := tt.file.ListFields(filters...)
+			require.Equal(t, tt.want, got)
+		})
+	}
+}
diff --git a/pkg/schema/field/array.go b/pkg/schema/field/array.go
index 682b6e5e7774cbf98e93fc31261e114b574049e7..b804dd92dbecfa880a43de9fc1c48b3aa854eece 100644
--- a/pkg/schema/field/array.go
+++ b/pkg/schema/field/array.go
@@ -35,7 +35,10 @@ func (a ArrayParameters) GetField(f *Field, name string) *Field {
 func (a ArrayParameters) ListFields(f *Field, filterFunc ...FieldFilterFunc) []*Field {
 	f.SetFieldState("Item", a.Item)
 
-	return []*Field{a.Item}
+	if ApplyFilterFunc(filterFunc, a.Item) {
+		return []*Field{a.Item}
+	}
+	return nil
 }
 
 type ArrayType struct{}
diff --git a/pkg/schema/field/array_test.go b/pkg/schema/field/array_test.go
index ab8eae74376154ba89ce5a41ebc885da7bc15a1a..976c0d52377b5d4ce7052f8cd01f4904fd88c99e 100644
--- a/pkg/schema/field/array_test.go
+++ b/pkg/schema/field/array_test.go
@@ -267,3 +267,40 @@ func TestArrayField_WithType(t *testing.T) {
 		assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}})
 	})
 }
+
+func TestArrayField_ListFields(t *testing.T) {
+	tests := []struct {
+		name   string
+		field  *Field
+		filter FieldFilterFunc
+		want   []*Field
+	}{
+		{
+			name:  "Without filter",
+			field: Array(Number("number")),
+			want:  []*Field{Number("number")},
+		},
+		{
+			name:   "With filter positive",
+			field:  Array(Number("number").SetTextSearch(true)),
+			filter: func(f *Field) bool { return f.TextSearch },
+			want:   []*Field{Number("number").SetTextSearch(true)},
+		},
+		{
+			name:   "With filter negative",
+			field:  Array(Number("float")),
+			filter: func(f *Field) bool { return f.TextSearch },
+			want:   nil,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var filters []FieldFilterFunc
+			if tt.filter != nil {
+				filters = append(filters, tt.filter)
+			}
+			got := tt.field.ListFields(filters...)
+			require.Equal(t, tt.want, got)
+		})
+	}
+}