Как правильно сформировать JSON в HTTP-сервисе 1С для Power BI?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто при разработке интеграции между 1С и аналитическими системами разработчики решают использовать собственные HTTP-сервисы вместо стандартного протокола OData. Мы создаем сервис, формируем JSON-ответ, проверяем его в браузере — всё работает отлично. Однако при попытке подключиться к этому URL напрямую из Power BI система отказывается понимать, что перед ней JSON, и воспринимает ответ просто как двоичный файл. Давайте подробно разберем эту ситуацию и выясним, как правильно подготовить ответ HTTP-сервиса, чтобы Power BI считывал его без проблем.

Анализ исходного кода и проблемы

Рассмотрим стандартный пример формирования ответа в HTTP-сервисе, который может вызывать проблемы в Power BI:


Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type","application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Данные, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;

Несмотря на корректный заголовок Content-type, Power BI может не преобразовать такие данные в таблицу автоматически. Разберем по шагам, какие хитрости нужно применить, чтобы это исправить.

1. Структура JSON: используем массив объектов

Методом проб и ошибок выясняется главная особенность парсера Power BI: система наиболее эффективно и автоматически преобразует JSON в таблицу, если корень сообщения представляет собой массив объектов.

Если мы возвращаем одиночный объект или оборачиваем данные в сложную структуру (например, {"data": [{...}, {...}]}), Power BI загрузит это как одну запись или строку. Пользователю придется вручную «разворачивать» списки в редакторе Power Query. Чтобы Power BI сразу понял, что перед ним таблица, мы должны формировать Данные в виде корневого массива:


[
  {"Номенклатура": "Товар 1", "Цена": 100},
  {"Номенклатура": "Товар 2", "Цена": 200}
]

2. Работа с BOM (Byte Order Mark)

Существует давний конфликт стандартов. Формально спецификация JSON не рекомендует использование метки BOM. Именно поэтому разработчики 1С часто указывают ИспользованиеByteOrderMark.НеИспользовать.

Однако исторически инструменты Microsoft, включая движок Power Query, лучше распознают кодировку UTF-8, если в начале файла присутствует эта самая метка. Если Power BI видит «кракозябры» или вообще не распознает структуру файла, попробуйте изменить параметры установки тела ответа:


Ответ.УстановитьТелоИзСтроки(Данные, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Использовать);

Во многих случаях именно добавление BOM заставляет Power BI правильно прочитать ответ как структурированный текстовый файл.

3. Парсинг в Power Query (язык M)

Даже если мы отдаем данные идеально, автоматическое создание запроса через интерфейс «Получить данные -> Веб» может дать сбой. В этом случае проанализируем код запроса в расширенном редакторе Power Query. За преобразование веб-ответа в JSON отвечает функция Json.Document().

Убедитесь, что ваш запрос выглядит примерно так:


let
    Источник = Json.Document(Web.Contents("https://ваш-сервер/база/hs/имя-сервиса"))
in
    Источник

Если функция Json.Document() отсутствует, добавьте ее вручную, обернув результат получения данных из сети.

4. Авторизация и заголовки

Если ваш HTTP-сервис закрыт паролем (используется базовая авторизация), Power BI при первом подключении запросит учетные данные. Здесь кроется важный нюанс: всегда используйте логин и пароль на латинице.

Power BI передает учетные данные в заголовке Authorization, предварительно закодировав их в Base64. Если логин или пароль пользователя 1С содержат кириллические символы, это может вызвать ошибку декодирования на стороне веб-сервера (IIS или Apache), и запрос до платформы 1С просто не дойдет.

5. Оптимизация передачи данных: типы и объемы

Проанализируем еще несколько важных технических нюансов для стабильной интеграции:

  1. Типы данных: Power BI чувствителен к типам. Если вы формируете JSON вручную и берете числа в кавычки (например, "Цена": "150.50"), Power BI воспримет их как текст. Передавайте числа и булевы значения (true/false) без кавычек, чтобы система могла автоматически назначить правильные типы столбцам.
  2. Объем данных: HTTP-сервис 1С возвращает весь объем данных за один запрос. Power BI не умеет автоматически «листать» страницы, как он это делает со стандартным OData. Если записей сотни тысяч, 1С может упасть по таймауту, или Power BI выдаст ошибку нехватки памяти. Рекомендуется самостоятельно реализовать параметры пагинации (аналоги $top и $skip) и обрабатывать их в коде сервиса, либо использовать стандартный OData интерфейс 1С для массивных таблиц.

Итоги

Для успешной передачи данных из 1С в Power BI через собственный HTTP-сервис, нам необходимо:

  1. Формировать структуру JSON в виде плоского массива объектов [{...},{...}].
  2. При необходимости включать метку BOM через ИспользованиеByteOrderMark.Использовать.
  3. Использовать латинские символы для логина и пароля пользователя 1С.
  4. Следить за правильной типизацией значений (числа без кавычек) внутри генерируемой строки.
  5. В случае сбоев автоматического парсинга, проверять наличие обертки Json.Document() в коде Power Query.

Применив эти правила, вы обеспечите стабильное и корректное чтение данных из вашей базы 1С в аналитические отчеты Power BI.

← На главную