Документация › Интеграции › МойСклад
МойСклад: наличие и цены в ответах бота
Клиент спрашивает «есть ли такой товар и почём», бот в этот момент смотрит ваш МойСклад и отвечает настоящим остатком и настоящей ценой. Прайс в промпте держать не надо, дублировать товары никуда не надо.
⏱ 12 мин · 👤 для владельца магазина или сервиса · 🟢 live
За 30 секунд:
- Подключается функцией «Своя интеграция по API» в продвинутом режиме. Писать код не нужно, всё заполняется в полях.
- От вас нужен токен доступа из аккаунта МойСклад.
- Маппинг ответа обязателен: без него бот получит сотню полей на каждый товар и начнёт путаться.
- Цены в МойСкладе хранятся в копейках: 4 900 ₸ лежит как
490000. Не предупредить бота значит назвать клиенту сумму в сто раз больше.
Что получится в итоге
Клиент: Здравствуйте, есть шумоизоляция StP Аэро?
Бот: Да, есть. StP Аэро, 12 листов на складе, 4 900 ₸ за лист.
Возьмёте? Могу записать на установку.Бот не хранит ваш прайс у себя. Он спрашивает МойСклад в момент разговора, поэтому цена и остаток всегда те же, что у вас в учёте. Подняли цену в МойСкладе, бот называет новую с того же дня.
Шаг 1. Токен доступа
Токен это длинная строка, которая заменяет логин с паролем. Создаётся в настройках вашего аккаунта МойСклад, в разделе про доступ к API.
⚠️ Прочитайте до того, как нажмёте кнопку. В МойСкладе на одного пользователя живёт ровно один токен. Выпустили новый, старый умер в ту же секунду. Если этим токеном уже пользуется ваш сайт, касса или 1С, они отвалятся.Заведите для бота отдельного пользователя с правами только на просмотр справочников и остатков и выпускайте токен ему. Менять документы и отгружать товар боту не нужно.
Если удобнее получить токен запросом: POST https://api.moysklad.ru/api/remap/1.2/security/token с обычной авторизацией логином и паролем, в ответ приходит токен.
Шаг 2. Создайте функцию в продвинутом режиме
Раздел Функции → создать → «Своя интеграция по API» → включить продвинутый режим. Обычный режим не даёт ни параметров запроса, ни маппинга ответа, а без них здесь не обойтись.
Основное:
| Поле | Значение |
|---|---|
| Название | check_stock |
| Описание для бота | «Проверить наличие и цену товара на складе. Вызывай, когда клиент спрашивает про конкретный товар, его цену или наличие» |
| Метод | GET |
| URL | https://api.moysklad.ru/api/remap/1.2/entity/assortment |
Описание читает не человек, а бот. По нему он решает, звать функцию или нет, так что пишите словами клиента: «спрашивает про товар, цену, наличие».
Параметры запроса:
| Ключ | Значение |
|---|---|
search | {{товар}} |
limit | 5 |
{{товар}} это подстановка: бот сам положит туда название из вопроса клиента. limit держите небольшим: пяти позиций хватает, а сотня забьёт боту контекст.
Параметр функции (раздел «Параметры»):
| Имя | Тип | Описание для ИИ |
|---|---|---|
товар | строка | Название товара из вопроса клиента, как он его назвал |
Авторизация: тип Bearer, в значение ваш токен. Он хранится зашифрованным и вырезается из логов вместе с остальными заголовками авторизации. Адрес проверяется на безопасность, см. Вебхуки и безопасность.
Шаг 3. Маппинг ответа. Без него не заработает как надо
МойСклад отдаёт на каждый товар под сотню полей: ссылки, идентификаторы, штрихкоды, налоги, даты правок, атрибуты. Бот всё это видит, платит за это токенами и хуже соображает.
В настройках функции откройте «Маппинг ответа» и включите «Включить маппинг ответа», а следом тумблер «Поиск по запросу клиента».
Дальше три поля:
| Поле в интерфейсе | Что вписать | Что это значит |
|---|---|---|
| 1. Где в ответе лежит список товаров | rows | МойСклад кладёт товары в массив rows |
| 2. По какому полю искать | name | искать по названию товара |
| 3. Откуда AI возьмёт запрос клиента | товар | тот самый параметр из шага 2 |
Какие поля передавать AI:
| Путь | Короткое имя |
|---|---|
rows[*].name | название |
rows[*].salePrices[0].value | цена |
rows[*].stock | остаток |
⚠️ Звёздочка обязательна.rows[*].nameозначает «имя у каждого товара в списке». Если написатьrows.nameбез[*], поле окажется пустым, потому чтоrowsэто список, а не один товар. На этом спотыкаются чаще всего.
salePrices[0] это первая цена продажи. Если у вас несколько типов цен (розница, опт, для своих), нужный индекс подберите опытным путём, начните с нуля.
Короткие имена справа необязательны, но с ними бот тратит меньше токенов и реже путается.
Что бот получит на выходе:
{
"matches": [
{ "название": "StP Аэро", "цена": 490000, "остаток": 12 }
],
"count": 1
}Аккуратный список вместо простыни. Если совпадений окажется слишком много, ответ обрежется по границе товара и бот получит подсказку попросить клиента уточнить запрос. Максимальную длину ответа можно поднять там же, по умолчанию 8000 символов.
Про остаток. Рядом с stock МойСклад отдаёт reserve (зарезервировано), inTransit (в пути) и quantity (доступно с учётом резерва). Если у вас часто бронируют товар, берите rows[*].quantity, оно честнее. Если складов несколько и нужен конкретный, добавьте в параметры запроса stockStore со ссылкой на нужный склад.
Шаг 4. Скажите боту про копейки
Это единственное место, где ошибаются все.
В МойСкладе все суммы хранятся в копейках. Цена 4 900 ₸ лежит в базе как 490000. Не сказать об этом значит услышать от бота «четыреста девяносто тысяч тенге», и клиент уйдёт молча, даже не написав в ответ.
Допишите в системный промпт:
Цены из функции check_stock приходят в копейках.
Перед тем как назвать цену клиенту, раздели на 100.Шаг 5. Что говорить, когда товара нет
Ответ «нет в наличии» заканчивает разговор. Дайте боту продолжение, отдельной строкой в промпте:
Если товара нет в наличии, не заканчивай на этом.
Предложи похожий товар из того же ответа функции
или спроси, записать ли клиента, когда товар придёт.Так вопрос про отсутствующую позицию превращается в заявку.
Шаг 6. Проверьте до того, как включите бота клиентам
Откройте тест-чат и спросите про товар, цену которого знаете наизусть.
Что смотреть:
- цена совпадает с той, что у вас в МойСкладе (если больше в сто раз, вернитесь к шагу 4);
- остаток совпадает с реальным;
- бот нашёл товар, когда вы назвали его так, как называют клиенты, а не так, как он записан в учёте.
Третье проверьте отдельно. В учёте товар может лежать как «Шумоизоляция StP Aero 8мм», а клиент напишет «стп аэро». Поиск нечувствителен к регистру и ищет вхождение, но если расхождение сильное, добавьте в описание параметра примеры народных названий.
Что ещё можно, кроме остатков
Тем же способом бот дотягивается до любой части вашего МойСклада, меняется только адрес запроса:
| Задача | Что дёргать |
|---|---|
| Наличие и цены | справочник ассортимента |
| Остатки по конкретному складу | отчёт по остаткам |
| Проверить, есть ли такой покупатель | справочник контрагентов |
| Создать заказ прямо из переписки | создание заказа покупателя, метод POST |
Заказы из переписки настраиваются так же, только методом POST и с телом запроса. Тогда пользователю, под которым выпущен токен, нужны права на создание документов.
Если не работает
| Симптом | Причина | Что делать |
|---|---|---|
| Все поля пустые | В путях забыта звёздочка | rows[*].name, а не rows.name. Шаг 3 |
| Цена в сто раз больше | Копейки | Шаг 4 |
| Бот говорит, что не смог проверить | Токен просрочен или перевыпущен под другую программу | Выпустите новый и вставьте в функцию. Помните: старый при этом умрёт |
| Бот находит не тот товар | Клиент называет товар иначе, чем он записан в учёте | Добавьте в описание параметра примеры народных названий |
| Ответ обрезается, бот просит уточнить | Слишком много совпадений | Уменьшите limit или поднимите максимальную длину ответа |
| Функция долго думает | МойСклад отвечает медленно | Поднимите таймаут функции, повторы при сбоях уже встроены, см. Кастомные вебхуки |
| Полей маппинга нет на экране | Функция в обычном режиме | Включите продвинутый режим, шаг 2 |
Подробный разбор ошибок в статье Функция не вызывается или падает.
Простыми словами
У вас товары и цены живут в МойСкладе. Раньше, чтобы бот про них знал, пришлось бы переписывать весь прайс к нему в настройки и обновлять руками каждый раз.
Теперь бот спрашивает ваш МойСклад сам, посреди разговора с клиентом. Человек пишет «есть такое?», бот за секунду смотрит ваш учёт и отвечает честной цифрой: столько-то штук, столько-то тенге. Меняете цену у себя, бот говорит новую, ничего поддерживать не надо.
Чтобы это включить, нужен один ключ из вашего аккаунта МойСклад и минут двадцать настройки по шагам выше.
Три вещи, которые нельзя пропустить. Первая: ключ в МойСкладе выдаётся один на человека, и новый убивает старый, поэтому заводите для бота отдельного пользователя. Вторая: цены там лежат в копейках, и об этом боту надо сказать отдельной строчкой. Третья: в путях к полям нужна звёздочка, иначе бот получит пустоту.
Проверьте всё на одном знакомом товаре в тест-чате, прежде чем включать бота клиентам.
Дальше: → Вебхуки и безопасность
Связано: Функции · Кастомные вебхуки · Тест-чат
Не получилось? → Функция не вызывается / падает