Аудит МойСклад — это системный журнал, куда сервис пишет каждое создание, изменение и удаление сущности. Через JSON API 1.2 его можно читать программно: получать список контекстов событий, разворачивать конкретное событие в набор изменённых полей и связывать правки с сотрудником, документом и временем.
Что такое аудит и зачем читать его через API
Аудит в МойСклад — это неизменяемый журнал действий пользователей и интеграций. Каждое событие фиксирует кто, когда и что сделал: создал товар, изменил цену, удалил заказ, провёл отгрузку. В интерфейсе журнал доступен в разделе «Аудит», а через JSON API 1.2 те же данные читаются программно.
Типичные задачи, которые закрывает чтение аудита из внешней системы:
- восстановить, кто и когда поменял остаток, цену или статус документа;
- построить отчёт «изменения за сутки» для контроля менеджеров;
- инкрементально забирать правки в хранилище (DWH) без выгрузки всех сущностей;
- расследовать инциденты — например, почему заказ вдруг стал непроведённым.
Эндпоинты аудита: контексты и события
Базовый адрес API — https://api.moysklad.ru/api/remap/1.2. Аудит устроен двухуровнево: сначала вы получаете список контекстов события (event context), затем разворачиваете конкретный контекст в набор событий по полям.
| Метод | Назначение |
|---|---|
GET /audit | Список всех контекстов событий по аккаунту |
GET /audit/{id}/events | События (изменения полей) внутри контекста |
GET /entity/{type}/{id}/audit | Контексты событий по конкретной сущности |
Запрос списка контекстов:
GET /api/remap/1.2/audit?limit=100&order=moment,desc
Каждый элемент rows — это контекст с полями moment (время), entityType (тип сущности), eventType (create/update/delete), uid сотрудника и ссылкой на events.
Типы событий и структура контекста
Поле eventType в контексте описывает характер действия. Наиболее частые значения:
| eventType | Смысл |
|---|---|
create | Создание сущности |
update | Изменение полей |
delete | Удаление в корзину / безвозвратно |
put_to_recycle_bin | Перемещение в корзину |
registration, login | Служебные события аккаунта |
Дополнительно в контексте приходят objectCount (сколько объектов затронуто — важно для массовых операций), source (например, api или jsonApi) и supportAccess. Именно по source удобно отделять правки, сделанные вашей интеграцией, от ручных изменений в интерфейсе.
Разворачиваем изменения полей (diff)
Сам контекст не содержит, какие именно поля изменились. Чтобы получить diff, обратитесь к событиям контекста:
GET /api/remap/1.2/audit/{contextId}/events
В ответе rows — список изменённых полей, каждое со структурой:
entityTypeиentityHref— на какую сущность указывает событие;name— человекочитаемое имя сущности на момент правки;diff— объект вида{ "поле": { "oldValue": ..., "newValue": ... } }.
Например, при смене статуса заказа в diff увидите state со старым и новым значением, а при правке цены — соответствующий salePrice. Это позволяет собрать полноценную ленту «поле: было → стало» без сравнения снимков сущности вручную.
diff при этом приходит агрегированным. Проверяйте objectCount, прежде чем интерпретировать событие как правку одной записи.Фильтрация журнала по дате, сотруднику и типу
Журнал за всё время читать бессмысленно — его фильтруют параметром filter и сортируют order. Основные фильтры:
| Фильтр | Пример |
|---|---|
| По времени | filter=moment>=2026-07-01 00:00:00 |
| По сотруднику | filter=employee=https://api.moysklad.ru/api/remap/1.2/entity/employee/{id} |
| По типу события | filter=eventType=update |
| По типу сущности | filter=entityType=customerorder |
Формат даты в фильтрах — yyyy-MM-dd HH:mm:ss, пробел в URL кодируется как %20. Несколько условий по одному полю задаются повторением параметра filter и объединяются логикой сервиса (например, диапазон дат — два условия с >= и <=).
Инкрементальная выгрузка правок
Для регулярной синхронизации в хранилище используйте связку «фильтр по времени + сортировка + пагинация». Алгоритм:
- сохраните метку последней успешной выгрузки
lastMoment; - запросите
GET /audit?filter=moment>={lastMoment}&order=moment,asc&limit=1000; - идите по страницам через
offsetили ссылкуmeta.nextHref; - для нужных контекстов подтяните
/eventsи обновитеlastMomentвременем последнего обработанного события.
Сортировка по возрастанию moment гарантирует, что вы не пропустите события при разбивке на страницы. Чтобы не упереться в лимиты API, держите паузу между запросами и обрабатывайте события пачками.
Итог
Аудит через JSON API 1.2 — это два уровня чтения: список контекстов GET /audit и разворот в diff-события GET /audit/{id}/events. Фильтры по moment, employee, eventType и source позволяют собрать точную ленту изменений, а сортировка по времени и пагинация — организовать надёжную инкрементальную выгрузку в хранилище.
Если аудит нужно связать с сайтом на 1С-Битрикс — например, показывать историю правок каталога или логировать, кто и когда менял цены при обмене, — мы проектируем такие интеграции и обмен данными под нагрузку и с прозрачным логированием. Поможем построить надёжный конвейер выгрузки событий из МойСклад в вашу систему.
Частые вопросы
Можно ли записать событие в аудит вручную через API?
Нет. Аудит доступен только на чтение, журнал наполняет сам сервис при любых изменениях сущностей, включая правки, сделанные вашей интеграцией.
Чем отличается /audit от /entity/{type}/{id}/audit?
Первый возвращает все контексты событий по аккаунту с фильтрами, второй — только контексты, относящиеся к одной конкретной сущности по её id.
Где хранится информация, какие именно поля изменились?
В событиях контекста. Сначала получаете контекст через /audit, затем разворачиваете его в diff по полям запросом /audit/{id}/events.
Как отличить правки моей интеграции от ручных изменений?
Смотрите поле source в контексте события: у изменений через JSON API оно указывает на api/jsonApi, а ручные правки в интерфейсе помечены иначе.
В каком формате задаётся дата в фильтре по moment?
Формат yyyy-MM-dd HH:mm:ss, пробел в URL кодируется как %20. Диапазон задаётся двумя условиями filter с операторами >= и <=.
Почему в одном событии objectCount больше единицы?
Это массовая операция — импорт или bulk-обновление. Одно событие относится сразу к нескольким объектам, и diff при этом приходит агрегированным.
Как надёжно выгружать аудит инкрементально?
Фильтруйте по moment больше метки последней выгрузки, сортируйте по возрастанию времени и идите по страницам через offset или nextHref, обновляя метку по последнему обработанному событию.
Долго ли хранятся события аудита?
Глубина хранения ограничена тарифом. Для постоянной истории забирайте события в собственное хранилище, не полагаясь на бесконечную ретроспективу в самом МойСклад.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.