Как подружить 1С и Power BI: решаем проблему бинарных идентификаторов и медленной загрузки

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

Интеграция 1С и Power BI — это стандартная задача для современной аналитики, однако на практике специалисты часто сталкиваются с техническими барьерами. Основная сложность заключается в том, что при прямом подключении к базе данных SQL Server идентификаторы объектов 1С (ссылки) считываются как тип Binary. Это делает невозможным создание связей между таблицами в Power BI и превращает процесс построения отчетов в сложный квест. Кроме того, стандартные механизмы вроде oData часто демонстрируют крайне низкую производительность на больших объемах данных.

В этой статье мы подробно разберем, как преобразовать бинарные данные 1С в читаемый формат GUID, проанализируем различные подходы к архитектуре обмена данными и выясним, как ускорить работу аналитических систем.

Разбираем проблему: почему Power BI не понимает ID из 1С

Проанализируем ситуацию: в базе данных 1С ссылки на объекты хранятся в полях с типом binary(16) (например, поле _IDRRef). Платформа 1С записывает эти данные в специфическом порядке байтов, который отличается от стандартного представления uniqueidentifier в SQL Server. Когда Power BI подключается к SQL напрямую, он видит набор двоичных данных. Чтобы построить корректную модель данных (Star Schema или Snowflake), нам необходимо преобразовать эти поля в уникальные идентификаторы.

Решение №1: Преобразование GUID на стороне SQL с помощью функции

Рассмотрим самый надежный технический способ — создание пользовательской функции в СУБД, которая будет «на лету» пересобирать бинарную строку в правильный GUID. Это решение позволяет подготовить данные еще до того, как они попадут в Power BI.

Посмотрим на пример кода такой функции:


ALTER FUNCTION [dbo].[func_ConvertToGUID1C](@binaryUUID binary(16))
RETURNS VarChar(50)
AS
BEGIN
    DECLARE @buffer VarChar(50)
    -- Сначала конвертируем бинарное значение в строку и убираем дефисы
    SELECT @buffer = REPLACE(CONVERT(CHAR(36), CAST(@binaryUUID AS UNIQUEIDENTIFIER)), '-', '')
    
    -- Возвращаем строку, переставляя блоки байтов в порядке, принятом в 1С
    RETURN RIGHT(@buffer, 8) + '-' + SUBSTRING(@buffer, 21, 4) + '-' + SUBSTRING(@buffer, 17, 4) + '-' +
           SUBSTRING(@buffer, 7, 2) + SUBSTRING(@buffer, 5, 2) + '-' + SUBSTRING(@buffer, 3, 2) +
           SUBSTRING(@buffer, 1, 2) + SUBSTRING(@buffer, 11, 2) + SUBSTRING(@buffer, 9, 2) +
           SUBSTRING(@buffer, 15, 2) + SUBSTRING(@buffer, 13, 2)
END

Выясним, как это работает: функция принимает на вход binary(16) и с помощью строковых операций меняет местами фрагменты идентификатора. Это необходимо, так как 1С хранит байты в «перевернутом» виде. После добавления этой функции в вашу базу данных, вы сможете вызывать ее в SQL-запросах при импорте данных в Power BI. Обратите внимание, что пользователю, под которым Power BI подключается к БД, необходимо выдать права на выполнение этой функции.

Решение №2: Использование SQL-представлений (View)

Если создание функций кажется избыточным, разберем более простой метод — использование представлений. Вместо того чтобы подключаться к исходным таблицам 1С (которые имеют нечитаемые названия вроде _Reference45), мы создаем View. В этих представлениях мы можем сразу переименовать поля и типизировать идентификаторы.

Посмотрим на пример SQL-запроса для создания представления:


CREATE VIEW vw_Goods AS
SELECT 
    _Description AS Name,
    _Code AS Code,
    CAST(CAST(_IDRRef AS VARBINARY(16)) AS UNIQUEIDENTIFIER) AS ID
FROM _Reference45 WITH (NOLOCK)

Важный момент: использование двойного CAST позволяет SQL Server интерпретировать бинарное значение как уникальный идентификатор. Также мы добавили хинт WITH (NOLOCK). Это критически важно, чтобы тяжелые запросы из Power BI не блокировали работу пользователей в 1С во время записи документов.

Решение №3: Обработка данных на стороне Power Query (Язык M)

Если у вас нет доступа к изменению структуры базы данных SQL (например, вы ограничены правами db_datareader), мы можем выполнить преобразование прямо в Power BI. Для этого используется язык Power Query (M).

Рассмотрим логику преобразования:

  1. Загружаем таблицу с бинарным полем.
  2. Добавляем пользовательский столбец, где переводим Binary в Hex.
  3. Разрезаем полученную строку на части и меняем их местами согласно логике 1С (последние 8 символов в начало и так далее).
  4. Меняем тип данных столбца на «Текст» или «Уникальный идентификатор».

Этот метод нагружает процессор компьютера, на котором обновляется отчет, но он не требует изменений в СУБД.

Решение №4: Архитектура DWH (Data Warehouse)

Когда объем данных в 1С достигает сотен гигабайт, прямые запросы к SQL-серверу начинают замедлять основную работу системы. В этом случае мы рекомендуем рассмотреть создание DWH — промежуточного хранилища данных. Что это дает?

Во-первых, мы разделяем нагрузку. Power BI работает с отдельной базой, а 1С — со своей. Во-вторых, в DWH данные можно хранить в уже преобразованном, очищенном виде. Часто для этих целей используют ClickHouse из-за его невероятной скорости обработки аналитических запросов и высокого коэффициента сжатия данных.

Проанализируем процесс загрузки в DWH:

Решение №5: Оптимизация через OData и Инкрементальное обновление

Если вы все же решили использовать oData, но столкнулись с медленной работой, проанализируем причину. Обычно это происходит из-за попытки каждый раз выкачивать всю базу целиком. Для решения этой проблемы в Power BI следует настроить Incremental Refresh (инкрементальное обновление).

Разберем по шагам:

  1. В 1С убедитесь, что у объектов есть поле даты последнего изменения.
  2. В Power BI настройте параметры RangeStart и RangeEnd.
  3. Система будет запрашивать у 1С только те записи, которые изменились за последние сутки, а старые данные будут храниться в кэше .pbix файла.

Это позволяет сократить объем передаваемой информации в десятки раз.

Заключение и рекомендации

Выбор метода зависит от ваших задач и прав доступа. Если вам нужно быстро «починить» связи в небольшом отчете — используйте SQL View с CAST. Если вы строите серьезную корпоративную отчетность на больших объемах — создавайте DWH и используйте скрипты для автоматической конвертации идентификаторов.

Помните, что работа с прямой базой 1С требует осторожности. Всегда используйте NOLOCK и старайтесь выполнять выгрузки в часы минимальной нагрузки на систему. Правильная конвертация Binary в GUID — это фундамент, без которого построение надежной аналитики на базе Power BI невозможно.

← На главную