Единое решение вместо пяти маркетплейсов
Как мы упростили продажи товаров Ormatek на популярных маркетплейсах, создав единую площадку для обмена заказами с ними
Единое решение вместо пяти маркетплейсов
Как мы упростили продажи товаров Ormatek на популярных маркетплейсах, создав единую площадку для обмена заказами с ними
Задача разработчика — не только делать вау-эффекты на страницах и создавать удобные каталоги в е-коммерсе. Даже не в том, чтобы прикручивать на сайты сложнейшие интеграции (хотя куда без этого). Главная задача разработчика — автоматизировать бизнес-процессы заказчика, сделав их удобнее, быстрее и прозрачнее.
Поэтому, кроме высоконагруженных сайтов и приложений, мы частенько создаем для клиентов продуманные личные кабинеты и B2B-сервисы, которые экономят время и деньги. И когда наш постоянный клиент Ormatek пришел к нам с идеей выйти сразу на несколько маркетплейсов и как-то автоматизировать работу с ними, мы знали — впереди нас ждет интереснейший проект.
Поэтому, кроме высоконагруженных сайтов и приложений, мы частенько создаем для клиентов продуманные личные кабинеты и B2B-сервисы, которые экономят время и деньги. И когда наш постоянный клиент Ormatek пришел к нам с идеей выйти сразу на несколько маркетплейсов и как-то автоматизировать работу с ними, мы знали — впереди нас ждет интереснейший проект.
Ormatek — наш давний клиент, с которым мы прошли огонь, воду, медные трубы, пандемию и её последствия: в 2021 году сделали из просто интернет-магазина маркетплейс. Развитием проекта мы занимаемся более 10 лет.
Предыстория: зачем всё это было нужно
В 2020 году, когда случился коронавирус, начался бум онлайн-продаж. Наш клиент — Орматек — решил, что кроме развития своего сайта стоит выйти на сторонние маркетплейсы. Сделать это хотелось в рамках уже существующей IT-инфраструктуры, для чего требовалось автоматически передавать товары на торговые площадки, а заказы с маркетплейсов — в 1С.
Мы начали с тестирования гипотезы: будет ли этот функционал вообще востребован. Для этого запустили контур в полуручном режиме. На основном сайте Орматека настроили фиды (выгрузки данных в специальном формате), с помощью которых стали передавать товары в маркетплейсы. Особенность в том, что у каждого маркетплейса требования к формату данных свои — поэтому под каждый маркетплейс (Ozon, Wildberries, Яндекс Маркет и Aliexpress) фиды мы кастомизировали.
Заказы обрабатывали вручную, поскольку тогда их было немного. Но со временем количество заказов с маркетплейсов выросло, поэтому потребовалась их автоматическая передача в 1С. Мы выбирали из двух вариантов:
Мы начали с тестирования гипотезы: будет ли этот функционал вообще востребован. Для этого запустили контур в полуручном режиме. На основном сайте Орматека настроили фиды (выгрузки данных в специальном формате), с помощью которых стали передавать товары в маркетплейсы. Особенность в том, что у каждого маркетплейса требования к формату данных свои — поэтому под каждый маркетплейс (Ozon, Wildberries, Яндекс Маркет и Aliexpress) фиды мы кастомизировали.
Заказы обрабатывали вручную, поскольку тогда их было немного. Но со временем количество заказов с маркетплейсов выросло, поэтому потребовалась их автоматическая передача в 1С. Мы выбирали из двух вариантов:
- Прямая интеграция маркетплейсов с 1С. Решение — рабочее. Но настройкой 1С занималась отдельная служба заказчика, прогнозируемые сроки реализации силами которой были слишком долгими. На эти сроки влияли приоритеты на стороне заказчика: у специалистов по 1С очередь начинается с задач финансового отдела, бухгалтерии, розницы и только потом — сайта. На тот момент задач одной розницы было на полгода.
- Передача заказов из маркетплейсов на сайт, а потом — с пометкой «Заказ Маркетплейс» — уже в 1С-ку. Этот путь оказался проще, так как у сайта есть кастомизированный обмен с 1С и мы знаем, какие данные по заказам и в каком формате отдавать.

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— Стали искать решение, как быстро получать заказы из маркетплейсов, не разворачивая отдельную интеграцию с каждым (нам же надо протестировать гипотезу!). Нашли в магазине решений Битрикса несколько готовых модулей и попробовали работать с ними.
Модуль от Яндекса оказался вполне годным: его писали опытные программисты, но обратная сторона этого преимущества — код слишком сложный. Из-за этого доработать его под свои задачи или хотя бы отключить передачу какого-то параметра не удавалось. В итоге на сайт мы сохраняли всё, что приходило от «Яндекс Маркета», а в 1С передавали только нужное.
С Ozon и Wildberries было сложнее. Штатный модуль Озона плохо ложился на бизнес-логику проекта: имел неподходящие нам методы и способы интеграции, не учитывал всех нужных нам параметров. Например, модуль передает адрес доставки одним полем, а в 1С нам нужно передавать отдельно страну, регион и прочее. Из-за этого пришлось написать отдельный запрос на получение городов из Ozon. Другая проблема озоновского модуля: его код — черный ящик, в котором ничего нельзя поменять.
С Ozon и Wildberries было сложнее. Штатный модуль Озона плохо ложился на бизнес-логику проекта: имел неподходящие нам методы и способы интеграции, не учитывал всех нужных нам параметров. Например, модуль передает адрес доставки одним полем, а в 1С нам нужно передавать отдельно страну, регион и прочее. Из-за этого пришлось написать отдельный запрос на получение городов из Ozon. Другая проблема озоновского модуля: его код — черный ящик, в котором ничего нельзя поменять.

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— Модуль Wildberries мы тоже устанавливали, но поработать с ним не успели. Увидели, что главная страница админки сайта стала весить в три раза больше — 9 мегабайт вместо 3 — а следовательно и грузиться в 3 раза медленнее. Модуль оперативно удалили.
Несмотря на все сложности сторонних модулей, мы смогли настроить их работу для проверки гипотезы. Примерно за полгода клиент понял, что продажи через маркетплейсы эффективны, и принял решение масштабироваться.
Чтобы не нагружать текущий сайт и не создавать дополнительную точку отказа, функционал обмена заказами с маркетплейсами и 1С мы решили вынести в отдельный сервис.
Чтобы не нагружать текущий сайт и не создавать дополнительную точку отказа, функционал обмена заказами с маркетплейсами и 1С мы решили вынести в отдельный сервис.
Площадка для обмена с маркетплейсами: начало

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— Реализацию отдельного сервиса для работы с маркетплейсами мы начали с аналитики — подготовки протокола интеграции. У нас было два обмена с маркетплейсами: заказами и товарами. Товары мы решили оставить как есть — фидами. А вот для импорта заказов с маркетплейсов — разрабатывать новую систему.
Для импорта заказов с маркетплейсов нам требовалось смэтчить несколько систем:
Для этого мы планировали разработать сервис на базе Laravel, который вел бы обмен заказами так же, как штатный в Битриксе (на котором работает сайт Орматека), причем с кастомизациями, которые уже много лет как реализованы на сайте.
Вот как это должно было работать:
- маркетплейс (стартовали с Озона, так как у него самое понятное API).
- данные текущего сайта (ID доставок, ID оплат, ID товаров) — всё то, что 1С уже знала как ID от маркетплейсов. Причем, для этого нам не нужно было ничего менять на стороне 1С.
- сама 1С.
Для этого мы планировали разработать сервис на базе Laravel, который вел бы обмен заказами так же, как штатный в Битриксе (на котором работает сайт Орматека), причем с кастомизациями, которые уже много лет как реализованы на сайте.
Вот как это должно было работать:
1
Площадка обмена получает заказы от маркетплейса и в разных форматах данных (JSON, XML), сохраняет их в свою базу данных в исходном виде и формирует из них представление в виде XML (CommerceML), чтобы передать в 1С.
2
Из 1С статусы заказа (сформирован, готовится к отправке, отправлен и так далее) передаются на площадку обмена, которая в свою очередь передает их в маркетплейс (вплоть до финального статуса).
3
Пользователь может отменить заказ на маркетплейсе — информация об этом попадает на площадку обмена, но НЕ передается в 1С. Менеджер «Орматек» при этом получает уведомление об отмене заказа.

Примерная схема работы сервиса по обмену с маркетплейсами
В теории всё здорово, но есть одно большое «но»: у «Орматек» несколько торговых марок и интернет-магазинов для разных ценовых сегментов — «Райтон», Ormatek, Proson и TSleep), у каждого из которых своя 1С. Внутри все 1С-ки устроены одинаково, вот только товары у всех — разные. Нашей задачей было сделать, чтобы для магазина каждой марки можно было легко настроить свой обмен с маркетплейсами.
Итого имеем:
Итого имеем:
- сайт Ormatek с товарами;
- несколько 1С;
- несколько маркетплейсов с разными API и форматами данных (Ozon, Wildberries, Яндекс Маркет, Мегамаркет и, добавившийся в 2025-м, казахский Kaspi);
- новую площадку обмена, которая должна это всё объединить.
Как мы всё это «подружили»
Для гибкости и удобства мы выбрали для площадки обмена Laravel с админ-панелью Orchid. При этом от разработки отдельного фронтэнда площадки обмена на первом этапе решили отказаться, пустив менеджеров прямо в интерфейс админ-панели (естественно, настроив необходимые права доступа). А дальше — стали добавлять нужный нам функционал.
Работа с данными из 1С
Поскольку у заказчика несколько интернет-проектов, и каждый со своей 1С, мы реализовали в админке площадки обмена возможность добавить любую 1С клиента и в два клика настроить с ней обмен. Для этого достаточно:
- задать на сайте логин и пароль для 1С, с которым она будет «стучаться» на сайт;
- создать пользователей, которые будут ей управлять, — чтобы менеджеры не видели лишнего и работали только со своими данными;
- задать префикс, с которым заказы будут улетать в 1С.

Задали название 1С-ки, префикс для номеров заказа (чтобы при беглом взгляде сразу было ясно, что заказ — например, с Орматека), логин пользователи и ответственного менеджера
Работа с данными из 1С

Евгений
Разработчик
— Большой разницы при интеграциях с разными маркетплейсами не было: да, в каждом — свой формат данных, но по итогу они дают все нужные нам данные.
Из важных отличий — статусы заказа: у каждого свой набор, а нам было важно привести их к тому виду, что есть в 1С.
Из важных отличий — статусы заказа: у каждого свой набор, а нам было важно привести их к тому виду, что есть в 1С.
Из крутого, и пока крайне редко встречающегося в web-разработке: обмен с маркетплейсами мы покрыли автотестами — это позволяет автоматически и по расписанию проверять, что все работает как положено.
Соединяем данные от 1С с данными от маркетплейсов
После того, как мы настроили получение данных из маркетплейсов, надо было сделать так, чтобы конкретной 1С передавались заказы из нужного маркетплейса. Для этого мы сделали настройку расшивочных таблиц прямо в админ-панели.
Расшивочная таблица — таблица, в которой организованы взаимосвязи между данными из нескольких источников, в данном случае — двух: 1С конкретного онлайн-магазина и конкретного маркетплейса.

Евгений
Разработчик
— В расшивочной таблице мы храним то, как связана конкретная 1С с разными маркетплейсами: как маркетплейсы отдают статусы заказов и как их должна понимать 1С, а также некоторые специфичные параметры для выгрузки в 1С вроде id доставок и платежных систем. Всё это помогает четко структурировать большой объем данных из разных источников.
Для каждой «расшивки» задаются:
- Маркетплейс и 1С из уже созданных на площадке обмена.
- Префикс номера заказа конкретного маркетплейса: например, ORM_. Он нужен, чтобы при сочетании двух префиксов (от 1С и от маркетплейса) получалась индивидуальная комбинация, с помощью которой можно быстро идентифицировать заказы.
- client_id и api_key — нужны, чтобы маркетплейс «узнавал» площадку и делился с ней данными.
- Платежные системы и сервисы доставки.

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— Для всех маркетплейсов в 1С уже задана определенная платежная система, поэтому мы не стали «зашивать» её ID в код площадки обмена, а сделали настраиваемым параметром — на случай, если потребуется добавить дополнительные платежные системы. Аналогично поступили и с сервисами доставки.
Реализовали это как выбор из отдельной таблицы, в которой также можно создать новые платежные системы или службы доставки.
Реализовали это как выбор из отдельной таблицы, в которой также можно создать новые платежные системы или службы доставки.
- Данные для настройки обмена с 1С — различные xmlID контрагентов, договоров и пользователей, так как в 1С под них создаются индивидуальные сущности.
- Настройки уведомлений — можно задать адреса электронной почты, куда приходят уведомления по заказам от каждой пары 1С-маркетплейс.

Фрагмент расшивочной таблицы
Было важно сопоставить статусы заказов: в 1С они свои, у каждого маркетплейса — тоже свои. Поэтому мы реализовали гибкую настройку соответствий (так называемый «маппинг»), которая может меняться админом площадки.

Евгений
Разработчик
— Маппинг статусов — это своего рода переводчик: ты ему подсовываешь статусы на языке маркетплейса, а он переводит их на язык, понятный 1С-ке — и наоборот. По факту это просто способ указать в админке, какой статус маркетплейса сопоставляется с каким статусом в 1С.
Например, на маркетплейсе у заказа есть статус «Готов к сборке» — если отдать его в 1С, как есть, она ничего не поймёт. С помощью маппинга мы заменяем этот статус на понятный ей «Выполняется». И наоборот: статус 1С-ки вроде «Запланирована доставка» для маркетплейса — китайская грамота, а вот «Готов к отгрузке» — уже другое дело.

Слева — как статусы маркетплейса выглядят в 1С, справа — наоборот

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— Почему мы не «зашили» маппинг в код площадки? Там слишком много переменных.
Например, сегодня заказчик работает с маркетплейсом по схеме FBS, продавая товары со своего склада, а завтра может передумать и перейти на схему FBO, продавая со склада маркетплейса.
В случае таких изменений снова потребуется индивидуальная тонкая настройка этих статусов, поэтому подобные параметры зашивать в код — нельзя. А вот возможность менять систему работы с маркетплейсом на площадке — мы предусмотрели.
Например, сегодня заказчик работает с маркетплейсом по схеме FBS, продавая товары со своего склада, а завтра может передумать и перейти на схему FBO, продавая со склада маркетплейса.
В случае таких изменений снова потребуется индивидуальная тонкая настройка этих статусов, поэтому подобные параметры зашивать в код — нельзя. А вот возможность менять систему работы с маркетплейсом на площадке — мы предусмотрели.
Дополнительный импорт данных
Когда стали обкатывать решение на практике, поняли, что иногда обычный ID заказа неинформативен для менеджера. Поэтому мы написали два дополнительных импорта данных из основного интернет-магазина Ormatek:
- импорт товаров — с его помощью получаем название товара, ID в каталоге и особый параметр xmlID, который нужен 1С для матчинга и идентификации;
- импорт местоположений — по каждому заказу в 1С также передается местоположение пользователя: от этого зависит бизнес-логика на стороне 1С.
Что ещё умеет площадка обмена
Мощные фильтры в списке заказов
Заказчик попросил сделать «такие же фильтры, как в Битриксе, или даже круче»: мы сделали. Заказы в списке можно фильтровать по любому параметру: от даты создания до даты окончания доставки. А ещё — гибко выводить нужные колонки и скрывать ненужные (причем, по каждому пользователю площадки обмена вывод этих колонок сохраняется) и управлять количеством строк, которые выводятся в таблице. В общем — всё, чтобы быстро найти конкретный заказ.

Возможности фильтров и поиска в списке заказов на площадке
Расчет дедлайна сборки заказа
Маркетплейсы отвечают за сроки доставки заказа перед покупателями, поэтому, если продавец сильно задерживается с поставкой, маркетплейс может или просто отменить заказ, или дать покупателю за это скидку (такая практика была, например, у Ozon в связи с санкциями). Дату, после которой сборка заказа будет отменена, маркетплейс передает на площадку обмена в параметре «дата окончания сборки».
Магазину пропустить эту дату — как минимум, неприятно: в борьбе за клиента такие случаи сильно портят репутацию. Поэтому мы сделали в списке заказов на площадке обменов отдельную колонку, где выводится время до «даты окончания сборки» с обратным отсчетом и цветовой индикацией. Благодаря этому менеджерам «Орматека» будет максимально сложно пропустить такую дату и тем самым расстроить клиента на маркетплейсе.
Магазину пропустить эту дату — как минимум, неприятно: в борьбе за клиента такие случаи сильно портят репутацию. Поэтому мы сделали в списке заказов на площадке обменов отдельную колонку, где выводится время до «даты окончания сборки» с обратным отсчетом и цветовой индикацией. Благодаря этому менеджерам «Орматека» будет максимально сложно пропустить такую дату и тем самым расстроить клиента на маркетплейсе.

Приближающийся срок окончания сборки — желтый, просроченный — красный
Кастомная детальная страница заказа с режимом отладки
Типовой интерфейс админ-панели Orchid предполагает детальные страницы заказов, но он нам не подходил, поэтому мы полностью кастомизировали его. За счет этого на детальный странице заказа теперь выводятся сразу несколько удобных вкладок:
1
Основное: ключевая информация с расшифровками каждого параметра — например, когда заказ был создан, изменен или обновлен.

Вкладка «Основное» на детальной странице заказа
2
«Отладка». Вкладка в режиме реального времени показывает, что именно пришло при обмене от маркетплейса и что ушло в 1С. Такой режим позволяет быстро найти ошибку — например, если маркетплейс не передал какие-то данные на площадку и из-за этого 1С не принимает заказ. Благодаря этому менеджеры зачастую могут справиться с проблемой сами, а не писать в техподдержку.
3
Журнал. Хранит историю действий по каждому заказу: когда тот был создан, выгружен в 1С, обновлен на маркетплейсе и в 1С. Это помогает отследить аномалии, если те случаются.
4
История изменений. Помогает отследить, кто из пользователей площадки и что именно редактировал в заказе.
5
Чат в маркетплейсе. При работе по схеме FBS, когда продавец сам отвечает за хранение и доставку товара, он часто общается с покупателями по деталям заказа в чате на самом маркетплейсе. Чтобы менеджеры «Орматека» не заходили на каждый маркетплейс для переписки с покупателями, мы вывели чат маркетплейса на отдельную вкладку детальной страницы заказа. Передача данных — отдельно по API. Такое решение серьезно упрощает и ускоряет работу.

Превью чата маркетплейса в дамин-панели площадки
6
Постоянная вкладка «Внутренний чат»: заказчик просил этот функционал, поскольку бывают случаи, когда сразу несколько человек «сидят» в системе и делают пометки — чат поможет не запутаться. Например, здесь менеджер может указать, что забрал заказ в работу, чтобы его не взял никто другой.
Удобные графики
Раньше по каждому бренду отчёты создавались в 1С и выгружались в Excel — да, наглядно, но когда у тебя пачка маркетплейсов и четыре бренда — это долго и муторно. На площадке мы предусмотрели возможность строить графики в одном месте — так все заказы по всем брендам и по всем маркетплейсам как на ладони.

Елена
Продакшн-директор
и руководитель проекта
и руководитель проекта
— С графиками очень удобно работать — их можно настраивать настолько гибко, насколько это нужно маркетологу или его руководителю. Например, можно посмотреть все заказы с Озона за сентябрь — и это без всяких выгрузок из 1С и заполнения табличек в экселе.
Но если всё-таки очень нужны данные в формате CSV, есть опция выгрузки и фильтры: можно настроить, что именно нужно для отчета, за какой период и все ли заказы должны попасть в эту выгрузку.
Но если всё-таки очень нужны данные в формате CSV, есть опция выгрузки и фильтры: можно настроить, что именно нужно для отчета, за какой период и все ли заказы должны попасть в эту выгрузку.

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

Настройка ролей в админ-панели
Гибко настраиваемые роли пользователей
Чтобы не писать документацию к коду отдельно, мы сразу аккуратно написали к нему комментарии (зачем нужны классы и что делают методы в этих классах), а затем — создали отдельный скрипт для генерации из всех комментариев к PHP-коду текстового документа.
О планах проекта

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