Как автоматически разобрать и сопоставить характеристики номенклатуры из строки поставщика

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

При работе с внешними поставщиками данных мы часто сталкиваемся с ситуацией, когда технические характеристики товара приходят не в структурированном виде (по колонкам), а одной длинной строкой. Например: «Экран: 6.1"/2400x1080 Пикс; Оперативная память (RAM): 8 ГБ; Основная камера МПикс: 12/50/10/TOF». Перед разработчиком встает задача: не просто «разрезать» эту строку, но и правильно сопоставить названия характеристик поставщика с нашими внутренними дополнительными реквизитами, а также привести значения к единому формату. Рассмотрим подробно, как реализовать этот механизм в 1С.

Анализ структуры данных и выбор стратегии

Проанализируем входящую строку. Мы видим, что она имеет четкую структуру: [Название характеристики] [Разделитель названия] [Значение] [Разделитель пар]. В данном случае разделителем пар является точка с запятой (;), а разделителем названия и значения — двоеточие (:). Однако названия характеристик у поставщика почти никогда не совпадают с нашими. Для решения этой задачи нам потребуется комплексный подход, включающий парсинг, использование таблиц соответствий и механизмы нормализации.

Шаг 1. Разбор строки на пары «Ключ — Значение»

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


// Функция разбирает строку и возвращает соответствие
Функция РазобратьХарактеристики(Знач ИсходнаяСтрока) Экран
    Результат = Новый Соответствие;
    // Сначала разбиваем по точке с запятой на отдельные пары
    МассивПар = СтрРазделить(ИсходнаяСтрока, ";", Ложь);
    
    Для Каждого Пара Из МассивПар Цикл
        ТекПара = СокрЛП(Пара);
        ПозицияДвоеточия = Найти(ТекПара, ":");
        
        Если ПозицияДвоеточия > 0 Тогда
            КлючПоставщика = СокрЛП(Лев(ТекПара, ПозицияДвоеточия - 1));
            ЗначениеПоставщика = СокрЛП(Сред(ТекПара, ПозицияДвоеточия + 1));
            Результат.Вставить(КлючПоставщика, ЗначениеПоставщика);
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

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

Шаг 2. Сопоставление названий (Маппинг)

После того как мы получили «КлючПоставщика» (например, «Основная камера МПикс»), его нужно связать с нашим дополнительным реквизитом (например, «Основная камера (Разрешение)»). Для хранения этих связей создадим Регистр сведений «СоответствиеРеквизитовПоставщиков» со следующей структурой:

  1. Поставщик (СправочникСсылка.Контрагенты) — так как у разных поставщиков названия могут отличаться.
  2. НаименованиеПоставщика (Строка) — сырое название из файла.
  3. ДополнительныйРеквизит (ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения) — ссылка на наш объект в базе.

Проанализируем, как будет выглядеть поиск соответствия в коде:


Функция НайтиНашРеквизит(Поставщик, КлючПоставщика)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	СоответствиеРеквизитов.ДополнительныйРеквизит
    |ИЗ
    |	РегистрСведений.СоответствиеРеквизитовПоставщиков КАК СоответствиеРеквизитов
    |ГДЕ
    |	СоответствиеРеквизитов.Поставщик = &Поставщик
    |	И СоответствиеРеквизитов.НаименованиеПоставщика = &Наименование";
    
    Запрос.УстановитьПараметр("Поставщик", Поставщик);
    Запрос.УстановитьПараметр("Наименование", КлючПоставщика);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.ДополнительныйРеквизит;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Шаг 3. Обработка значений и нормализация

Это самый сложный этап. Поставщик может прислать «8 ГБ», а у нас в системе это числовое поле, где данные хранятся в Мегабайтах. Или у нас это значение типа СправочникСсылка.ЗначенияСвойствОбъектов, где записано «8 Gb».

Рассмотрим способы нормализации:

Пример использования регулярного выражения для извлечения числа оперативной памяти:


Функция ИзвлечьЧислоПамяти(СтрокаЗначение)
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Pattern = "[0-9]+"; // Ищем только цифры
    RegExp.Global = Истина;
    
    Matches = RegExp.Execute(СтрокаЗначение);
    Если Matches.Count > 0 Тогда
        Значение = Число(Matches.Item(0).Value);
        Если Найти(ВРег(СтрокаЗначение), "ГБ") > 0 Или Найти(ВРег(СтрокаЗначение), "GB") > 0 Тогда
            Возврат Значение * 1024; // Переводим в МБ
        КонецЕсли;
        Возврат Значение;
    КонецЕсли;
    
    Возврат 0;
КонецФункции

Шаг 4. Интерфейс для пользователя

Выясним причину, почему нельзя автоматизировать процесс на 100%. Поставщики постоянно меняют формат данных. Поэтому в обработке загрузки обязательно нужно предусмотреть форму сопоставления. Если код не нашел КлючПоставщика в регистре сведений, программа должна вывести таблицу, где пользователь сам выберет нужный доп. реквизит из списка. После выбора система должна автоматически запомнить эту связь в регистре, чтобы в следующий раз обработать такую строку без участия человека.

Использование современных технологий (AI)

Если формат строки крайне непредсказуем, проанализируем возможность применения ИИ. Сегодня через API можно отправить строку в нейросеть с запросом: «Выдели из текста характеристики и верни их в формате JSON: название — значение». В 1С останется только разобрать полученный JSON через ЧтениеJSON. Это значительно повышает универсальность решения для сотен разных форматов поставщиков.

Резюмируем: Для надежного заполнения дополнительных реквизитов необходимо реализовать цепочку: Парсинг строки -> Поиск связи в регистре -> Нормализация значения (число/ссылка) -> Ручное дозаполнение неизвестных полей. Такой подход обеспечит чистоту данных в вашей базе 1С и минимизирует ручной труд при регулярных поставках.

← На главную