Клиент присылает заявку как ему удобно. Мы научились её принимать

Оптовый клиент не обязан заполнять вашу форму. Он присылает свой Excel с объединёнными шапками и подытогами посреди таблицы, или список текстом в мессенджер, или письмо с вложением, а иногда просто звонит и полчаса диктует. На той стороне сидит менеджер и руками ищет каждую строку в номенклатуре: «втулка стабилизатора перед ВАЗ-2108, 20 шт» — это, вероятно, вот этот артикул, а может быть, и вот тот. Свобода клиента оплачивается временем поставщика, и платят его каждый день. Ниже — как мы устроили приёмку таких заявок у себя, что замерили и какие доработки пришлось откатить, потому что замер показал: стало хуже.

Сразу о том, чей это опыт. EorderPRO — наш собственный продукт, кабинет оптовых заказов, он работает в проде на площадке b2motor.ru. Приёмку заявок мы написали и выкатили в августе 2026 года. То есть за ошибки в ней платили своими деньгами — поэтому и показываем их спокойно. И сразу про ограничение, чтобы не тянуть до середины: голосовой канал в кабинете пока не включён. Разговор про него будет ближе к концу — с замером и без обещаний.

Сколько это стоит, когда руками

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

Дальше начинается арифметика, которую владелец обычно видит не в часах, а в найме. Быстро работает тот, кто помнит, каким сокращением ваши клиенты называют ремкомплект и под каким кодом он у вас лежит. Таких людей в компании один-два, они же самые загруженные, и их знание нигде не записано. Новый сотрудник разбирает заявку в четыре раза дольше — и месяцами.

Почему очевидные решения не помогают

Первое, что приходит в голову: пусть клиент заполняет нашу форму. Не будет. У него пять поставщиков, и подстраиваться под каждого — не его работа. Кто настаивает, тот теряет заявки в пользу того, кто принимает как есть.

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

Насколько разводит — видно на конкретном письме. Одно письмо, 80 строк: наш прежний почтовый импорт сопоставил ноль строк, приёмка — 79. Ноль тут закономерен и не является чьей-то виной: старому импорту нечего было делать с файлом, форму которого ему не описали.

Как это устроено: три акта

Заявка из любого канала попадает в один и тот же конвейер. Не важно, пришла она файлом, письмом или списком текстом, — дальше с ней происходит одно и то же.

КАК ПРИСЛАЛИ ФАЙЛ EXCEL СПИСОК ТЕКСТОМ ПИСЬМО С ВЛОЖЕНИЕМ ГОЛОСОВОЕ И ЗВОНОК ФОТО И СКАН в проде в проде в проде прототип, не в кабинете пока не умеем 1 Понять строку: где артикул, где машина, где цена. «Итого» и «в т.ч. НДС» выбрасываем 2 Найти кандидатов: по артикулу и OEM, потом по словам названия. Точное совпадение подставляем сами 3 Не дать ошибиться: отсекаем чужую модель, б/у и уценку. Цены ставим ваши, а не базовые 16 СЕКУНД машинного времени на 107 позиций 95% строк доходят до менеджера с готовым ответом или списком кандидатов 25%подставилось само 70%выбор из списка 5%руками Плюс память: если такую же строку этого клиента уже разбирали руками, система предложит прошлый выбор. Но замену на аналог она не подставляет сама никогда — это всегда решение менеджера.
Одна накладная в 107 позиций через боевой конвейер, август 2026 — тот же прогон, что дал 16 секунд. Сама система ставит только точные совпадения по артикулу; остальное показывает менеджеру списком кандидатов.

Акт первый: понять, что написал клиент

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

СТРОКА, КАК ЕЁ ПРИСЛАЛ КЛИЕНТ Амортизатор передний ГАЗ-3102 3102-2905402-03 4 шт по 1100 руб Амортизатор передний тип детали; «передний» раскрываем ещё и в «перед» ГАЗ-3102 модель машины, а не артикул — искать по ней нельзя 3102-2905402-03 артикул; ставим сами только при точном совпадении 4 шт количество; число больше сотни без «шт» — не количество по 1100 руб цена — только по явному признаку, иначе это просто число А ЭТО ВЫБРАСЫВАЕМ Итого в т.ч. НДС 20% нет в наличии Заявка от 12.08 ЕСЛИ ПО ПОЛНОМУ НОМЕРУ ПУСТО 3102-2905402-03 пробуем ещё раз по базовому номеру, без хвоста Так и нашёлся дефект: 19 строк из 107 система искала по обозначению машины. «ВАЗ-2108», «дв-406», «R-13» формально выглядят как код. Увидели на замере — починили.
Строка синтетическая, но собрана из того, что реально приходит. Дефект с обозначением машины нашли замером в августе 2026 и исправили; 19 позиций из 107 — это 18% заявки.

Акт второй: найти кандидатов

Сначала система ищет по артикулу и по номеру производителя — если код совпал точно и бренд в строке не противоречит найденному, товар подставляется сам, без вопросов. Если по полному номеру пусто, идёт второй заход по базовому номеру, без хвостового модификатора: у нас это правило добавило ещё три позиции из шестидесяти пяти — на фоне правок, дающих плюс-минус одну, это много.

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

Акт третий: не дать ошибиться

А вот это — главное, и ради этого абзаца стоило писать статью.

Когда мы первый раз прогнали через обычный поиск позиции, надиктованные клиентом в звонке, вышло красиво: по 28 строкам из 31 что-нибудь нашлось. Девяносто процентов. Радость длилась ровно до момента, когда мы посмотрели, что именно нашлось.

Клиент проситПоиск возвращает
ремень на генераторролик натяжной
стойка стабилизатора передвтулка стабилизатора
фильтр салонный угольныйфильтр масляный
датчик холостого ходадатчик положения дросселя

Пары здесь собирательные: строки из клиентских заявок и записей разговоров мы не публикуем. Явление ровно такое — вместо детали приезжает её соседка по каталогу.

Для менеджера это хуже, чем честное «не найдено». «Не найдено» видно, оно попадает в список на ручной разбор. А правдоподобно неверная позиция уезжает в заказ молча — и всплывает уже на отгрузке, когда клиент звонит и спрашивает, что вы ему прислали.

И тут же поправка к самому себе, потому что она показывает, как это устроено на самом деле. Когда мы разобрали каждый случай поштучно, часть «ошибок» ошибками не оказалась. В одном товар и правда назывался ровно теми словами, которыми спросил клиент, — просто это была другая деталь, у которой то же слово стоит в скобках названия. Поиск был прав, неправ был я. В другом виновата была не логика поиска, а данные: одна и та же марка машины записана в каталоге двумя разными способами, через «е» и через «и», и связать одно с другим было нечем. Обе находки полезные, но записывать их в брак поиска неверно.

Ценность такой системы не в том, что она находит. Находит что-нибудь любой поиск. Ценность в том, что она знает, где остановиться.

Поэтому третий акт — это набор проверок, каждая из которых умеет сказать «нет»:

  • Чужая машина. Если модель названа и в заявке, и в карточке товара, и они не совпадают, кандидат отбрасывается. На одной заявке в 80 строк эта проверка выкинула 79 чужих вариантов. На точных совпадениях по артикулу она не применяется: там источник истины — код, а не название.
  • Чужой тип детали. Клиент просит шкив — в названии товара должен быть шкив. С предохранителем: если под нож попали вообще все кандидаты, список остаётся как был, потому что молчание тут хуже шума.
  • Уценка и б/у. «Без упаковки», «восстановленный», «уценка» опускаются вниз, если клиент про это не писал. Он просил деталь, а не историю её жизни.
  • Аналог — никогда сам. Даже если этого клиента уже спрашивали и он соглашался на замену, система предложит её первой строкой, но не подставит. Замена бренда — коммерческое решение, его принимает человек.

И последнее: цены тянутся отдельно, персональные для контрагента, а не базовые из прайса. Разница между ними бывает заметной. Менеджер в спешке ставит базовую — клиент замечает, и дальше это либо неприятный разговор, либо тихая потеря маржи, если не замечает никто.

Заказ по итогу создаёт менеджер. Не система. Это не осторожность формулировок, а устройство: у кнопки «создать заказ» есть живой человек, и он отвечает за то, что нажал.

Что показали замеры

120–170 мин Руками, если номенклатуру ещё не выучил 26–41 мин Руками, если знаешь номенклатуру наизусть ≈20 мин Через приёмку 16 секунд эта полоска в три пикселя — в том же масштабе Машина: разбор, поиск, подбор и цены 03060 90120150 180 мин 16 секунд — это машинное время внутри тех же двадцати минут работы менеджера, а не вместо них.
Заявка в 107 позиций, август 2026. Замерены здесь только 16 секунд — это машинное время боевого прогона. Три верхние полосы — оценка по нашим наблюдениям, а не хронометраж; живой пилот с секундомером ещё впереди, и мы его проведём.

Теперь цифры, и здесь важно не смешать два разных замера. Боевой конвейер на той самой накладной в 107 позиций: четверть строк система подставила сама — это те, где артикул совпал точно, — семь строк из десяти принесла списком кандидатов на выбор, и всего пять строк из ста семи остались вовсе без ответа. Искать с нуля менеджеру пришлось в пяти случаях из ста семи.

Отдельно мы замерили потолок: если разрешить системе ставить позицию не только по точному артикулу, а по уверенности подбора, без вопросов уходит 68% строк — это прогон на 138 позициях, файл и звонок вместе. Цифра красивая, и ровно поэтому она пока выключена. В том же замере уверенный подбор с высоким счётом ставил на строку без указанного бренда гайку вполне конкретной марки: правдоподобно — и никем не проверено. Порог мы включим тогда, когда наберётся достаточно подтверждений менеджеров, чтобы проверить его на факте, а не на ощущении.

И сразу оговорка, без которой цифра выше врёт. Шестнадцать секунд машинного времени не заменяют двадцать минут работы менеджера — они лежат внутри них. Экономия не в том, что человек ушёл из процесса, а в том, что он перестал искать и начал проверять. Это разная работа: искать утомительно и медленно, проверять — быстро.

Что мерили и что откатили

Дальше самая полезная часть, потому что по ней видно, врём мы или нет.

СВЕРКА С ЭТАЛОННОЙ ЗАЯВКОЙ, КОТОРУЮ СОБРАЛ ВРУЧНУЮ МЕНЕДЖЕР — 65 ПОЗИЦИЙ было — наша первая версия стало Нужный товар был среди предложенных вариантов Попал в первые три варианта То же самое, но в рублях Наши собственные торговые марки 60%52% 64%54% 80%69% 83%82% +20+17 +19+28 02550 75100% А ЭТО СВЕРКА С ТЕМ, ЧТО РЕАЛЬНО ОТГРУЗИЛИ ПО ЗАЯВКЕ — 10 ПОЗИЦИЙ 10 из 10 — были среди предложенных 10 из 10 — в первой тройке 9 из 10 — подставились сами и верно в деньгах — 100%
Мерили долю позиций, где нужный товар оказался среди предложенных вариантов, — а не долю верных ответов. Рост считается относительно нашей же первой версии, не чужого продукта. Десять отгруженных позиций — маленькая выборка, это замер конкретной заявки, а не статистика по всем клиентам.

Первый замер — сверка с заявкой, которую до этого менеджер собрал вручную. У нас есть эталон: 65 позиций, каждая выбрана человеком. Вопрос простой — оказался ли нужный товар среди тех вариантов, что система показала. За одну сессию доработок — таблица в нашем журнале так и подписана, «было утром / стало» — эта доля выросла с 60% до 80%, попадание в первые три варианта — с 52% до 69%. Позиции, которые не попали, не теряются: они уходят в очередь на ручной разбор со сроком в четыре часа.

Второй замер интереснее, потому что сравнивает не с ожиданием, а с фактом. Мы взяли заявку, по которой уже прошла отгрузка, и посмотрели, что система предлагала по каждой отгруженной позиции. Все десять оказались среди предложенных, все десять — в первой тройке, девять из десяти система подставила сама и верно. Выборка крошечная, выводов на ней не построишь. Но это единственный замер, где сравнение идёт с реальностью, а не с чужим мнением о ней. И сразу оговорка, без которой цифра льстит: в том файле была колонка с артикулом, то есть работал точный путь — а он почти безошибочен. Там, где артикулы зашиты в хвост названия, доля ниже, и это как раз те 80% выше.

ВТОРОЙ ВЗГЛЯД — 59 СПОРНЫХ СТРОК у 63% строк верхний вариант сменился ИЗ НИХ 47 СВЕРИЛИ ВРУЧНУЮ 6 хуже 14 без разницы 27 лучше ЧЕГО ЭТО СТОИТ ПО ВРЕМЕНИ на видеокарте 71 мс на обычном процессоре 794 мс ×11 разница на одну строку Три доработки, которые «по логике должны были улучшить», замер завернул. Окно кандидатов 5 → 20: нужный товар нашёлся у 49 позиций из 65 вместо прежних 52. Откатили.
Решения принимали по замерам, а не по логике. Выборки маленькие и названы прямо: верхний вариант сменился у 37 строк из 59 спорных, а вручную сверили 47 изменившихся, август 2026. Миллисекунды здесь не для хвастовства, а чтобы было видно, что замеряли всё подряд.

Замер поймал и наши собственные ошибки. Девятнадцать строк из ста семи — восемнадцать процентов заявки — система подбирала по «ГАЗ-3102», приняв обозначение машины за артикул. Ни один из нас этого не заметил бы, читая выдачу глазами: результаты выглядели правдоподобно.

И симметричная история: за один день три правки, выглядевшие улучшением, результат ухудшили. Самая обидная — расширить окно кандидатов с пяти до двадцати. Логика железная: больше вариантов, выше шанс, что нужный среди них. По факту покрытие упало — нужный товар нашёлся у 49 позиций из 65 вместо прежних 52, — потому что вместе с нужным приехал шум, а пул кандидатов не резиновый. Эту правку откатили целиком, две другие переделали. Поймал их один и тот же эталон, прогнанный после каждой.

Собственно, это и есть весь секрет: не модель, не архитектура, а привычка после каждого изменения прогонять один и тот же эталон. Мы про это уже писали в статье про дообучение — экзамен важнее учебника, и здесь ровно то же самое.

Голос: что уже проверено, а что нет

Голосового канала в кабинете пока нет. В интерфейсе есть заготовка — тип источника и кнопка с микрофоном, — но приём звонков не включён, и обещать его как работающую функцию было бы враньём.

Что есть: рабочий прототип распознавания вне продукта, и он уже замерен на настоящем звонке. Разговор длиной 50 минут 45 секунд превратился в 34 строки, из которых 31 оказалась настоящей позицией заказа: три строки система отбросила как служебные: это были реплики по ходу разговора, а не позиции заказа. Дальше замер тот же прототипный, что дал 68% на потолке: 64% позиций подобрались уверенно, 22% ушли в список на выбор, 12% — на ручной разбор. Причём звонок был телефонного качества, то есть в худших возможных условиях.

Дальше эти строки должны пойти по тому же конвейеру, что файл или письмо, — так это спроектировано. Но честно: боевым конвейером голосовые строки мы ещё не прогоняли, замер сделан отдельной прототипной связкой. Непроверенных мест два — стыковка с кабинетом и поведение боевого подбора на тексте после распознавания.

ПРОТОТИП, НЕ В КАБИНЕТЕ ЗВОНОК КЛИЕНТА — 50 МИНУТ 45 СЕКУНД РАСПОЗНАВАНИЕ РЕЧИ — ОБЫЧНЫЙ ПРОЦЕССОР, БЕЗ ВИДЕОКАРТЫ речь расшифровывается в 12 раз быстрее, чем длится разговор режем записьпо паузам распознаём речьоткрытой моделью расставляемзнаки препинания вынимаемпозиции заказа дальше — общийконвейер приёмки 34 строки → 31 позиция заказа 64%само 22%один клик 12%руками Расшифровка, извлечение позиций и подбор — на своём железе; записи разговоров наружу не уходят.
Один реальный звонок, август 2026. Разговор записан в рамках обычной практики записи телефонных разговоров и обработан локально. Канал в кабинете не включён; проценты округлены и в сумме не дают сто.

Отдельно про железо, потому что это первый вопрос, который задают. Распознавание речи идёт примерно в двенадцать раз быстрее, чем длится разговор, на обычном процессоре — видеокарта для него не нужна. А вот подбор она ускоряет сильно, и здесь надо сказать прямо: те самые шестнадцать секунд на 107 позиций получены на видеокартах. На обычном процессоре второй проход по спорным строкам идёт примерно в одиннадцать раз медленнее. Без карты система работает, просто заявка разбирается заметно дольше — это развилка сметы, а не условие запуска. И всё это работает на своём железе: заявки и записи разговоров во внешние сервисы не передаются. Подробнее про то, когда локальная модель оправдана, а когда нет, — в отдельной статье.

Вопросы, которые задают первыми

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

А если номенклатура грязная? Она у всех грязная, и система рассчитана именно на это — грязь приходит с обеих сторон, и из заявки клиента, и из справочника. Предварительно вычищать каталог не надо. Чужие артикулы, которых у вас нет, попадут в «не найдено», и этот список сам по себе полезен: видно, что у вас спрашивают и чего нет.

А если менеджеры не станут пользоваться? Приёмка встроена в тот же экран, где они уже работают, а не отдельная программа с новым паролем. Она отдаёт черновик заказа, который менеджер правит, а не приказ, который надо исполнить. И снимает самую нелюбимую часть работы — вбивание, а не разговор с клиентом. Начинать можно с одного менеджера и одного канала.

Что с заявками, которые не разобрались? Не теряются. Очередь со сроком в четыре часа, менеджер добирает руками, каждая правка запоминается: в следующий раз для этого клиента такая строка предложится сразу. Заявку нельзя удалить — только закрыть с указанием причины, чтобы история решений оставалась прослеживаемой.

Это переносится на другой бизнес

Задача универсальнее, чем кажется. Она звучит так: клиент присылает не то, что вы ждёте, а сотрудник руками сверяет присланное с вашей номенклатурой. Автозапчасти, метизы, электрика, стройматериалы, расходники, медизделия — везде, где у товара есть артикул и сорок способов его назвать, происходит одно и то же.

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

Поэтому мы не называем проценты заранее. Конвейер переносится, цифры — нет: они зависят от вашего каталога и от того, как пишут ваши клиенты. Первым шагом всегда идёт замер на ваших данных.

Когда вам это не нужно

  • Клиенты присылают заявки в вашей форме и уже с артикулами — тогда хватит обычного импорта.
  • В заявке пять-десять строк, и таких пара в день. Менеджер справится быстрее, чем вы окупите работу.
  • Номенклатура небольшая и стабильная, все её помнят.
  • Ассортимент почти не меняется, а покупатели постоянные — дешевле один раз свести таблицу соответствия их кодов вашим.
  • Некому первые недели подтверждать спорные строки. Система разгоняется на решениях менеджеров: чем больше подтверждений, тем меньше вопросов она задаёт. Без живого человека в начале она так и останется на стартовом уровне — и это единственное, что вам придётся вложить обязательно.

Что пока не сделано

Голосовой канал в кабинете не включён. Фото и сканы не распознаём. Из мессенджеров напрямую не принимаем — список текстом надо вставить руками. Разбор идёт сразу, пока менеджер ждёт: очередь для фоновой обработки спроектирована, но не запущена. Список честный ровно потому, что по нему нас легко проверить: откройте кабинет и посмотрите.

От чего зависит объём работы

Цену такой системы нельзя назвать по телефону, и любой, кто называет, гадает. Вот развилки, каждую из которых вы можете прикинуть у себя сами:

  • насколько чиста номенклатура и есть ли в ней артикулы и номера производителя;
  • сколько каналов включаем: файл дешевле почты, почта дешевле голоса;
  • есть ли история разобранных заявок — память может стартовать с накопленного, а может с нуля;
  • нужна ли видеокарта или хватит обычного сервера;
  • берём пилотом один канал и одного менеджера или сразу весь поток.

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

Пришлите свою самую грязную заявку

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

Про данные: подписываем NDA до того, как вы что-то пришлёте; персональные цены и контакты клиентов не нужны — достаточно наименований, артикулов и количеств; после разбора файлы удаляем и в обучение ничего не берём.