Поиск дублей номенклатуры в 1С: как перестать заводить одинаковые товары
Оператор вбивает «Болт М16 оцинк.», система молчит, он сохраняет — и в базе появляется дубль: «Болт М16х60 оцинкованный ГОСТ 7798-70» уже существовал три года. Остатки разъезжаются, цены путаются, бухгалтерия нервничает. Знакомая боль?
Так работает штатный поиск 1С: он ищет точное вхождение подстроки. Другая форма слова, сокращение, опечатка, латинская «M» вместо кириллической «М» — и товара «нет». sku-search решает эту задачу: строит поисковый индекс и находит похожие товары даже с ошибками и сокращениями.
Что такое sku-search
Это внешний сервис полнотекстового поиска, который работает рядом с 1С: принимает JSON, отдает JSON. Вы загружаете товары, марки, документы — любые записи с любым набором полей. Сервис строит индекс и за миллисекунды находит нужное по:
- наименованию — с опечатками и разными формами слов;
- артикулу, штрихкоду, коду, GUID;
- бренду, поставщику, ТН ВЭД, цвету, размеру, ГОСТу, материалу;
- любым другим реквизитам, которые вы решите передать.
Один бинарник. Без Java, Python, Docker и GPU. Работает на слабом железе и не требует правки конфигурации 1С.
Что умеет поиск
- Опечатки и словоформы. «блот м16 цынк», «болты», «болтом» — находит «Болт М16 оцинкованный».
- Синонимы. «цинк» = «оцинкованный» — добавляются через API или CLI, перезапуск не нужен.
- Неправильная раскладка и транслит. «ljvbr d lthtdyt» и «domik v derevne» находят «Домик в деревне».
- Артикул внутри наименования. Запрос «ART-000002 болт м16» находит точное совпадение по артикулу мгновенно.
- Любые реквизиты. Ищите по бренду, размеру, ГОСТу — с названием или без него.
- Поиск с учетом регистра. Критично для акцизных марок, Честного ЗНАКа и серийных номеров, где
AL123456789иal123456789— разные значения. - Пакетный поиск. 200 позиций накладной — один запрос, а не 200 вызовов из 1С.
Сервис прозрачный: в ответе видно score (степень совпадения) и
matched_by (по чему именно нашлось). Если результат неверный, оператор
нажимает «не то» — сервис записывает reject в лог обратной связи,
на основе которого добавляются синонимы.
Чем отличается от штатного поиска 1С
| Возможность | Встроенный поиск 1С | sku-search |
|---|---|---|
| Опечатки | не ловит | ловит |
| Падежи и формы слов | не ловит | ловит |
| Синонимы | нужно писать самому | встроено |
| Регистрозависимость | невозможно в запросах | настраивается |
| Поиск по 10+ реквизитам | сложно и медленно | из коробки |
| Пакетный поиск | цикл в 1С | один HTTP-запрос |
| Нагрузка на 1С | средняя | минимальная |
| Зависимости | нет | один бинарник |
В отличие от Elasticsearch, sku-search не требует Java, отдельного сервера и администрирования: скопировали бинарник — запустили.
Как это работает под капотом
Внутри — поисковый движок Tantivy (аналог Lucene на Rust). Вместо перебора всех товаров циклом строится инвертированный индекс: по слову сразу список товаров, в которых оно есть. Отсюда миллисекунды.
Ключевые механизмы: стемминг (приведение слов к основе), fuzzy-расстояние (расстояние Левенштейна — «блот» = «болт»), edge n-граммы (поиск по началу слова), синонимы, веса полей и хранение индекса на диске — данные не теряются при перезапуске.
Скорость на реальных данных
Полный HTTP-цикл включая сериализацию JSON, 50 000 позиций:
| Тип поиска | Среднее | p95 |
|---|---|---|
| Точный по ID / штрихкоду | ~0,76 мс | 0,88 мс |
| Точный по реквизиту (brand) | ~0,99 мс | 1,19 мс |
| Название + реквизит | ~2,8 мс | 4,16 мс |
| Fuzzy по названию (2 слова) | ~15,9 мс | 45,7 мс |
| Fuzzy с опечаткой | ~18,5 мс | 46,8 мс |
Индекс на 50 000 товаров занимает около 5 МБ. Под нагрузкой сервис выдает 242 запроса/с в конфигурации по умолчанию и до 664 запросов/с после тюнинга (отключение дорогих настроек поиска и свернутое логирование).
Как подключить
Вызов — обычный HTTP-запрос. Минимальный код в 1С:
&НаСервере
Функция НайтиПохожиеТовары(Название)
Соединение = Новый HTTPСоединение("localhost", 8080);
Запрос = Новый HTTPЗапрос("/find");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(
"{ ""items"": [ { ""name"": """ + Название + """ } ] }");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции
Ответ — JSON с найденными товарами, score и matched_by.
Если не хочется писать интеграцию с нуля — в архиве идет готовое расширение
СКУПоиск.cfe для УТ 11, ERP, БП и КА (тестировалось на платформе 8.3.27).
Типичные сценарии
- Создание номенклатуры. Оператор вводит «болт м16 цинк» — сервис находит существующий товар, дубль не создается.
- Загрузка прайса поставщика. Сверка по артикулу:
matched_by: exact_artвместо ручного перебора. - Подбор по штрихкоду. Сканер считал код — товар найден без fuzzy и ложных совпадений.
- Поиск по характеристикам. «Телевизор Samsung, 55 дюймов» — name + brand + diagonal одним запросом.
- Пакетная сверка накладной. 200 позиций одним POST
/find. - Марки Честного ЗНАКа. Поиск с учетом регистра там, где 1С дала бы лишние результаты.
Быстрый старт
- Скачайте архив Free-версии и распакуйте.
- Запустите
setup.sh(Linux) илиsetup.cmd(Windows). - Запустите
sku-serviceи откройтеhttp://localhost:8080. - Импортируйте демо-данные:
sku-cli import --csv data/demo-data.csv. - Введите в поиск «болт м16» или «молоко».
Развертывание — одним бинарником, в Docker или службой systemd. Данные работают полностью локально, интернет не нужен.