Оптовую закупку оформляет не покупатель, а снабженец. Он работает не в браузере: у него открыта учётная система, в ней ведётся заявка, и заявка эта - на тридцать, сорок, шестьдесят позиций. Чтобы разместить её в интернет-магазине, ему предлагают найти каждую позицию в каталоге и нажать "в корзину" - сорок раз подряд.
Так заказы и теряются. Снабженец либо звонит менеджеру и диктует список по телефону, либо отправляет файл по электронной почте - и менеджер вручную вводит те же сорок строк, уже за него. Сайт в этой цепочке не участвует вовсе: он проиграл конкуренцию обычной почте.
Дальше начинается вторая часть работы, о которой магазины забывают. Заявку надо согласовать внутри компании клиента: показать руководителю смету, отдать в тендерный отдел характеристики оборудования, передать логисту габариты упаковки. Всё это снова файлы, и все эти файлы кто-то собирает вручную.
Требовалось, чтобы сайт разговаривал со снабженцем на его языке - языке таблиц и файлов - и чтобы на всём пути от прайс-листа до согласованного предложения ему ни разу не пришлось ничего перебивать.
Решение
Excel-инструменты закрывают весь круг работы снабженца - и круг этот замкнут.
Заявка приходит на сайт файлом и становится корзиной. Корзина выгружается обратно файлом того же формата - его правят в Excel и загружают снова. Каталог сам отдаёт бланк заявки по тому фильтру, который покупатель отобрал на экране. А из карточки товара одним нажатием собирается коммерческое предложение в PDF - то, что уйдёт на согласование.
Заявка становится корзиной
Формат намеренно простой - три столбца: артикул, наименование, количество. Такую таблицу выгружает любая учётная система, и её же можно собрать в Excel за минуту.
Файл принимается целиком - до 10 МБ, в форматах xlsx и xls. Строка заголовка распознаётся и пропускается, так что выгрузка из 1С загружается как есть, без подготовки. По каждой строке система отвечает: всего строк, найдено товаров, добавлено в корзину, ошибки. Если строка не прошла, покупатель видит её номер, артикул и причину - и точно знает, что поправить.
Формат объясняется прямо на странице загрузки: "Вы можете прикрепить запрос/смету в формате Excel", "Товары должны быть представлены в табличной форме со следующей структурой: первый столбец - артикул товара, второй - наименование, третий - количество".
Как строка файла находит товар
Распознавание двухступенчатое: сначала точный артикул, затем точное наименование. Порядок не случаен - артикул надёжнее, он и проверяется первым.
Вторая ступень - не перестраховка. Из 13 125 позиций каталога артикул заполнен у 12 550, а остальные 575 ведутся без него: найти их можно только по названию. Без поиска по наименованию эти позиции не загрузились бы никогда.
Принципиально, что совпадение требуется точное. Магазин не подставляет "похожий товар": снабженец получает либо ровно то, что заказал, либо явную строку в отчёте с причиной. В закупке оборудования это важнее удобства - подмена артикула обнаружилась бы уже при отгрузке.
Дальше каждая найденная позиция проверяется на доступность, и проверка эта персональная: есть ли у этого покупателя цена на товар и есть ли остаток на его складах. Что нельзя купить сейчас, не пропадает - позиция видна, и её можно заказать предзаказом. Как устроены два контура корзины, описано в отдельном материале - "Корзина с двумя контурами".
Один файл - две корзины
Здесь и проходит главная граница. Цены в файле нет вообще - формат её не предусматривает. Цену назначает сайт, по прайс-листу того, кто загрузил файл.
Это не теоретическая тонкость. Выше - реальная заявка на оснащение шиномонтажной мастерской, четыре позиции с рабочего сервера. Розничному клиенту она обходится примерно в 480 тысяч ₽, дилеру - примерно в 370 тысяч. Файл один и тот же, разница - больше 110 тысяч ₽ на одном файле.
Сегментов покупателей девятнадцать, и каждый получит из этого файла свою корзину. Как рассчитываются персональные цены, описано в материале "Персональные цены для 19 сегментов покупателей".
Следствие важно и для безопасности: раз цена в файл не входит, её нельзя из файла и подменить. Правка суммы в Excel на цену заказа не влияет никак.
Каталог отдаёт бланк заявки
Обратная задача возникает не реже: снабженец отобрал в каталоге нужное - и ему нужен этот список файлом.
Выгрузка не строит отбор заново, а берёт фильтр, уже собранный каталогом. Что покупатель видит на экране, то он и получает файлом: расхождение между экраном и выгрузкой невозможно. Можно забрать текущую выборку со всеми фильтрами, можно раздел целиком, можно посмотреть список прямо в браузере. Форматы - xlsx и csv.
Ключевое здесь - столбцы. Бланк выходит ровно в том формате, который принимает загрузка: артикул, наименование, количество. Снабженец проставляет количества и отправляет файл обратно на сайт. Так круг и замыкается: выгрузка корзины даёт файл того же формата, его правят в Excel и загружают снова - без единого преобразования.
Отдельно устроены персональные прайс-листы: свой файл для каждого сегмента готовит 1С, и покупатель скачивает его из личного кабинета. У коммерческой политики единственный источник истины - учётная система, а не сайт.
Предложение на согласование
Заявку надо защитить внутри компании клиента, и для этого нужен документ.
Коммерческое предложение собирается из карточки товара одним нажатием - в PDF, на фирменном бланке, с фотографией и артикулом. Что войдёт в файл, решает покупатель: четыре блока отмечаются галочками. Снабженцу нужны технические характеристики, логисту - габариты и вес упаковки для расчёта доставки, тендерному отделу - описание и комплектация.
Источников у предложения два, а кнопка одна. Если менеджеры подготовили в 1С официальный утверждённый файл - покупатель получит именно его. Если нет - предложение соберётся само, из тех же данных, что показаны на карточке. Пустой выдачи не бывает ни при каком состоянии данных.
Как это устроено внутри
Общая картина - на схеме: четыре инструмента опираются на общий слой распознавания, цены и остатка.
| Решение | Как сделано |
|---|---|
| Формат файла | Три столбца по позиции, без привязки к заголовкам: файл из любой учётной системы загружается без шаблона. Строка "Артикул" в первой ячейке распознаётся и пропускается |
| Разбор файла | Промышленная библиотека работы с электронными таблицами; принимаются xlsx и xls, размер ограничен 10 МБ, читается первый лист |
| Распознавание | Точное совпадение по артикулу, затем точное совпадение по наименованию. Подстановок "похожего" нет: либо товар, либо строка в отчёте с причиной |
| Цена | Из файла не читается никогда - берётся из собственного прайс-слоя по сегменту покупателя (более 200 тысяч готовых персональных цен). Подменить цену через файл невозможно |
| Доступность | Критерий - есть цена и есть остаток на складах сегмента покупателя; склады подбираются по типу контрагента, для гостя - набор по умолчанию |
| Отчёт | Счётчики "всего / найдено / добавлено" плюс список ошибок с номером строки и причиной; список ошибок ограничен по длине, чтобы отчёт оставался читаемым |
| Замкнутый формат | Выгрузка корзины пишет тот же артикул, по которому ищет загрузка, и ту же тройку столбцов - файл проходит цикл "сайт - Excel - сайт" без преобразований |
| Выгрузка каталога | Переиспользует фильтр, собранный компонентом каталога, и тот же построитель файла, что и выгрузка корзины: один формат на оба инструмента |
| Предложение в PDF | Сборка на фирменном бланке из данных карточки; приоритет у утверждённого файла из 1С, состав блоков задаёт покупатель |
| Прайс-листы | Готовит 1С - по файлу на сегмент; сайт их не генерирует, а выдаёт авторизованному покупателю файл его сегмента |
Два решения, которые обычно вызывают вопросы у коллег.
Почему цена не читается из файла. Казалось бы, снабженец выгрузил заявку из своей системы вместе с ценами - логично их учесть. Но цена в его файле - это цена вчерашнего прайс-листа или вовсе прошлогоднего договора. Принять её значит либо продать по устаревшей цене, либо открыть очевидную уязвимость: достаточно исправить число в Excel, чтобы купить дешевле. Поэтому файл несёт только намерение - что и сколько, - а цену всегда назначает сайт, по действующему прайс-листу этого покупателя. Это то же правило, по которому работает сверка корзины.
Почему выгрузка не строит свой запрос. Умный фильтр каталога собирает отбор внутри себя, из десятков параметров - раздел, характеристики, наличие, распродажа. Повторить эту логику в отдельном обработчике выгрузки означало бы завести вторую реализацию того же отбора, и рано или поздно они разошлись бы: на экране одно, в файле другое. Вместо этого выгрузка получает уже готовый фильтр от самого каталога. Один отбор - два способа его показать.
Что это дало бизнесу
| Раньше | Стало |
|---|---|
| Заявку на 40 позиций снабженец вводил в браузере вручную - или диктовал менеджеру по телефону | Файл из учётной системы становится корзиной за минуту |
| Ошибка ввода обнаруживалась уже при отгрузке | Отчёт по каждой строке: всего, найдено, добавлено, ошибки - с номером строки и причиной |
| Прайс-лист запрашивали у менеджера | Персональный прайс-лист сегмента скачивается из личного кабинета |
| Отобрал в каталоге - и повторял тот же список в своей системе | Каталог отдаёт бланк заявки ровно по фильтру на экране |
| Характеристики и габариты для согласования собирал менеджер вручную | Предложение в PDF собирается нажатием кнопки; состав блоков выбирает покупатель |
| Правка заявки - переписка "пришлите новый список" | Корзина выгружается в том же формате: правки в Excel - и файл снова на сайте |
В цифрах
| Показатель | Значение |
|---|---|
| Столбцов в файле заявки | 3 - артикул, наименование, количество |
| Предельный размер файла | 10 МБ; форматы xlsx и xls |
| Позиций в каталоге | 13 125; артикул заполнен у 12 550, ещё 575 находятся по названию |
| Сегментов покупателей | 19 - один файл даёт 19 разных корзин |
| Готовых персональных цен | более 200 тысяч - ими оценивается каждая строка файла |
| Блоков предложения на выбор | 4 - описание, комплектация, характеристики, упаковка |
| Одна заявка из четырёх позиций | около 480 тысяч ₽ для розницы, около 370 тысяч для дилера |
Excel-инструменты - часть большой B2B-платформы: каталог, дилерский кабинет и двусторонний обмен с 1С. Что вошло в проект целиком - в кейсе B2B e-commerce платформы.



