При работе с внешними поставщиками данных мы часто сталкиваемся с ситуацией, когда технические характеристики товара приходят не в структурированном виде (по колонкам), а одной длинной строкой. Например: «Экран: 6.1"/2400x1080 Пикс; Оперативная память (RAM): 8 ГБ; Основная камера МПикс: 12/50/10/TOF». Перед разработчиком встает задача: не просто «разрезать» эту строку, но и правильно сопоставить названия характеристик поставщика с нашими внутренними дополнительными реквизитами, а также привести значения к единому формату. Рассмотрим подробно, как реализовать этот механизм в 1С.
Проанализируем входящую строку. Мы видим, что она имеет четкую структуру: [Название характеристики] [Разделитель названия] [Значение] [Разделитель пар]. В данном случае разделителем пар является точка с запятой (;), а разделителем названия и значения — двоеточие (:). Однако названия характеристик у поставщика почти никогда не совпадают с нашими. Для решения этой задачи нам потребуется комплексный подход, включающий парсинг, использование таблиц соответствий и механизмы нормализации.
Первым делом нам необходимо превратить текстовую строку в структуру или таблицу значений. Для этого воспользуемся встроенными функциями работы со строками. Разберем пример кода, который разбивает строку по разделителям:
// Функция разбирает строку и возвращает соответствие
Функция РазобратьХарактеристики(Знач ИсходнаяСтрока) Экран
Результат = Новый Соответствие;
// Сначала разбиваем по точке с запятой на отдельные пары
МассивПар = СтрРазделить(ИсходнаяСтрока, ";", Ложь);
Для Каждого Пара Из МассивПар Цикл
ТекПара = СокрЛП(Пара);
ПозицияДвоеточия = Найти(ТекПара, ":");
Если ПозицияДвоеточия > 0 Тогда
КлючПоставщика = СокрЛП(Лев(ТекПара, ПозицияДвоеточия - 1));
ЗначениеПоставщика = СокрЛП(Сред(ТекПара, ПозицияДвоеточия + 1));
Результат.Вставить(КлючПоставщика, ЗначениеПоставщика);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Важно помнить, что в реальных данных разделители могут варьироваться. Поэтому в настройках обработки загрузки рекомендуется выносить символы разделителей в отдельные реквизиты формы, чтобы пользователь мог оперативно их изменить под конкретный файл поставщика.
После того как мы получили «КлючПоставщика» (например, «Основная камера МПикс»), его нужно связать с нашим дополнительным реквизитом (например, «Основная камера (Разрешение)»). Для хранения этих связей создадим Регистр сведений «СоответствиеРеквизитовПоставщиков» со следующей структурой:
Проанализируем, как будет выглядеть поиск соответствия в коде:
Функция НайтиНашРеквизит(Поставщик, КлючПоставщика)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СоответствиеРеквизитов.ДополнительныйРеквизит
|ИЗ
| РегистрСведений.СоответствиеРеквизитовПоставщиков КАК СоответствиеРеквизитов
|ГДЕ
| СоответствиеРеквизитов.Поставщик = &Поставщик
| И СоответствиеРеквизитов.НаименованиеПоставщика = &Наименование";
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Запрос.УстановитьПараметр("Наименование", КлючПоставщика);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.ДополнительныйРеквизит;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Это самый сложный этап. Поставщик может прислать «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;
КонецФункции
Выясним причину, почему нельзя автоматизировать процесс на 100%. Поставщики постоянно меняют формат данных. Поэтому в обработке загрузки обязательно нужно предусмотреть форму сопоставления. Если код не нашел КлючПоставщика в регистре сведений, программа должна вывести таблицу, где пользователь сам выберет нужный доп. реквизит из списка. После выбора система должна автоматически запомнить эту связь в регистре, чтобы в следующий раз обработать такую строку без участия человека.
Если формат строки крайне непредсказуем, проанализируем возможность применения ИИ. Сегодня через API можно отправить строку в нейросеть с запросом: «Выдели из текста характеристики и верни их в формате JSON: название — значение». В 1С останется только разобрать полученный JSON через ЧтениеJSON. Это значительно повышает универсальность решения для сотен разных форматов поставщиков.
Резюмируем: Для надежного заполнения дополнительных реквизитов необходимо реализовать цепочку: Парсинг строки -> Поиск связи в регистре -> Нормализация значения (число/ссылка) -> Ручное дозаполнение неизвестных полей. Такой подход обеспечит чистоту данных в вашей базе 1С и минимизирует ручной труд при регулярных поставках.