Как исправить некорректное сопоставление номенклатуры Wildberries в 1С:Бухгалтерия 3.0?

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

При загрузке отчета о продажах или при загрузке заказов из WildBerries в программу "1С:Бухгалтерия 3.0" многие пользователи сталкиваются с неприятной проблемой: система неправильно сопоставляет номенклатуру из отчета с позициями в справочнике 1С — решить её поможет загрузка отчетов о продажах Wildberries в 1С:Бухгалтерию с гибким сопоставлением. Это происходит даже в том случае, если предварительно был заполнен специализированный регистр сведений Номенклатура маркетплейсов, который, казалось бы, и предназначен для однозначного хранения таких связей.

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

Анализ проблемы: почему штатный механизм ошибается?

Основная причина некорректной работы заключается в алгоритме поиска, который использует 1С. Вместо того чтобы строго искать соответствие по идентификатору товара в регистре Номенклатура маркетплейсов, система применяет так называемый "мнемонический" или "нечеткий" поиск — для точной настройки сопоставления есть загрузка документов маркетплейсов в 1С:БП с нечетким поиском. Подобные сложности с автоматизацией не редкость и при работе с другими площадками, например, когда выполняется загрузка заказов из OZON или Яндекс Маркета, где точность сопоставления критически важна для складского учета.

Что это означает на практике:

  1. Поиск по нескольким полям. Алгоритм пытается найти совпадения не только по коду, но и по наименованию, артикулу и другим реквизитам номенклатуры.
  2. Регулируемая точность. В форме сопоставления часто присутствует ползунок "Точность поиска", который как раз и управляет строгостью этого нечеткого поиска. Однако даже при максимальной точности результат не всегда предсказуем.
  3. Неверный приоритет. Часто нечеткий поиск по наименованию имеет более высокий приоритет, чем прямое соответствие из регистра. Если в базе есть две номенклатуры с похожими названиями, например "Платье синее M" и "Платье синее L", система может легко их перепутать, проигнорировав верную запись в регистре.

Еще один важный момент: если система один раз сопоставила номенклатуру неверно, она "запоминает" этот выбор. Простое удаление загруженного документа и повторная загрузка не помогут — 1С снова подставит неверное значение. Чтобы сбросить такое "запоминание", нужно вручную очищать записи в служебных регистрах, например, в регистре сведений Соответствие номенклатуры сервиса 1С:Номенклатуре.

Ошибки сопоставления могут возникать не только в отчетах о продажах, но и в других операциях — например, при оформлении выкупов пригодится загрузка уведомлений о выкупе Wildberries с сопоставлением товаров. К примеру, когда требуется загрузка Акта возврата бракованного товара от WildBerries, некорректная привязка позиций может привести к пересортице на складе брака. Поскольку штатный механизм ведет себя непредсказуемо, самым надежным решением является его отключение и замена собственным, строгим алгоритмом поиска.

Решение 1. Прямой поиск по артикулу Wildberries в расширении

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

Шаг 1. Добавляем реквизит в справочник.

Через расширение добавим в справочник Номенклатура новый реквизит, например, STR_АртикулWB (тип "Строка"). В этот реквизит для каждой позиции нужно будет один раз внести соответствующий "Код номенклатуры" из отчета Wildberries.

Шаг 2. Создаем расширение для формы сопоставления.

Нам нужно вмешаться в работу формы СопоставлениеНоменклатурыБЭД. Создадим расширение для этой формы и добавим в него серверную процедуру, которая будет выполнять наш собственный поиск.

Шаг 3. Пишем код для сопоставления.

В модуле расширенной формы создадим процедуру, которая будет перебирать строки в таблице сопоставления и подставлять номенклатуру, найденную по нашему новому реквизиту. Вызывать эту процедуру будем при открытии формы.


&НаСервере
Процедура ОсуществитьПоискНоменклатур()
	// Перебираем все строки в табличной части "Сопоставление" на форме
	Для Каждого Стр ИЗ Объект.Сопоставление Цикл
		// Предварительно очищаем результат штатного поиска, если он был.
		Стр.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();  
		
		// Выполняем строгий поиск по нашему новому реквизиту.
		// В Стр.КодМагазина при загрузке отчета WB попадает "Код номенклатуры".
		Стр.Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("STR_АртикулWB", Стр.КодМагазина);  
	КонецЦикла;	
КонецПроцедуры	

&НаКлиенте
Процедура STR_ПриОткрытииПосле(Отказ)
	// Вызываем наш поиск сразу после того, как форма открылась
	ОсуществитьПоискНоменклатур();
КонецПроцедуры

Как это работает: Процедура ОсуществитьПоискНоменклатур проходит по каждой строке документа, где требуется сопоставить номенклатуру. Она берет значение из колонки КодМагазина и ищет в справочнике Номенклатура элемент, у которого в реквизите STR_АртикулWB записано точно такое же значение. Этот метод НайтиПоРеквизиту гарантирует однозначный и точный поиск.

Решение 2. Строгий поиск по регистру "Номенклатура маркетплейсов"

Этот способ более "правильный" с точки зрения архитектуры 1С, поскольку использует штатный объект — регистр сведений Номенклатура маркетплейсов. Мы так же будем использовать расширение, но логика поиска будет обращаться к записям регистра. Аналогичный подход используется в качественных решениях для других площадок, таких как загрузка заказов из СберМегамаркет или обработка данных о продажах из Avito.

Шаг 1. Заполняем регистр сведений.

Убедитесь, что регистр Номенклатура маркетплейсов корректно заполнен. Для каждой номенклатуры должна быть запись, содержащая Маркетплейс (Wildberries), ссылку на Номенклатуру и Идентификатор товара.

Шаг 2. Модифицируем код в расширении.

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


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

КонецФункции

&НаСервере
Процедура ОсуществитьПоискНоменклатур()
	Для Каждого Стр ИЗ Объект.Сопоставление Цикл
		Стр.Номенклатура = НайтиНоменклатуруПоКодуWB(Стр.КодМагазина);
	КонецЦикла;	
КонецПроцедуры

Улучшение интерфейса: добавляем кнопку для повторного сопоставления

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


&НаКлиенте
Процедура СопоставитьНоменклатуру(Команда)
    ОсуществитьПоискНоменклатур();
КонецПроцедуры

&НаСервере
Процедура STR_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	НоваяКоманда = ЭтаФорма.Команды.Добавить("СопоставитьНоменклатуру");
	НоваяКоманда.Заголовок = "(STR) Сопоставить номенклатуру";
	НоваяКоманда.Действие = "СопоставитьНоменклатуру"; 
	
	НоваяКнопка = ЭтаФорма.Элементы.Вставить(
        "КнопкаСопоставитьНоменклатуру", 
        Тип("КнопкаФормы"), 
        ЭтаФорма.Элементы.КоманднаяПанель 
    );
	НоваяКнопка.ИмяКоманды = "СопоставитьНоменклатуру";
	НоваяКнопка.Отображение = ОтображениеКнопки.Текст;
КонецПроцедуры

В итоге, отказавшись от непредсказуемого штатного механизма в пользу строгого алгоритма в расширении, вы сможете полностью автоматизировать процесс загрузки отчетов, избежав ошибок в учете и пересортицы товаров.

← На главную