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

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

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

Проблема бинарных идентификаторов 1С в SQL

В системе 1С:Предприятие уникальные идентификаторы (GUID) хранятся в базе данных SQL в полях типа binary(16). Например, это поля _IDRRef или _Fld123RRef. Power BI при прямом подключении к SQL-серверу видит их как двоичный код. Чтобы использовать эти поля для связи таблиц "Остатки" и "Номенклатура", нам необходимо привести их к типу uniqueidentifier или строке в формате GUID.

Рассмотрим несколько способов решения этой задачи, начиная от простых запросов и заканчивая созданием функций.

Способ 1: Преобразование через SQL-представления (View)

Самый быстрый и эффективный способ — создать на стороне 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 и позволяет строить связи между таблицами по принципу "один ко многим" или "многие ко многим".

Способ 2: Использование пользовательской SQL-функции

Если вам требуется получить строковое представление 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.

Оптимизация работы с большими объемами: OLAP-кубы

Когда данных становится много (миллионы строк), простые запросы к SQL-базе начинают тормозить как Power BI, так и саму 1С. В такой ситуации мы рекомендуем рассмотреть архитектуру с промежуточным хранилищем или кубами MS Analysis Services (SSAS).

Разберем преимущества этого подхода:

  1. Снижение нагрузки: Power BI обращается не к "боевой" базе 1С, а к предварительно рассчитанному кубу.
  2. Скорость: Кубы хранят агрегированные данные. То, что в 1С считалось бы минуты, в кубе отображается мгновенно.
  3. Единая логика: Все расчеты мер (прибыль, рентабельность, остатки) описываются один раз в кубе, и все отчеты Power BI используют их одинаково.

Автоматизация создания представлений

Поскольку таблицы 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-кубов, что позволит разделить оперативный учет и тяжелую аналитику.

← На главную