При загрузке отчета о продажах или при загрузке заказов из WildBerries в программу "1С:Бухгалтерия 3.0" многие пользователи сталкиваются с неприятной проблемой: система неправильно сопоставляет номенклатуру из отчета с позициями в справочнике 1С — решить её поможет загрузка отчетов о продажах Wildberries в 1С:Бухгалтерию с гибким сопоставлением. Это происходит даже в том случае, если предварительно был заполнен специализированный регистр сведений Номенклатура маркетплейсов, который, казалось бы, и предназначен для однозначного хранения таких связей.
В этой статье мы подробно разберем, почему штатный механизм 1С работает не так, как ожидается, и рассмотрим несколько практических способов решения этой проблемы с помощью доработки конфигурации через расширение. Для автоматизации этого процесса есть готовая загрузка отчетов Wildberries в 1С с сопоставлением по артикулу.
Основная причина некорректной работы заключается в алгоритме поиска, который использует 1С. Вместо того чтобы строго искать соответствие по идентификатору товара в регистре Номенклатура маркетплейсов, система применяет так называемый "мнемонический" или "нечеткий" поиск — для точной настройки сопоставления есть загрузка документов маркетплейсов в 1С:БП с нечетким поиском. Подобные сложности с автоматизацией не редкость и при работе с другими площадками, например, когда выполняется загрузка заказов из OZON или Яндекс Маркета, где точность сопоставления критически важна для складского учета.
Что это означает на практике:
Еще один важный момент: если система один раз сопоставила номенклатуру неверно, она "запоминает" этот выбор. Простое удаление загруженного документа и повторная загрузка не помогут — 1С снова подставит неверное значение. Чтобы сбросить такое "запоминание", нужно вручную очищать записи в служебных регистрах, например, в регистре сведений Соответствие номенклатуры сервиса 1С:Номенклатуре.
Ошибки сопоставления могут возникать не только в отчетах о продажах, но и в других операциях — например, при оформлении выкупов пригодится загрузка уведомлений о выкупе Wildberries с сопоставлением товаров. К примеру, когда требуется загрузка Акта возврата бракованного товара от WildBerries, некорректная привязка позиций может привести к пересортице на складе брака. Поскольку штатный механизм ведет себя непредсказуемо, самым надежным решением является его отключение и замена собственным, строгим алгоритмом поиска.
Этот подход предполагает, что мы будем хранить артикул или код товара с Wildberries непосредственно в карточке номенклатуры в 1С и искать по нему. Этот способ самый простой и быстрый в реализации.
Шаг 1. Добавляем реквизит в справочник.
Через расширение добавим в справочник Номенклатура новый реквизит, например, STR_АртикулWB (тип "Строка"). В этот реквизит для каждой позиции нужно будет один раз внести соответствующий "Код номенклатуры" из отчета Wildberries.
Шаг 2. Создаем расширение для формы сопоставления.
Нам нужно вмешаться в работу формы СопоставлениеНоменклатурыБЭД. Создадим расширение для этой формы и добавим в него серверную процедуру, которая будет выполнять наш собственный поиск.
Шаг 3. Пишем код для сопоставления.
В модуле расширенной формы создадим процедуру, которая будет перебирать строки в таблице сопоставления и подставлять номенклатуру, найденную по нашему новому реквизиту. Вызывать эту процедуру будем при открытии формы.
&НаСервере
Процедура ОсуществитьПоискНоменклатур()
// Перебираем все строки в табличной части "Сопоставление" на форме
Для Каждого Стр ИЗ Объект.Сопоставление Цикл
// Предварительно очищаем результат штатного поиска, если он был.
Стр.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
// Выполняем строгий поиск по нашему новому реквизиту.
// В Стр.КодМагазина при загрузке отчета WB попадает "Код номенклатуры".
Стр.Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("STR_АртикулWB", Стр.КодМагазина);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура STR_ПриОткрытииПосле(Отказ)
// Вызываем наш поиск сразу после того, как форма открылась
ОсуществитьПоискНоменклатур();
КонецПроцедуры
Как это работает: Процедура ОсуществитьПоискНоменклатур проходит по каждой строке документа, где требуется сопоставить номенклатуру. Она берет значение из колонки КодМагазина и ищет в справочнике Номенклатура элемент, у которого в реквизите STR_АртикулWB записано точно такое же значение. Этот метод НайтиПоРеквизиту гарантирует однозначный и точный поиск.
Этот способ более "правильный" с точки зрения архитектуры 1С, поскольку использует штатный объект — регистр сведений Номенклатура маркетплейсов. Мы так же будем использовать расширение, но логика поиска будет обращаться к записям регистра. Аналогичный подход используется в качественных решениях для других площадок, таких как загрузка заказов из СберМегамаркет или обработка данных о продажах из Avito.
Шаг 1. Заполняем регистр сведений.
Убедитесь, что регистр Номенклатура маркетплейсов корректно заполнен. Для каждой номенклатуры должна быть запись, содержащая Маркетплейс (Wildberries), ссылку на Номенклатуру и Идентификатор товара.
Шаг 2. Модифицируем код в расширении.
Вместо поиска по реквизиту, напишем код, который будет делать строгий отбор по регистру через запрос, что обеспечит высокую производительность при больших объемах данных.
&НаСервере
Функция НайтиНоменклатуруПоКодуWB(КодТовара)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НоменклатураМаркетплейсов.Номенклатура
|ИЗ
| РегистрСведений.НоменклатураМаркетплейсов КАК НоменклатураМаркетплейсов
|ГДЕ
| НоменклатураМаркетплейсов.ИдентификаторТовара = &ИдентификаторТовара
| И НоменклатураМаркетплейсов.Маркетплейс = &Маркетплейс";
Запрос.УстановитьПараметр("ИдентификаторТовара", КодТовара);
Запрос.УстановитьПараметр("Маркетплейс", Перечисления.ВидыМаркетплейсов.Wildberries);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Справочники.Номенклатура.ПустаяСсылка();
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Номенклатура;
КонецЕсли;
КонецФункции
&НаСервере
Процедура ОсуществитьПоискНоменклатур()
Для Каждого Стр ИЗ Объект.Сопоставление Цикл
Стр.Номенклатура = НайтиНоменклатуруПоКодуWB(Стр.КодМагазина);
КонецЦикла;
КонецПроцедуры
Часто бывает так, что после первой загрузки отчета обнаруживаются несопоставленные позиции. Чтобы не перезапускать форму после внесения правок в справочники, добавим кнопку для принудительного запуска нашего алгоритма.
&НаКлиенте
Процедура СопоставитьНоменклатуру(Команда)
ОсуществитьПоискНоменклатур();
КонецПроцедуры
&НаСервере
Процедура STR_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
НоваяКоманда = ЭтаФорма.Команды.Добавить("СопоставитьНоменклатуру");
НоваяКоманда.Заголовок = "(STR) Сопоставить номенклатуру";
НоваяКоманда.Действие = "СопоставитьНоменклатуру";
НоваяКнопка = ЭтаФорма.Элементы.Вставить(
"КнопкаСопоставитьНоменклатуру",
Тип("КнопкаФормы"),
ЭтаФорма.Элементы.КоманднаяПанель
);
НоваяКнопка.ИмяКоманды = "СопоставитьНоменклатуру";
НоваяКнопка.Отображение = ОтображениеКнопки.Текст;
КонецПроцедуры
В итоге, отказавшись от непредсказуемого штатного механизма в пользу строгого алгоритма в расширении, вы сможете полностью автоматизировать процесс загрузки отчетов, избежав ошибок в учете и пересортицы товаров.