При интеграции 1С и Power BI специалисты часто сталкиваются с проблемой: уникальные идентификаторы (ссылки) из таблиц SQL-базы 1С отображаются в Power BI как тип Binary. Это делает невозможным установку связей между таблицами и сильно затрудняет анализ данных. Кроме того, стандартные механизмы вроде oData на больших объемах данных работают крайне медленно. В этой статье мы разберем, как преобразовать бинарные данные в понятные системе GUID и как построить эффективную архитектуру обмена данными.
В системе 1С:Предприятие уникальные идентификаторы (GUID) хранятся в базе данных SQL в полях типа binary(16). Например, это поля _IDRRef или _Fld123RRef. Power BI при прямом подключении к SQL-серверу видит их как двоичный код. Чтобы использовать эти поля для связи таблиц "Остатки" и "Номенклатура", нам необходимо привести их к типу uniqueidentifier или строке в формате GUID.
Рассмотрим несколько способов решения этой задачи, начиная от простых запросов и заканчивая созданием функций.
Самый быстрый и эффективный способ — создать на стороне SQL-сервера представления (View), которые будут "подменять" бинарные поля на понятные идентификаторы. Мы можем использовать двойное приведение типов (CAST). Проанализируем пример кода для такого преобразования:
SELECT
CAST(CAST(_IDRRef AS varbinary(16)) AS uniqueidentifier) AS IDRRef_GUID,
_Description AS Name
FROM
_Reference30
Разберем, почему это работает. Сначала мы явно указываем тип varbinary, а затем преобразуем его в uniqueidentifier, который Power BI мгновенно распознает как текстовый GUID и позволяет строить связи между таблицами по принципу "один ко многим" или "многие ко многим".
Если вам требуется получить строковое представление GUID, идентичное тому, которое мы видим в консоли 1С, простого приведения типов может быть недостаточно из-за специфического порядка хранения байтов в 1С. Рассмотрим более сложный, но точный метод с созданием функции:
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)), '-', '')
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
Эта функция переставляет байты таким образом, чтобы строковый результат полностью совпадал с результатом функции Строка(Ссылка.УникальныйИдентификатор()) в коде 1С. Это особенно полезно, если вы планируете сопоставлять данные из SQL с данными, полученными через HTTP-сервисы или oData.
Когда данных становится много (миллионы строк), простые запросы к SQL-базе начинают тормозить как Power BI, так и саму 1С. В такой ситуации мы рекомендуем рассмотреть архитектуру с промежуточным хранилищем или кубами MS Analysis Services (SSAS).
Разберем преимущества этого подхода:
Поскольку таблицы 1С имеют нечитаемые названия (например, _InfoRg123), ручное создание представлений превращается в "хендмейд", который трудно поддерживать. Проанализируем, как автоматизировать этот процесс.
Мы можем написать в 1С простую обработку, которая использует метод ПолучитьСтруктуруХраненияБазыДанных(). Этот метод выгружает соответствие метаданных 1С (Справочник.Номенклатура) и таблиц SQL (_Reference30). На основе этой структуры можно программно генерировать SQL-скрипты для создания View с человекочитаемыми именами полей и таблиц. Это позволит аналитикам работать с базой без необходимости заглядывать в конфигуратор 1С.
При прямой работе с SQL-базой 1С нужно учитывать два критических момента:
1. Смещение дат: 1С часто хранит даты со смещением в 2000 лет. Чтобы Power BI корректно отображал дату, в SQL-запросе нужно использовать DATEADD(year, -2000, _Date_Time). Также важно обрабатывать "пустые" даты 1С (0001-01-01), которые SQL воспринимает иначе. Рекомендуется использовать конструкцию CASE, чтобы заменять их на NULL.
2. Блокировки (Dirty Reads): Чтобы ваши отчеты не блокировали работу пользователей в 1С, обязательно добавьте в SQL-запросы указание WITH (NOLOCK) или используйте уровень изолированности транзакций READ UNCOMMITTED. Если есть возможность, подключайтесь к ReadOnly реплике базы данных, если у вас настроен кластер AlwaysOn.
Мы рассмотрели основные способы стыковки 1С и Power BI. Для небольших задач достаточно создания представлений (View) с использованием CAST для преобразования GUID. Для крупных корпоративных систем оптимальным выбором станет построение полноценного хранилища данных (DWH) или использование OLAP-кубов, что позволит разделить оперативный учет и тяжелую аналитику.