Как реализовать фасетный поиск в 1С: от теории к практическим решениям

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

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

Что такое фасетный поиск и чем он отличается от отборов 1С?

Разберем само понятие. Фасетный поиск — это метод навигации по многомерному информационному пространству, который позволяет пользователю постепенно сужать область поиска, выбирая значения в различных измерениях (фасетах).

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

Фасетный поиск работает иначе. Рассмотрим основные признаки «правильных» фасетов:

  1. Информативность: Рядом с каждым значением фильтра отображается количество элементов, соответствующих этому условию (например, «Красный (15)», «Синий (8)»).
  2. Динамическое перестроение: Как только пользователь выбирает один фильтр, все остальные фасеты мгновенно пересчитываются. Если красных деревянных мониторов не существует, то при выборе «Цвет: Красный» фильтр «Материал: Дерево» либо исчезнет, либо станет неактивным, либо покажет счетчик «(0)».
  3. Взаимозависимость: Фильтры влияют друг на друга в реальном времени, предотвращая получение нулевого результата.

Метод 1: Реализация фасетов внутри 1С через денормализацию

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

Выясним причину: стандартное хранение дополнительных реквизитов в 1С вертикальное (одна строка — одно свойство). Для фасетов нам нужна «плоская» структура. Рассмотрим вариант с денормализацией данных.

Ради быстродействия создадим вспомогательный РегистрСведений, где данные будут храниться в максимально подготовленном для поиска виде. Структура регистра может выглядеть так:

Разберем алгоритм работы при выборе фильтра пользователем:

  1. При выборе значения фильтра мы формируем запрос к этому плоскому регистру.
  2. Для обновления счетчиков в остальных фильтрах мы используем СГРУППИРОВАТЬ ПО.

Пример кода для получения данных фасетов по одному из измерений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   СвойстваТоваров.Бренд КАК Значение,
    |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СвойстваТоваров.Объект) КАК Количество
    |ИЗ
    |   РегистрСведений.СвойстваТоваров КАК СвойстваТоваров
    |ГДЕ
    |   СвойстваТоваров.Цвет = &ВыбранныйЦвет
    |СГРУППИРОВАТЬ ПО
    |   СвойстваТоваров.Бренд";

Запрос.УстановитьПараметр("ВыбранныйЦвет", Объект.ВыбранныйЦвет);
Результат = Запрос.Выполнить().Выгрузить();

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

Метод 2: Использование внешних поисковых движков (Elasticsearch/Sphinx)

Для систем с сотнями тысяч или миллионами записей стандартный SQL-подход перестает работать эффективно. В этом случае рассмотрим интеграцию 1С с внешними поисковыми движками, такими как Elasticsearch или Manticore Search (Sphinx).

Проанализируем схему взаимодействия:

  1. 1С выступает в роли поставщика данных. С помощью регламентного задания данные о товарах и их свойствах выгружаются во внешний индекс (обычно в формате JSON через HTTP API).
  2. Когда пользователь открывает форму поиска, 1С отправляет запрос не в свою базу данных, а к Elasticsearch.
  3. Elasticsearch за один запрос возвращает и список найденных товаров, и так называемые «агрегации» (aggs) — те самые фасеты с готовыми счетчиками количества.

Это позволяет реализовать «мини-интеллект», о котором упоминалось в обсуждении: поиск по строке «монитор 24 дюйма самсунг» мгновенно выдаст не только список товаров, но и заполненные фильтры по диагонали и производителю.

Визуализация фасетного поиска на управляемых формах

Стандартное окно настройки отбора 1С не предназначено для фасетного поиска. Нам потребуется создать кастомный интерфейс. Посмотрим на наиболее удачные способы реализации:

1. Использование Дерева значений или Таблицы значений на форме.
Мы можем отрисовать список доступных фильтров в левой части формы. Для каждого значения добавим колонку «Количество». Чтобы интерфейс был отзывчивым, используем ОбработчикОжидания. Это позволит избежать пересчета фасетов при каждом клике, если пользователь быстро отмечает несколько чекбоксов подряд.

2. Использование HTML-поля.
Для достижения максимального сходства с современными интерфейсами (слайдеры цен, цветовые круги, сложные переключатели) можно использовать поле HTML-документа. В этом случае взаимодействие с 1С происходит через событие ПриНажатии или через механизм СредстваКриптографии.Зашифровать() (в старых версиях) или современные методы обмена данными между JS и 1С.

Рассмотрим логику обновления интерфейса:

  1. Пользователь меняет состояние фильтра.
  2. Система запускает фоновое задание (чтобы не блокировать интерфейс) для расчета новых состояний фасетов.
  3. По завершении фонового задания форма обновляет данные в таблице фильтров и список товаров.

Важные нюансы: Таксономия vs Фасеты

Выясним важное различие, которое часто путают. Таксономия — это иерархическая структура (дерево групп справочника). Вы переходите из папки в папку, сужая область. Фасетный поиск — это плоское объединение свойств.

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

Резюме

Реализация фасетного поиска в 1С — это задача на стыке проектирования БД и UX-дизайна. Подведем итоги:

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

← На главную