Как правильно устанавливать отбор в динамическом списке: использовать БСП или стандартные средства платформы?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8.3 перед разработчиком часто встает дилемма: использовать «чистые» механизмы платформы для работы с динамическими списками или прибегать к помощи функций Библиотеки стандартных подсистем (БСП). Этот вопрос особенно актуален при программной установке фильтров. Рассмотрим подробнее оба подхода, проанализируем их производительность и выясним, какой метод является наиболее предпочтительным в современной разработке.

Механизм работы с отборами через платформу

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

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

  1. Обращение к Список.КомпоновщикНастроек.Настройки.Отбор.
  2. Поиск существующего элемента отбора по имени поля (чтобы не создать дубли).
  3. Создание нового элемента типа ЭлементОтбораКомпоновкиДанных, если он не найден.
  4. Установка левого значения (поле компоновки), вида сравнения и правого значения.
  5. Установка флага Использование.

Посмотрим на пример кода, реализующего этот подход:


ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.СтатусыЗаказов.Согласован;
ЭлементОтбора.Использование = Истина;

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

Использование методов БСП для установки отборов

Теперь разберем, как ту же задачу решает БСП. В составе библиотеки есть общий модуль ОбщегоНазначенияКлиентСервер, содержащий процедуру УстановитьЭлементОтбора. Этот метод является «высокоуровневой оберткой» над объектами СКД.

Выясним причину популярности этого метода. При его вызове БСП выполняет за нас ряд важных проверок:

Рассмотрим пример использования БСП:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
    Список.КомпоновщикНастроек.Настройки.Отбор, 
    "Статус", 
    Перечисления.СтатусыЗаказов.Согласован
);

Как мы видим, код становится значительно лаконичнее и безопаснее.

Вопрос производительности: мифы и реальность

В среде разработчиков часто ведутся споры о том, что вызов универсальных функций БСП замедляет работу системы. Проанализируем ситуацию с технической точки зрения.

Если замерить быстродействие выполнения самого кода на встроенном языке, то прямой метод платформы может оказаться быстрее на ничтожную долю секунды (например, на 0,000001 сек.), так как БСП внутри себя выполняет циклы обхода коллекции элементов отбора для поиска дублей. Однако для конечного пользователя эта разница абсолютно незаметна.

Важно понимать: реальная производительность динамического списка зависит не от скорости установки отбора в коде, а от того, какой SQL-запрос сформирует платформа 1С при обращении к СУБД. План запроса будет идентичным в обоих случаях, если итоговые настройки КомпоновщикаНастроек совпадают. На скорость получения данных влияют индексы в базе данных, а не то, как вы обратились к свойству Отбор.

Архитектурная целесообразность и стандарты

Посмотрим на ситуацию со стороны сопровождения конфигурации. Фирма «1С» рекомендует использовать БСП во всех типовых решениях. И на это есть веские причины:

  1. Унификация: Если в проекте работают несколько программистов, использование единого стандарта БСП делает код читаемым для всех.
  2. Устойчивость к обновлениям: В случае изменения внутренней структуры объектов платформы в новых версиях (например, в 1С v8.5 или выше), разработчики БСП обновят логику в общем модуле, и ваш прикладной код продолжит работать корректно.
  3. Конфликты с пользовательскими настройками: Динамические списки имеют сложную структуру (Настройки и ПользовательскиеНастройки). Простая установка в Настройки может быть перекрыта пользовательским фильтром. Методы БСП зачастую умеют корректно обрабатывать эти нюансы, обеспечивая приоритет программной установки.

Типичные ошибки при отказе от БСП

Разберем, с какими проблемами мы можем столкнуться, если решим писать «свой велосипед» для управления отборами:

Специализированная подсистема «Работа с динамическими списками»

Помимо простых функций в общих модулях, БСП предоставляет полноценную подсистему для профессиональной работы со списками. Она позволяет:

1. Сохранять и восстанавливать состояние колонок и фильтров между сеансами пользователя.
2. Управлять «быстрыми отборами», которые выносятся на форму в виде отдельных полей.
3. Настраивать видимость полей в зависимости от функциональных опций системы.

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

Выводы

Проанализировав все «за» и «против», мы можем сделать следующие выводы:

Во-первых, использование БСП для работы с динамическими списками — это стандарт современной разработки. Это гарантирует чистоту кода и отсутствие ошибок, связанных с дублированием настроек.

Во-вторых, аргумент о потере производительности является несостоятельным. Затраты времени на выполнение универсальных процедур БСП пренебрежимо малы по сравнению с временем выполнения запроса к базе данных.

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

Таким образом, мы рекомендуем всегда отдавать приоритет методам БСП, таким как ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора, за исключением случаев, когда вы работаете в крайне ограниченных условиях без доступа к стандартным библиотекам.

← На главную