Кейсы

Одна позиция торговой сети — десяток позиций в 1С. Как мы научили Контур.EDI работать с наборами 1С

Доработка
Производитель игрушек отгружает продукцию в крупные торговые сети и обменивается с ними документами через Контур.EDI. Сети заказывают товар «в ассортименте»: одна строка в их заказе — это десяток артикулов разных цветов и размеров, которые в 1С учитываются по отдельности. Контур. EDI с наборами 1С работать не умеет, а разработка на стороне вендора оказалась слишком долгой и дорогой. Мы сделали доработку сами — теперь заказ, подтверждение, реализация, УПД с кодами маркировки формируются в несколько кликов, а сеть видит в документах привычную ей номенклатуру.

С какой проблемой пришёл клиент

Заказчик — крупная фабрика игрушек, которая производит более миллиона единиц продукции в год. После перехода на 1С:ERP нужно было поднять электронный обмен документами с покупателями — федеральными сетями. Обмен идёт через Контур.EDI. На этапе тестирования обмена мы упёрлись в конфликт двух логик учёта.
У сети во входящем заказе указана «Игрушка №1 в ассортименте» — это одна номенклатурная позиция. Одна строка в заказе, одна строка в счёте, одна строка в УПД.
У производителя за этой строкой стоят разные артикулы: несколько расцветок, несколько размеров. Каждый — со своей себестоимостью, своими остатками, своими кодами маркировки «Честного знака». Свалить их в одну позицию нельзя: развалится складской учёт и маркировка.
В 1С для компановки одной номенклатуры с разными характеристиками есть готовая сущность — наборы. Набор позволяет вести учёт по отдельным товарам, но выбирать и показывать их как единое целое: удобно и для печатных форм, и для обмена. Ровно то, что нужно.
Проблема в том, что Контур.EDI про наборы 1С ничего не знает. Если в его настройках сопоставить входящую позицию сети с набором 1С, то в заказ клиента запишется сам набор — как обычная номенклатура.

"Что это означало для сотрудников: либо руками разбирать каждый входящий заказ на артикулы, а потом руками же собирать их обратно в позиции сети — для подтверждения, для счёта-фактуры, для УПД. Либо не пользоваться EDI вообще. Первое — это часы рутины каждый день и гарантированные расхождения в документах. Второе — не вариант, потому что заказы от сетей приходят только так."


Александр
ведущий разработчик

Почему не помогло «просто заказать доработку у вендора»

Сначала мы проверили очевидную гипотезу: может, поддержка наборов где-то есть, просто мы её не нашли. Контур.EDI — зрелый продукт с адаптациями под самые разные случаи, версия для 1С у него своя. Мы написали в техподдержку Контура. Ответ: поддержки наборов 1С нет.
Тогда клиент пошёл вторым логичным путём — спросил у Контура, сколько будет стоить доработать решение на их стороне. Логика правильная: своё решение вендор знает лучше всех. Но озвученные цена и сроки оказались несопоставимы с задачей.
Мы предложили сделать это сами. И сразу зафиксировали для себя главное ограничение: лезть в модуль Контура минимально и только там, где без этого не обойтись. Он чужой, объёмный, регулярно обновляется. Чем глубже в него залезешь, тем дороже будет каждое следующее обновление.

Что мы сделали

Заказ пришёл: набор разворачиваем в товары

Сеть присылает заказ, пользователь нажимает «Обработать входящее сообщение» — в 1С создаётся заказ клиента.
Входящий заказ покупателя, где несколько позиций представлены в виде одной номенклатуры
Входящий заказ покупателя, где несколько позиций представлены в виде одной номенклатуры
Мы добавили проверку в событие перед записью заказа: если заказ новый и в нём есть позиции с типом «набор» — заменяем их составом набора прямо на лету. Позицию-набор убираем, добавляем входящие в него товары.
Обработанный заказ, в котором входящий набор заменен составом
Обработанный заказ, в котором входящий набор заменен составом
Два важных следствия:
  • Разворачивает набор тот же самый код, который отрабатывает при обычном подборе товаров через интерфейс. То есть заказ получается ровно такой, как если бы менеджер набрал его руками.
  • Модуль Контура при этом не затронут вообще. Доработка живёт в заказе клиента и не зависит от того, что и когда вендор поменяет у себя.

Отвечаем сети: товары сворачиваем обратно в набор

Теперь обратная задача. Сеть ждёт от нас подтверждение заказа, а мы отправляем ей то, что лежит в заказе клиента, — то есть развёрнутые артикулы. Для сети это чужая номенклатура: её собственные позиции в подтверждении отменяются как отсутствующие, а вместо них приходят непонятные строки со статусом «Уточнён».
«Исходящий ответ на заказ» с ошибкой — две позиции сети отклонены, ниже добавлены наши артикулы
«Исходящий ответ на заказ» с ошибкой — две позиции сети отклонены, ниже добавлены наши артикулы
Мы встроились в момент, когда Контур собирает таблицу товаров для исходящего сообщения, и научили её отдавать не отдельные артикулы, а те наборы, из которых они были развёрнуты. Подтверждение уходит в сеть в её собственных позициях, со статусом строк «Подтверждён» — сходятся и количество, и цены, и суммы.
Вот здесь без правок в модуле Контура обойтись уже не удалось. Мы сделали их точечными, чтобы было удобно поддерживать и только там, где это необходимо.

Дальше по цепочке: реализация, счёт-фактура, УПД

Один документ автоматизировать мало — рутина просто переезжает на следующий шаг. Поэтому тем же принципом мы прошли всю цепочку:
  • Счёт-фактура. При отправке возникала та же проблема, что и с подтверждением: номенклатура подтягивалась из реализации в развёрнутом виде. Свёртку в наборы добавили и сюда.
  • Коды маркировки «Честный знак». После свёртки в наборы УПД уходили в Контур.Диадок без кодов маркировки: коды были подобраны в 1С на артикулы, а в исходящем сообщении артикулов уже нет.
В исходящем счет-фактуре отсутствовали коды маркировки
В исходящем счет-фактуре отсутствовали коды маркировки
Мы переназначили принадлежность кодов — те, что относятся к комплектующим, теперь считаются кодами набора, и в строку попадает ровно столько кодов, сколько единиц товара в набор входит. Сами коды при этом не меняются и не теряются: их состав в документе совпадает с тем, что физически уходит на отгрузку, а в «Честный знак» данные передаются в прежнем виде.
Исходящее сообщение с кодами маркировки, привязанными к позициям набора
Исходящее сообщение с кодами маркировки, привязанными к позициям набора

Попутно: реализация без оглядки на статус отгрузки

Эта задача с наборами напрямую не связана, но всплыла на том же участке. Контур создавал реализацию только с оглядкой на статус отгрузки в заказе. А в работе между контрагентами есть нюансы, которые требуют обмена электронными документами фактической отгрузки. Неотгруженные товары блокировали отправку сообщения в Контуре.
Требования установить состояние “Отгрузить“ товарам в Реализации
Требования установить состояние “Отгрузить“ товарам в Реализации
Научили обработку вводить реализацию на основании заказа без учёта состояния отгрузки — и по одной строке, и для группы сообщений сразу.
Создание Реализации без учета состояния отгрузки
Создание Реализации без учета состояния отгрузки

Переключатель на случай «а давайте посмотрим без вас»

Отдельно клиент попросил возможность отключать код для работы с наборами. Просьба абсолютно понятная: когда в чужом продукте появляется чужая доработка, при любой непонятной ситуации хочется первым делом проверить, не в ней ли дело.
Мы добавили в настройки Контура два собственных переключателя — на свёртку в наборы и на заполнение кодов маркировки. Включаются и выключаются они прямо в интерфейсе настроек, перезапуска и участия программиста не требуют.
Дерево настроек Контур.EDI с добавленными переключателями
Дерево настроек Контур.EDI с добавленными переключателями

Как мы ловили ошибки, которые не видно глазами

Один эпизод хорошо показывает, почему такие проекты не заканчиваются в день релиза.
Доработка уже работала на боевых данных, когда на одной паре «заказ — реализация» свёртка внезапно отвалилась. Система писала, что товарный состав заказа и реализации не совпадает. Открываем оба документа — состав идентичный, отличий нет.
Отличия нашлись в невидимой части. У реализации есть вторая табличная часть — «Виды запасов», — и типовая логика Контура берёт товары именно из неё. А там одна строка товара оказалась разбита на две из-за разной аналитики вида запаса. Для человека документы одинаковые, для программы — нет.
Разделение номенклатуры по аналитике
Разделение номенклатуры по аналитике
Мы доработали логику так, чтобы подобные ошибки больше не возникали. Случай редкий, но именно на таких редких случаях обычно и рушится доверие к автоматизации.

Что получилось в итоге

Обмен с торговыми сетями работает полным циклом: входящий заказ → заказ клиента → подтверждение → реализация → счёт-фактура и УПД с кодами маркировки → паллетный лист.
  • Сеть видит свои позиции, наш заказчик — свои. Никто не подстраивается под чужой учёт, никто не сверяет строки вручную.
  • Ручной пересборки документов нет. Разворот и свёртка происходят автоматически, менеджер просто отрабатывает требуемые действия в списке сообщений Контура.
  • Обновления Контура не блокированы. Доработки специально помечены в коде и отключаются настройкой. Перенести их на новую версию — понятная и быстрая процедура.
  • Ядро решения было готово за месяц. Остальное время ушло на цепочку смежных документов, боевое тестирование и сопровождение.

Почему мы рассказываем этот кейс

Он про типичную ситуацию: есть отраслевой стандарт обмена, есть ваша учётная модель, и они не совпадают. Вендор под вас подстраиваться не будет — вы у него один из тысячи.
Выход почти всегда есть, и он редко лежит в плоскости «перепишем чужой модуль». Гораздо чаще нужно найти несколько точек на стыке систем и аккуратно встроиться в них так, чтобы обе стороны продолжали жить своей жизнью.

Сколько это стоит

Сейчас такой проект стоил бы примерно 260 000 рублей.
Сам подход мы переносим на другие проекты: логика разворота и свёртки наборов уже написана, и на похожей задаче не придётся начинать с нуля. Но объём работ зависит от вашей конфигурации, учётной модели, набора документов в обмене.
Если у вас похожая история — EDI, маркировка, обмен с сетями или любая другая интеграция, которая «почти работает, но не с вашей номенклатурой», — расскажите, что именно не сходится. Посмотрим, решается ли это так же малой кровью.