Отчёты из API Мойсклад в Power BI и Excel (интеграция)

Отчёты из API Мойсклад в Power BI и Excel (интеграция)

Вы ведёте учёт в сервисе МойСклад и хотите строить отчёты на основе данных? Данные из МойСклад можно забирать в Power BI, Excel или базу данных по API. Разберём два способа - выбор зависит от объёма данных.

Небольшие данные удобно тянуть прямо в Power BI или Excel через Power Query - без установки коннекторов. Для полноценной загрузки больших объёмов в базу данных (ClickHouse, PostgreSQL, MySQL) есть Python-библиотека morin. Оба способа бесплатны.

Получение токена МойСклад

И для Power Query, и для Python нужен access-токен. Его можно сгенерировать в профиле МойСклад или получить по логину и паролю: пара ЛОГИН:ПАРОЛЬ переводится в кодировку base64 (например, на этом сайте) и отправляется в запросе на токен. Полученный access_token сохраните - им и будем пользоваться.

Небольшие данные: Power Query в Power BI и Excel

Раньше мы раздавали коннектор отдельным файлом (.mez). Теперь проще: код запроса вставляется прямо в Power Query, ставить ничего не нужно, и он работает как в Power BI, так и в Excel.

[TGBLOCK]

Особенность МойСклад - огромное число разных таблиц (товары, контрагенты, заказы, отгрузки, отчёты по остаткам и прибыли и так далее). Все они получаются одинаково, меняется только конец URL. Создайте пустой запрос, откройте «Расширенный редактор» и вставьте код, подставив свой токен и нужный путь:

let
    token = "ВАШ_ACCESS_ТОКЕН",
    // конец нужного URL из справки МойСклад (например, отчёт по остаткам):
    path  = "report/stock/all",
    url   = "https://api.moysklad.ru/api/remap/1.2/" & path,
    resp  = Json.Document(Web.Contents(url,
                [Headers = [#"Authorization" = "Bearer " & token]])),
    rows  = resp[rows],
    table = Table.FromList(rows, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    table

Какой путь подставить в path, смотрите в справке МойСклад: найдите нужный отчёт и возьмите часть URL после https://online.moysklad.ru/api/remap/1.2/ (например, entity/product, entity/customerorder, report/stock/all).

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

Один запрос отдаёт до 1000 строк. Если данных больше, листайте страницы через параметры limit и offset в URL (например, ?limit=1000&offset=1000). Когда строк становятся десятки тысяч, перебирать их в Power Query долго - тут удобнее сразу грузить в базу через Python (ниже).

Полная загрузка в базу данных: Python-библиотека morin

Для больших объёмов и автоматического ежедневного сбора данные из МойСклад лучше грузить в базу. Для этого есть бесплатная Python-библиотека morin - она забирает данные в ClickHouse, PostgreSQL или MySQL, сама листает все страницы и создаёт таблицы.

pip install morin

Создаём коннектор с access-токеном и перечисляем нужные отчёты через запятую. База выбирается одним параметром subd:

from morin import MSKLDbyDate

ms = MSKLDbyDate(
    subd='clickhouse',            # или 'postgresql' / 'mysql'
    host='localhost', port='8123',
    username='default', password='', database='moysklad',
    add_name='account1',
    token='ВАШ_ACCESS_ТОКЕН',
    start='2025-01-01', backfill_days=3,
    reports='entity_product,entity_customerorder,report_stock_all',
)
ms.collecting_manager()

Коннектор МойСклад умеет десятки отчётов: справочники (entity_product - товары, entity_counterparty - контрагенты, entity_customerorder - заказы, entity_demand - отгрузки и другие), отчёты по остаткам (report_stock_all), прибыли (report_profit_byproduct), деньгам и оборотам, а также аудит. morin сама пролистывает все страницы, так что объём не ограничен 1000 строк, как в Power Query.

Все коннекторы, отчёты и ссылки собраны на странице коннекторов, а сама библиотека - на GitHub.