Как в 1С сопоставить два набора слов, чтобы понять, что это один и тот же объект?

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

Часто возникает задача сравнить два текстовых описания и определить, относятся ли они к одному и тому же объекту. Например, сопоставить наименование контрагента из входящего документа с записью в справочнике (ООО "Ромашка" и Ромашка (общество с ограниченной ответственностью)) или, что сложнее, найти проданный товар из внешней системы в своей учетной базе по одному лишь текстовому описанию. Рассмотрим эту задачу на более сложном примере из практики: сопоставление наименований автозапчастей.

Допустим, во внешней системе (назовем ее "Bazon") товар продан под названием «Крыло Mazda Demio DE3AS 2007 перед. лев. (б/у)», а в нашей базе 1С он числится как «крыло на MAZDA / DEMIO / DE3AS; DE3FS; DE5FS; DEJFS / / Лево / Перед /». Уникальных артикулов или кодов нет. Как автоматизировать процесс сопоставления, чтобы корректно списать себестоимость товара?

Эта задача известна как сопоставление данных (data matching), связывание записей (record linkage) или, в более простом варианте, нечеткий поиск (fuzzy search). Разберем по шагам, какие подходы можно использовать для ее решения в 1С, двигаясь от простого к сложному.

Решение 1: Нормализация и простое сравнение

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

  1. Приведение к единому регистру. Самое простое — перевести обе строки в нижний или верхний регистр, чтобы "Крыло" и "крыло" стали идентичными.
  2. Удаление спецсимволов. Убираем все знаки препинания, кавычки, скобки, символы вроде `/`, `*`, `.` и т.д. Они часто вносят "шум" и мешают сравнению.
  3. Замена синонимов и аббревиатур. Создаем словарь замен для стандартизации терминов. Это особенно актуально для названий компаний и характеристик товаров.
    • Общество с ограниченной ответственностью -> ООО
    • Индивидуальный предприниматель -> ИП
    • лев., левое, левая -> лево
    • перед., переднее -> перед
    • б/у, подержанный -> бу
  4. Лемматизация. Это более продвинутый шаг, который приводит слова к их начальной форме (лемме). Например, "колеса", "колесу" превратятся в "колесо". Для этого обычно требуются внешние компоненты или сервисы.
  5. Удаление стоп-слов. Из текста удаляются слова, не несущие смысловой нагрузки: предлоги, союзы, междометия («на», «для», «с», «и», «в»).

После такой обработки наши исходные строки могут превратиться во что-то вроде:

Исходник 1: крыло mazda demio de3as 2007 перед лев бу

Исходник 2: крыло на mazda demio de3as de3fs de5fs dejfs лево перед

Уже гораздо лучше, но они все еще не идентичны. Этот метод хорошо работает для простых случаев, как с названиями компаний, но для сложных описаний его недостаточно.

Решение 2: Алгоритмы нечеткого поиска

Когда после нормализации строки все равно не совпадают, на помощь приходят алгоритмы нечеткого сравнения. Они вычисляют «расстояние» или «степень схожести» между строками, выраженное в виде числа или коэффициента. Чем ближе строки, тем выше коэффициент схожести.

  1. Метод триграмм. Строка разбивается на последовательности из трех символов (триграммы). Например, слово "mazda" превращается в "maz", "azd", "zda". Затем алгоритм сравнивает количество общих триграмм у двух строк. Чем больше совпадений, тем больше похожи строки. Этот метод устойчив к небольшим опечаткам и перестановке слов.
  2. Расстояние Левенштейна. Один из самых известных алгоритмов. Он вычисляет минимальное количество операций (вставка, удаление, замена символа), которые нужно совершить, чтобы превратить одну строку в другую. Например, расстояние Левенштейна между "дом" и "дым" равно 1 (одна замена). Чем меньше расстояние, тем ближе строки.

Эти подходы уже гораздо мощнее, но у них есть фундаментальное ограничение: они не понимают смысл текста. Для них "король" и "королева" — это очень похожие слова, а "б/у" и "подержанный" — совершенно разные.

Решение 3: Семантический анализ и векторные представления (Embeddings)

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

Главное преимущество этого метода в том, что слова и фразы с похожим смыслом будут иметь близкие векторы в многомерном пространстве. Модель, обученная на огромном количестве текстов, "знает", что "б/у", "с пробегом" и "подержанный" — это синонимы, и их векторы будут находиться рядом.

Как это работает на практике:

  1. Каждое текстовое описание (и из Bazon, и из 1С) пропускается через предобученную модель, которая на выходе дает вектор (например, набор из 512 чисел).
  2. Далее вычисляется косинусное расстояние между вектором искомого товара и векторами всех потенциальных кандидатов в базе 1С.
  3. Товар, вектор которого оказался "ближе" всех (косинусное расстояние минимально), и является наиболее вероятным совпадением.

Этот метод позволяет находить семантически, а не только текстуально, похожие описания. Для его реализации в 1С потребуются либо интеграция с внешними сервисами, либо использование специализированных компонент, которые "умеют" работать с нейросетевыми моделями.

Решение 4: Комплексный (гибридный) подход и роль оператора

На практике чисто программное решение без участия человека часто бывает либо слишком дорогим в разработке, либо недостаточно точным. Особенно в такой сложной сфере, как автозапчасти, где одно лишнее слово или буква (например, "рестайл") может означать совершенно другую деталь.

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

Рассмотрим по шагам, как может выглядеть такой процесс:

  1. Токенизация. Разбиваем нормализованные строки на отдельные слова (токены).

    крыло | mazda | demio | de3as | 2007 | перед | лев | бу

    крыло | mazda | demio | de3as | de3fs | de5fs | dejfs | лево | перед

  2. Фильтрация. Если есть возможность, сужаем круг поиска по другим параметрам: дата продажи, цена, количество. Это значительно ускорит процесс.
  3. Расчет корреляции. Для оставшихся кандидатов считаем коэффициент схожести. Можно использовать простой подсчет общих токенов или применить более сложные алгоритмы, описанные выше.
  4. Принятие решения системой. Устанавливаем пороговое значение. Если у одного из кандидатов коэффициент схожести значительно выше, чем у других, и превышает порог (например, 0.9), система автоматически сопоставляет товары.
  5. Участие оператора. Это ключевой этап. Если система находит несколько товаров с очень близкими коэффициентами (например, 0.85, 0.84, 0.82) или самый высокий коэффициент ниже порогового значения, она не принимает решение сама. Вместо этого она предлагает оператору на выбор 2-3 наиболее вероятных варианта. Человек, обладая предметными знаниями, делает окончательный выбор.

Важный момент: система может обучаться на выборе оператора. Если пользователь постоянно сопоставляет определенные пары, система может запомнить этот выбор и в следующий раз выполнить сопоставление автоматически. Это элемент самообучения, который со временем снижает нагрузку на персонал.

В итоге, не существует "серебряной пули". Эффективное решение — это всегда комбинация методов: качественная подготовка данных, применение подходящих алгоритмов для расчета схожести и, что самое главное, — продуманная система взаимодействия с пользователем для разрешения неоднозначных ситуаций.

← На главную