Как добавить новое поле в форму «Отбор и сортировка» в 1С на обычных формах

Программист 1С v8.3 (Обычные формы)
← На главную

Работа в таких конфигурациях, как Управление производственным предприятием (УПП) 1.3, часто требует расширения типового функционала. Одной из популярных задач является добавление новых реквизитов в документы и обеспечение возможности фильтрации и упорядочивания по этим полям непосредственно в списках документов. В обычных формах 1С механизмы отбора и сортировки работают иначе, чем в управляемых, и требуют понимания связи между метаданными объекта и элементами формы.

Рассмотрим подробно, каким образом можно добавить новое поле в стандартную системную форму «Отбор и сортировка», чтобы пользователь мог самостоятельно настраивать списки документов «Поступление товаров и услуг» или любых других объектов.

Механизм формирования списка отборов

Прежде всего, разберем принцип работы платформы. Диалоговое окно «Отбор и сортировка» в обычных формах — это стандартный интерфейс, который платформа 1С генерирует автоматически. Список доступных полей в этом окне не рисуется вручную программистом в отдельной форме, он напрямую зависит от состава колонок табличного поля, которое отображает список документов на форме (обычно это объект типа ДокументСписок).

Проанализируем шаги, необходимые для того, чтобы реквизит стал доступен для фильтрации.

Шаг 1: Добавление колонки в форму списка

Первым делом нам необходимо убедиться, что реквизит присутствует в экранной форме списка. Для этого выполним следующие действия:

  1. Откроем конфигуратор и найдем нужную форму списка документа (например, ФормаСписка документа ПоступлениеТоваровУслуг).
  2. Найдем основной элемент управления — табличное поле, данные которого связаны с объектом ДокументСписок.
  3. Добавим новую колонку в это табличное поле. В свойствах колонки в поле Данные укажем наш новый реквизит документа.

Важный нюанс: Если по условиям задачи пользователю не нужно видеть эту колонку визуально в журнале, мы можем скрыть её, установив свойство Видимость в значение Ложь. Однако для того, чтобы платформа «подцепила» это поле в механизм отбора, оно обязательно должно присутствовать в составе колонок табличного поля.

Шаг 2: Настройка возможности сортировки (Индексирование)

Часто программисты сталкиваются с тем, что после добавления колонки поле появляется в списке отборов, но отсутствует на закладке «Сортировка». Разберемся, почему так происходит. Платформа 1С может выполнять быструю сортировку в динамических списках только по тем полям, которые проиндексированы на уровне базы данных (SQL).

Выясним, как включить индексирование:

  1. Перейдем в дерево метаданных к нужному документу.
  2. Найдем наш реквизит и откроем его свойства.
  3. Найдем свойство Индексировать.

Здесь нам доступно несколько вариантов, проанализируем их подробнее:

Программное управление доступностью полей

Рассмотрим ситуацию, когда нам нужно программно ограничить или, наоборот, принудительно включить доступность полей для пользователя. У объекта ДокументСписок (или аналогичного для справочников) есть коллекции Отбор и Порядок.

Если мы хотим, чтобы поле было доступно для настройки, но не отображалось в интерфейсе по умолчанию, мы можем управлять свойством Доступность. Посмотрим на пример кода, который можно разместить в обработчике ПриОткрытии формы списка:


// Сделаем поле доступным для отбора, даже если оно скрыто в настройках пользователем
ДокументСписок.Отбор.ИмяВашегоПоля.Использование = Ложь; // Отключаем по умолчанию, но оставляем в списке доступных

// Если нужно программно запретить сортировку по какому-то полю
ЭлементыФормы.СправочникСписок.НастройкаПопорядку.ИмяПоля.Доступность = Ложь;

Особенности работы с составными типами данных

Проанализируем сложный случай: если ваше новое поле имеет составной тип данных (например, оно может содержать ссылку и на Справочник.Контрагенты, и на Справочник.ФизическиеЛица). В обычных формах 1С стандартная сортировка по таким полям может работать непредсказуемо или быть недоступна. Это связано с тем, что в реляционной базе данных значения разных типов хранятся в разных физических таблицах. Для адекватной сортировки по таким полям рекомендуется либо ограничить тип одним справочником, либо использовать скрытый реквизит с приведением к строке или числу, по которому и будет идти индексация.

Быстрый отбор на форме

Для удобства пользователей в УПП 1.3 часто применяются панели быстрого отбора. Если вы хотите, чтобы пользователь не открывал каждый раз форму «Отбор и сортировка», добавим поле ввода прямо на форму списка. Посмотрим, как связать его с данными списка:

  1. Добавим на форму ПолеВвода, назовем его, например, ОтборПоПолю.
  2. В событии ПриИзменении этого поля напишем код установки фильтра.

Процедура ОтборПоПолюПриИзменении(Элемент)
    // Устанавливаем отбор по значению из поля ввода
    // Если значение не заполнено, отбор снимается
    Если ЗначениеЗаполнено(ОтборПоПолю) Тогда
        ДокументСписок.Отбор[ИмяРеквизита].Установить(ОтборПоПолю, Истина);
    Иначе
        ДокументСписок.Отбор[ИмяРеквизита].Установить(, Ложь);
    КонецЕсли;
КонецПроцедуры

Влияние на производительность

Важно помнить, что добавление индекса — это не «бесплатная» операция. В таких крупных базах, как УПП, каждый новый индекс увеличивает размер базы данных и немного замедляет процесс записи и проведения документов, так как SQL-серверу требуется обновлять индексные таблицы. Рекомендуется индексировать только те поля, по которым действительно планируется массовый поиск или регулярная сортировка сотен тысяч записей.

Почему поле не появилось (чек-лист)

Если вы проделали все действия, но поле так и не появилось в форме отбора, проверим следующие моменты:

Подводя итог, можно сказать, что механизм отборов в обычных формах 1С крайне жестко привязан к визуальному представлению данных в ТабличномПоле и физическим свойствам реквизита в конфигураторе. Комбинируя визуальное добавление колонок и правильное индексирование, можно добиться гибкой настройки журналов для конечного пользователя. В качестве альтернативы для нестандартной фильтрации в обычном приложении можно использовать решение для гибкого отбора на базе ПостроителяОтчета.

← На главную