Работа в таких конфигурациях, как Управление производственным предприятием (УПП) 1.3, часто требует расширения типового функционала. Одной из популярных задач является добавление новых реквизитов в документы и обеспечение возможности фильтрации и упорядочивания по этим полям непосредственно в списках документов. В обычных формах 1С механизмы отбора и сортировки работают иначе, чем в управляемых, и требуют понимания связи между метаданными объекта и элементами формы.
Рассмотрим подробно, каким образом можно добавить новое поле в стандартную системную форму «Отбор и сортировка», чтобы пользователь мог самостоятельно настраивать списки документов «Поступление товаров и услуг» или любых других объектов.
Прежде всего, разберем принцип работы платформы. Диалоговое окно «Отбор и сортировка» в обычных формах — это стандартный интерфейс, который платформа 1С генерирует автоматически. Список доступных полей в этом окне не рисуется вручную программистом в отдельной форме, он напрямую зависит от состава колонок табличного поля, которое отображает список документов на форме (обычно это объект типа ДокументСписок).
Проанализируем шаги, необходимые для того, чтобы реквизит стал доступен для фильтрации.
Первым делом нам необходимо убедиться, что реквизит присутствует в экранной форме списка. Для этого выполним следующие действия:
ФормаСписка документа ПоступлениеТоваровУслуг).ДокументСписок.Важный нюанс: Если по условиям задачи пользователю не нужно видеть эту колонку визуально в журнале, мы можем скрыть её, установив свойство Видимость в значение Ложь. Однако для того, чтобы платформа «подцепила» это поле в механизм отбора, оно обязательно должно присутствовать в составе колонок табличного поля.
Часто программисты сталкиваются с тем, что после добавления колонки поле появляется в списке отборов, но отсутствует на закладке «Сортировка». Разберемся, почему так происходит. Платформа 1С может выполнять быструю сортировку в динамических списках только по тем полям, которые проиндексированы на уровне базы данных (SQL).
Выясним, как включить индексирование:
Здесь нам доступно несколько вариантов, проанализируем их подробнее:
Рассмотрим ситуацию, когда нам нужно программно ограничить или, наоборот, принудительно включить доступность полей для пользователя. У объекта ДокументСписок (или аналогичного для справочников) есть коллекции Отбор и Порядок.
Если мы хотим, чтобы поле было доступно для настройки, но не отображалось в интерфейсе по умолчанию, мы можем управлять свойством Доступность. Посмотрим на пример кода, который можно разместить в обработчике ПриОткрытии формы списка:
// Сделаем поле доступным для отбора, даже если оно скрыто в настройках пользователем
ДокументСписок.Отбор.ИмяВашегоПоля.Использование = Ложь; // Отключаем по умолчанию, но оставляем в списке доступных
// Если нужно программно запретить сортировку по какому-то полю
ЭлементыФормы.СправочникСписок.НастройкаПопорядку.ИмяПоля.Доступность = Ложь;
Проанализируем сложный случай: если ваше новое поле имеет составной тип данных (например, оно может содержать ссылку и на Справочник.Контрагенты, и на Справочник.ФизическиеЛица). В обычных формах 1С стандартная сортировка по таким полям может работать непредсказуемо или быть недоступна. Это связано с тем, что в реляционной базе данных значения разных типов хранятся в разных физических таблицах. Для адекватной сортировки по таким полям рекомендуется либо ограничить тип одним справочником, либо использовать скрытый реквизит с приведением к строке или числу, по которому и будет идти индексация.
Для удобства пользователей в УПП 1.3 часто применяются панели быстрого отбора. Если вы хотите, чтобы пользователь не открывал каждый раз форму «Отбор и сортировка», добавим поле ввода прямо на форму списка. Посмотрим, как связать его с данными списка:
ПолеВвода, назовем его, например, ОтборПоПолю.ПриИзменении этого поля напишем код установки фильтра.
Процедура ОтборПоПолюПриИзменении(Элемент)
// Устанавливаем отбор по значению из поля ввода
// Если значение не заполнено, отбор снимается
Если ЗначениеЗаполнено(ОтборПоПолю) Тогда
ДокументСписок.Отбор[ИмяРеквизита].Установить(ОтборПоПолю, Истина);
Иначе
ДокументСписок.Отбор[ИмяРеквизита].Установить(, Ложь);
КонецЕсли;
КонецПроцедуры
Важно помнить, что добавление индекса — это не «бесплатная» операция. В таких крупных базах, как УПП, каждый новый индекс увеличивает размер базы данных и немного замедляет процесс записи и проведения документов, так как SQL-серверу требуется обновлять индексные таблицы. Рекомендуется индексировать только те поля, по которым действительно планируется массовый поиск или регулярная сортировка сотен тысяч записей.
Если вы проделали все действия, но поле так и не появилось в форме отбора, проверим следующие моменты:
Данные выбран именно реквизит, а не просто текст или вычисляемое значение.Подводя итог, можно сказать, что механизм отборов в обычных формах 1С крайне жестко привязан к визуальному представлению данных в ТабличномПоле и физическим свойствам реквизита в конфигураторе. Комбинируя визуальное добавление колонок и правильное индексирование, можно добиться гибкой настройки журналов для конечного пользователя. В качестве альтернативы для нестандартной фильтрации в обычном приложении можно использовать решение для гибкого отбора на базе ПостроителяОтчета.