Интеграция 1С и Power BI — это стандартная задача для современной аналитики, однако на практике специалисты часто сталкиваются с техническими барьерами. Основная сложность заключается в том, что при прямом подключении к базе данных SQL Server идентификаторы объектов 1С (ссылки) считываются как тип Binary. Это делает невозможным создание связей между таблицами в Power BI и превращает процесс построения отчетов в сложный квест. Кроме того, стандартные механизмы вроде oData часто демонстрируют крайне низкую производительность на больших объемах данных.
В этой статье мы подробно разберем, как преобразовать бинарные данные 1С в читаемый формат GUID, проанализируем различные подходы к архитектуре обмена данными и выясним, как ускорить работу аналитических систем.
Проанализируем ситуацию: в базе данных 1С ссылки на объекты хранятся в полях с типом binary(16) (например, поле _IDRRef). Платформа 1С записывает эти данные в специфическом порядке байтов, который отличается от стандартного представления uniqueidentifier в SQL Server. Когда Power BI подключается к SQL напрямую, он видит набор двоичных данных. Чтобы построить корректную модель данных (Star Schema или Snowflake), нам необходимо преобразовать эти поля в уникальные идентификаторы.
Рассмотрим самый надежный технический способ — создание пользовательской функции в СУБД, которая будет «на лету» пересобирать бинарную строку в правильный 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 подключается к БД, необходимо выдать права на выполнение этой функции.
Если создание функций кажется избыточным, разберем более простой метод — использование представлений. Вместо того чтобы подключаться к исходным таблицам 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С во время записи документов.
Если у вас нет доступа к изменению структуры базы данных SQL (например, вы ограничены правами db_datareader), мы можем выполнить преобразование прямо в Power BI. Для этого используется язык Power Query (M).
Рассмотрим логику преобразования:
Binary в Hex.Этот метод нагружает процессор компьютера, на котором обновляется отчет, но он не требует изменений в СУБД.
Когда объем данных в 1С достигает сотен гигабайт, прямые запросы к SQL-серверу начинают замедлять основную работу системы. В этом случае мы рекомендуем рассмотреть создание DWH — промежуточного хранилища данных. Что это дает?
Во-первых, мы разделяем нагрузку. Power BI работает с отдельной базой, а 1С — со своей. Во-вторых, в DWH данные можно хранить в уже преобразованном, очищенном виде. Часто для этих целей используют ClickHouse из-за его невероятной скорости обработки аналитических запросов и высокого коэффициента сжатия данных.
Проанализируем процесс загрузки в DWH:
_IDRRef в нормальные строки/GUID.FactSales вместо _Document150).Если вы все же решили использовать oData, но столкнулись с медленной работой, проанализируем причину. Обычно это происходит из-за попытки каждый раз выкачивать всю базу целиком. Для решения этой проблемы в Power BI следует настроить Incremental Refresh (инкрементальное обновление).
Разберем по шагам:
RangeStart и RangeEnd..pbix файла.Это позволяет сократить объем передаваемой информации в десятки раз.
Выбор метода зависит от ваших задач и прав доступа. Если вам нужно быстро «починить» связи в небольшом отчете — используйте SQL View с CAST. Если вы строите серьезную корпоративную отчетность на больших объемах — создавайте DWH и используйте скрипты для автоматической конвертации идентификаторов.
Помните, что работа с прямой базой 1С требует осторожности. Всегда используйте NOLOCK и старайтесь выполнять выгрузки в часы минимальной нагрузки на систему. Правильная конвертация Binary в GUID — это фундамент, без которого построение надежной аналитики на базе Power BI невозможно.