В современной разработке интерфейсов, особенно для интернет-магазинов и крупных информационных систем, стандартных отборов часто становится недостаточно. Пользователи привыкли к «умным» фильтрам, которые подсказывают количество товаров и не позволяют выбрать комбинацию параметров, приводящую к пустому списку. В этой статье мы подробно разберем, что такое фасетный поиск, чем он отличается от стандартных механизмов 1С и какими способами его можно реализовать в вашей конфигурации.
Разберем само понятие. Фасетный поиск — это метод навигации по многомерному информационному пространству, который позволяет пользователю постепенно сужать область поиска, выбирая значения в различных измерениях (фасетах).
Проанализируем ключевое отличие от стандартного отбора в динамическом списке 1С. Когда вы используете обычный Отбор, платформа просто накладывает условие ГДЕ на запрос к базе данных. Если вы выберете «Цвет: Красный» и «Материал: Дерево», а таких товаров нет, система выдаст пустой список. Пользователь вынужден гадать, какая именно комбинация фильтров привела к отсутствию результата.
Фасетный поиск работает иначе. Рассмотрим основные признаки «правильных» фасетов:
Если нам необходимо реализовать фасетный поиск исключительно средствами встроенного языка 1С без привлечения сторонних сервисов, мы столкнемся с проблемой производительности. Попытка высчитать количество остатков по каждому свойству через ПВХ (планы видов характеристик) в реальном времени на большом каталоге «положит» сервер SQL из-за огромного количества соединений таблиц.
Выясним причину: стандартное хранение дополнительных реквизитов в 1С вертикальное (одна строка — одно свойство). Для фасетов нам нужна «плоская» структура. Рассмотрим вариант с денормализацией данных.
Ради быстродействия создадим вспомогательный РегистрСведений, где данные будут храниться в максимально подготовленном для поиска виде. Структура регистра может выглядеть так:
Объект (СправочникСсылка.Номенклатура)Свойство1, Свойство2, ..., СвойствоN (индексированные поля)Разберем алгоритм работы при выборе фильтра пользователем:
СГРУППИРОВАТЬ ПО.Пример кода для получения данных фасетов по одному из измерений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СвойстваТоваров.Бренд КАК Значение,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СвойстваТоваров.Объект) КАК Количество
|ИЗ
| РегистрСведений.СвойстваТоваров КАК СвойстваТоваров
|ГДЕ
| СвойстваТоваров.Цвет = &ВыбранныйЦвет
|СГРУППИРОВАТЬ ПО
| СвойстваТоваров.Бренд";
Запрос.УстановитьПараметр("ВыбранныйЦвет", Объект.ВыбранныйЦвет);
Результат = Запрос.Выполнить().Выгрузить();
Такой подход требует поддержки актуальности вспомогательного регистра при записи объектов, но обеспечивает на порядок более высокую скорость чтения.
Для систем с сотнями тысяч или миллионами записей стандартный SQL-подход перестает работать эффективно. В этом случае рассмотрим интеграцию 1С с внешними поисковыми движками, такими как Elasticsearch или Manticore Search (Sphinx).
Проанализируем схему взаимодействия:
Это позволяет реализовать «мини-интеллект», о котором упоминалось в обсуждении: поиск по строке «монитор 24 дюйма самсунг» мгновенно выдаст не только список товаров, но и заполненные фильтры по диагонали и производителю.
Стандартное окно настройки отбора 1С не предназначено для фасетного поиска. Нам потребуется создать кастомный интерфейс. Посмотрим на наиболее удачные способы реализации:
1. Использование Дерева значений или Таблицы значений на форме.
Мы можем отрисовать список доступных фильтров в левой части формы. Для каждого значения добавим колонку «Количество». Чтобы интерфейс был отзывчивым, используем ОбработчикОжидания. Это позволит избежать пересчета фасетов при каждом клике, если пользователь быстро отмечает несколько чекбоксов подряд.
2. Использование HTML-поля.
Для достижения максимального сходства с современными интерфейсами (слайдеры цен, цветовые круги, сложные переключатели) можно использовать поле HTML-документа. В этом случае взаимодействие с 1С происходит через событие ПриНажатии или через механизм СредстваКриптографии.Зашифровать() (в старых версиях) или современные методы обмена данными между JS и 1С.
Рассмотрим логику обновления интерфейса:
Выясним важное различие, которое часто путают. Таксономия — это иерархическая структура (дерево групп справочника). Вы переходите из папки в папку, сужая область. Фасетный поиск — это плоское объединение свойств.
Для эффективной работы рекомендуется комбинировать эти подходы: пользователь может выбрать категорию «Бытовая техника» (таксономия), и только после этого система должна показать фасеты, специфичные для этой категории (например, «Мощность» или «Объем емкости»). В 1С это реализуется через динамическое построение списка доступных фильтров в зависимости от выбранного ВидаНоменклатуры.
Реализация фасетного поиска в 1С — это задача на стыке проектирования БД и UX-дизайна. Подведем итоги:
Правильно реализованный фасетный поиск значительно повышает лояльность пользователей, делая работу с программой интуитивно понятной и быстрой.