При разработке на платформе 1С:Предприятие 8.3 перед разработчиком часто встает дилемма: использовать «чистые» механизмы платформы для работы с динамическими списками или прибегать к помощи функций Библиотеки стандартных подсистем (БСП). Этот вопрос особенно актуален при программной установке фильтров. Рассмотрим подробнее оба подхода, проанализируем их производительность и выясним, какой метод является наиболее предпочтительным в современной разработке.
Для начала разберем, как работает стандартный механизм платформы без использования сторонних библиотек. Программная установка отбора в динамическом списке осуществляется через КомпоновщикНастроек. Нам необходимо обратиться к коллекции Отбор, найти нужный элемент или добавить новый.
Проанализируем типичную последовательность действий при ручном управлении:
Список.КомпоновщикНастроек.Настройки.Отбор.ЭлементОтбораКомпоновкиДанных, если он не найден.Использование.Посмотрим на пример кода, реализующего этот подход:
ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.СтатусыЗаказов.Согласован;
ЭлементОтбора.Использование = Истина;
Основная проблема здесь заключается в том, что если этот код выполнится дважды, в настройках списка появятся два одинаковых отбора, что может привести к непредсказуемому поведению системы и замусориванию интерфейса настроек для пользователя.
Теперь разберем, как ту же задачу решает БСП. В составе библиотеки есть общий модуль ОбщегоНазначенияКлиентСервер, содержащий процедуру УстановитьЭлементОтбора. Этот метод является «высокоуровневой оберткой» над объектами СКД.
Выясним причину популярности этого метода. При его вызове БСП выполняет за нас ряд важных проверок:
Использование = Истина.Если...Тогда.Рассмотрим пример использования БСП:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
Список.КомпоновщикНастроек.Настройки.Отбор,
"Статус",
Перечисления.СтатусыЗаказов.Согласован
);
Как мы видим, код становится значительно лаконичнее и безопаснее.
В среде разработчиков часто ведутся споры о том, что вызов универсальных функций БСП замедляет работу системы. Проанализируем ситуацию с технической точки зрения.
Если замерить быстродействие выполнения самого кода на встроенном языке, то прямой метод платформы может оказаться быстрее на ничтожную долю секунды (например, на 0,000001 сек.), так как БСП внутри себя выполняет циклы обхода коллекции элементов отбора для поиска дублей. Однако для конечного пользователя эта разница абсолютно незаметна.
Важно понимать: реальная производительность динамического списка зависит не от скорости установки отбора в коде, а от того, какой SQL-запрос сформирует платформа 1С при обращении к СУБД. План запроса будет идентичным в обоих случаях, если итоговые настройки КомпоновщикаНастроек совпадают. На скорость получения данных влияют индексы в базе данных, а не то, как вы обратились к свойству Отбор.
Посмотрим на ситуацию со стороны сопровождения конфигурации. Фирма «1С» рекомендует использовать БСП во всех типовых решениях. И на это есть веские причины:
1С v8.5 или выше), разработчики БСП обновят логику в общем модуле, и ваш прикладной код продолжит работать корректно.Настройки и ПользовательскиеНастройки). Простая установка в Настройки может быть перекрыта пользовательским фильтром. Методы БСП зачастую умеют корректно обрабатывать эти нюансы, обеспечивая приоритет программной установки.Разберем, с какими проблемами мы можем столкнуться, если решим писать «свой велосипед» для управления отборами:
КомпоновщикаНастроек.Список.ТекстЗапроса, ручные отборы могут «слетать», если они не были зафиксированы в структуре компоновщика должным образом.Использование = Истина или перепутали тип поля), в ручном коде гораздо сложнее.Помимо простых функций в общих модулях, БСП предоставляет полноценную подсистему для профессиональной работы со списками. Она позволяет:
1. Сохранять и восстанавливать состояние колонок и фильтров между сеансами пользователя.
2. Управлять «быстрыми отборами», которые выносятся на форму в виде отдельных полей.
3. Настраивать видимость полей в зависимости от функциональных опций системы.
Использование таких инструментов — это не «избыточность», как считают некоторые приверженцы старой школы, а переход на более высокий уровень абстракции, который позволяет сосредоточиться на бизнес-логике, а не на манипуляциях с коллекциями данных.
Проанализировав все «за» и «против», мы можем сделать следующие выводы:
Во-первых, использование БСП для работы с динамическими списками — это стандарт современной разработки. Это гарантирует чистоту кода и отсутствие ошибок, связанных с дублированием настроек.
Во-вторых, аргумент о потере производительности является несостоятельным. Затраты времени на выполнение универсальных процедур БСП пренебрежимо малы по сравнению с временем выполнения запроса к базе данных.
В-третьих, если вы стремитесь к максимальной оптимизации, лучше обратите внимание на индексацию полей, по которым строятся отборы, и на сложность текста запроса в динамическом списке. Это даст реальный прирост скорости, в отличие от отказа от удобных функций БСП.
Таким образом, мы рекомендуем всегда отдавать приоритет методам БСП, таким как ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора, за исключением случаев, когда вы работаете в крайне ограниченных условиях без доступа к стандартным библиотекам.