Торговля
Февраль 2026
Магазин продаёт технику через закрытый Telegram-канал, товар берёт у поставщика, который тоже публикует цены в Telegram.
- Прайс собирался руками: владелец каждый день переписывал пост «в наличии», брал цену поставщика, добавлял наценку, убирал проданное.
- Поставщик правит около 40 постов с оптовыми ценами несколько раз в сутки, всего 1 261 позиция. Каждая правка означала пересчёт вручную.
- В прайсе висели проданные позиции и старые цены: клиент писал по товару, которого уже нет.
- Остатки жили в МойСклад, наценки в голове, прайс в Telegram. Три источника, ни один не главный.
- Названия у поставщика и в учёте не совпадают: «iPhone 17 Pro 256 Silver» у одного и «Iphone 17 pro 256gb silver eSIM» у другого.
Чтение цен поставщика. Канал поставщика приватный, историю через Bot API не прочитать. Поэтому бот ловит каждую публикацию и каждую правку поста и хранит последнюю версию. Из 40 постов собирается каталог на 1 261 позицию.
Сверка с МойСклад каждые 90 секунд. Бот запрашивает остатки склада «в наличии» и сравнивает со снимком: что появилось, что закончилось, что переименовали. Транзитный склад «под заказ» в прайс не попадает.
Сопоставление позиций без языковой модели. Структурный ключ (модель, цвет, память, SIM, ремешок) плюс нечёткое сравнение. Однозначное совпадение привязывается само, спорное приходит владельцу вопросом с вариантами ответа. Языковую модель здесь не использовали сознательно: результат должен быть предсказуемым и не выдумывать совпадений. Привязка держится на идентификаторе товара, а не на названии, поэтому переименование карточки ничего не ломает.
Цена с наценкой. Наценка ищется по цепочке: позиция, затем модель, затем категория. Цена = цена поставщика + наценка, с округлением до 100 ₽. Если наценки нет, бот спрашивает и запоминает ответ на позицию, модель или категорию. 12 категорий перенесли из старой ручной схемы.
Публикация. Команда /run показывает превью и отчёт: что обновилось, что без свежей цены, что ждёт ответа. Новый пост выходит только по кнопке, дальше бот сам правит уже опубликованный пост при любом изменении остатков.
Ключевое архитектурное решение. Первая версия строила всё вокруг поста в канале. Выяснилось, что Bot API не сообщает о правках собственных постов. Переделали: источник правды теперь учёт в МойСклад, а пост только отображает его.
Что ещё предусмотрели:
Нет свежей цены от поставщика: остаётся последняя известная с пометкой в отчёте. Без этого утренний пост терял бы 30 позиций из 53.
Один активный пост в канале, пустой прайс не публикуется, повторная правка без изменений не считается ошибкой.
Приход и продажа из бота сразу уходят в МойСклад, прайс перерисовывается.
Карточка позиции (/stock): сменить привязку, наценку, поставить ручную цену, скрыть из прайса.
Самоконтроль: /status, отметка живости в логе раз в час, одно уведомление при недоступности МойСклад дольше 10 минут и одно о восстановлении.
Роли и журнал действий, посторонних бот игнорирует (/users, /adduser, /deluser).

Синхронизация с МойСклад каждые 90 секунд: проданный товар исчезает из прайса в течение пары минут вместо «висит до ручной правки».
Правка цены поставщика попадает в прайс в следующем цикле, до 90 секунд.
74% позиций привязаны автоматически: 35 из 47 позиций склада без участия человека, остальное решается одной кнопкой в боте.
1 261 позиция поставщика в 40 постах обрабатывается без ручного пересчёта.
Обновление прайса: было вручную раз в день, стало автоматически при каждом изменении.
Запуск за 10 дней от постановки задачи до работы в продакшене.
У владельца осталось три действия: ответить на вопрос о новой позиции, назвать наценку и нажать «Опубликовать».
