1С — самая распространённая транзакционная система среднего бизнеса: там живут продажи, бухгалтерия, зарплата, остатки, закупки, управленческий учёт. Любая BI-система рано или поздно упирается в вопрос: как забрать данные из 1С быстро, стабильно и без ущерба продуктиву.
Хорошая новость: методов много. Плохая: у каждого свои ограничения. «Подключу OData — и всё будет работать» — работает до первого регистра с миллионом строк. «Возьму прямой SQL» — работает, пока не натыкаешься на GUID в binary(16) и таблицы с именами _AccumRg12345. Разбираем все рабочие варианты: производительность, грабли, когда какой применять.
Краткий обзор: 7 методов на одной таблице
| Метод | Скорость | Усилия на разработку | CDC / инкремент | Нагрузка на 1С | Стоимость |
|---|---|---|---|---|---|
| 01 · OData REST | Низкая | Минимум (встроено) | Через DataVersion | Средняя | 0 ₽ |
| 02 · HTTP-сервисы (кастомные) | Средняя-высокая | Средние (1С-разработчик) | Полный контроль | Контролируемая | 0 ₽ (есть 1С-разработчик) |
| 03 · Прямой SQL к базе | Высокая | Высокие (реверс метаданных) | Через &Version или триггеры | Минимальная | 0 ₽ |
| 04 · ATK BI View | Высокая | Минимум (готовые VIEW) | Встроенный CDC | Минимальная | Коммерческий |
| 05 · Denvic Extractor | Высокая | Минимум (managed ETL) | Встроенный CDC + SCD | Минимальная | Коммерческий |
| 06 · ПланОбмена + узлы | Средняя | Средние (конфигурация 1С) | Нативный CDC | Минимальная | 0 ₽ |
| 07 · КД 3.0 (XML) | Низкая | Средние (правила КД) | Через XML-сообщения | Высокая | 0 ₽ |
«Единственно правильного» метода нет. Выбор зависит от объёма данных, частоты обновлений, наличия 1С-разработчика, бюджета и архитектуры DWH. Ниже — разбор каждого метода.
Детальный разбор методов
OData REST-интерфейс
Самый простой и официальный способ. Поставляется с 1С:Предприятие 8.3 «из коробки». Включается в Конфигураторе: для каждого объекта метаданных (справочник, документ, регистр) выставляется свойство «Использовать стандартный OData-интерфейс».
После публикации веб-сервера (IIS или Apache) доступ идёт по URL вида:
# Получить справочник Номенклатура
GET http://1c-server/base/odata/standard.odata/Catalog_Номенклатура?$format=json
# Отфильтровать + выбрать поля
GET http://1c-server/base/odata/standard.odata/Catalog_Номенклатура
?$filter=IsFolder eq false and DeletionMark eq false
&$select=Ref_Key,Description,Code,Артикул
&$format=json
# Пагинация + сортировка
GET http://1c-server/base/odata/standard.odata/Document_РеализацияТоваровУслуг
?$filter=Date ge datetime'2026-01-01T00:00:00'
&$top=1000
&$skip=0
&$orderby=Date
&$format=json
Поддерживается Basic/NTLM/Windows-авторизация. Протокол OData v3 и v4 (зависит от версии платформы). Также доступны связанные сущности через $expand: ?$expand=Товары,Склад.
- Встроено, без сторонних инструментов
- Стандартный REST + JSON
- Работает любой HTTP-клиент (Python, .NET, Power BI)
- Авторизация через существующих пользователей 1С
- Медленно на больших регистрах (миллионы строк)
- N+1 при загрузке связанных объектов
- Блокировки: читает как транзакция
- Нет агрегаций на стороне 1С
Инкрементальная выгрузка. Каждый объект имеет служебное поле DataVersion — бинарную метку, которая меняется при любом изменении записи. Схема: храните максимальный DataVersion из последней выгрузки, делаете $filter=DataVersion gt 'xxx' — получаете только изменения. Работает, но DataVersion непредсказуемо меняется при массовых операциях 1С.
Когда применять: справочники (номенклатура, контрагенты, подразделения) до 100 тыс. строк, где полная перезаливка раз в сутки устраивает. Документы до 500 тыс. строк с инкрементом по Date + DataVersion. На регистрах накоплений с миллионами строк OData упирается в потолок.
HTTP-сервисы (собственные endpoints)
В Конфигураторе создаётся объект «HTTP-Сервис» с методами (GET/POST), внутри которых вы пишете 1С-код: делаете запрос через Запрос.Выполнить(), собираете результат, возвращаете JSON или XML. Полная свобода в том, что и как возвращать.
// 1С-код: метод GET в HTTP-сервисе
Процедура ВыполнитьПолучениеПродажПериод(Запрос, Ответ)
ДатаС = Запрос.ПараметрыURL["ДатаС"];
ДатаПо = Запрос.ПараметрыURL["ДатаПо"];
ЗапросДанных = Новый Запрос;
ЗапросДанных.Текст =
"ВЫБРАТЬ
| Продажи.Период КАК Дата,
| Продажи.Номенклатура.Код КАК НоменклатураКод,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаС, &ДатаПо, Период) КАК Продажи";
ЗапросДанных.УстановитьПараметр("ДатаС", ДатаС);
ЗапросДанных.УстановитьПараметр("ДатаПо", ДатаПо);
Результат = ЗапросДанных.Выполнить().Выбрать();
МассивДанных = Новый Массив;
Пока Результат.Следующий() Цикл
Элемент = Новый Структура(
"Дата,НоменклатураКод,Количество,Стоимость",
Результат.Дата, Результат.НоменклатураКод,
Результат.Количество, Результат.Стоимость
);
МассивДанных.Добавить(Элемент);
КонецЦикла;
Ответ.УстановитьТелоИзСтроки(
ЗначениеВJSON(МассивДанных),
"UTF-8"
);
КонецПроцедуры
- Полный контроль над запросом и форматом ответа
- Можно делать агрегации внутри 1С (МАХ скорость)
- Легко добавить авторизацию по API-ключу
- Один endpoint = один бизнес-сценарий
- Нужен 1С-разработчик на внедрение
- Каждый новый endpoint — новый релиз конфигурации
- Кастомный код живёт в конфигурации 1С
Когда применять: нужны агрегаты (обороты регистров, итоги по группам), сложные выборки с join-ами, быстрая выгрузка больших объёмов с преагрегацией. Когда ETL-команда хочет получать готовые витрины, а не сырые строки.
Совет: держите endpoints в отдельной подсистеме «Интеграция_DWH» — это упрощает поддержку и отделяет их от основной бизнес-логики. И сразу версионируйте: /api/v1/sales, а не просто /api/sales.
Прямой SQL к базе MS SQL Server
1С:Предприятие 8 хранит данные в MS SQL Server (или PostgreSQL) в собственных таблицах с закодированными именами. Если подключиться к базе напрямую через SQL Server Management Studio или ADO.NET, можно читать данные без участия сервера 1С. Скорость — максимально возможная для SQL-базы.
Структура имён таблиц 1С:
_Reference123 — справочник (ID 123 в метаданных)
_Reference123_VT456 — табличная часть справочника
_Document84 — документ
_Document84_VT789 — табличная часть документа
_DocumentJournal12 — журнал документов
_AccumRg45 — регистр накопления (движения)
_AccumRgT45 — таблица итогов регистра
_AccRg30 — регистр бухгалтерии
_InfoRg67 — регистр сведений
_Enum10 — перечисление
_Const — константы
Config — метаданные (XML)
DBSchema — структура базы
Params — параметры базы
Главная сложность: цифры в именах таблиц не соответствуют никакому очевидному порядку. Mapping «_Reference123 = справочник Номенклатура» хранится в таблице Config и в XML-файлах конфигурации. Без reverse-инжиниринга метаданных прямой SQL бесполезен.
Типичные grаbli:
- GUID хранятся как BINARY(16). Чтобы увидеть как строку:
CAST(_IDRRef AS UNIQUEIDENTIFIER). - Ссылочные поля — это пара колонок. Одна хранит тип объекта (
_Fld123_TYPE), другая — ID (_Fld123_RRRef). Для составного типа нужна CASE-конструкция. - Даты хранятся со смещением на 2000 лет вперёд.
DATEADD(year, -2000, _Date_Time)возвращает реальную дату. - Строки в NVARCHAR фиксированной длины — с паддингом пробелами.
RTRIM()обязателен. - Булевы значения — как BINARY(1).
CAST(_Fld456 AS TINYINT). - NULL в ссылках представлен как
0x00000000000000000000000000000000, не SQL NULL.
Минимальный пример:
-- Справочник Номенклатура (после reverse: _Reference123)
SELECT
CAST(_IDRRef AS UNIQUEIDENTIFIER) AS ref_guid,
RTRIM(_Code) AS nom_code,
RTRIM(_Description) AS nom_name,
_Folder AS is_folder,
_Marked AS is_deleted
FROM _Reference123 WITH (NOLOCK)
WHERE _Marked = 0x00;
- Максимальная скорость выгрузки
- Все SQL-инструменты работают: CTE, оконные функции, индексы
- Не блокирует 1С-пользователей при NOLOCK/snapshot isolation
- Можно делать произвольные join-ы между объектами
- Нужен reverse-слой имён таблиц и колонок
- Структура меняется при обновлении конфигурации 1С
- GUID, даты, ссылки — с подводными камнями
- Требует DBA-уровня SQL-знаний
Рекомендация: используйте read-only replica (AlwaysOn) или snapshot isolation — так вы не блокируете продуктивную базу. Для автоматизации reverse-инжиниринга есть Tool_1CD (читает XML-конфигурацию, генерирует mapping), ATK Extract и другие — см. следующие методы.
ATK BI View
Коммерческий инструмент от Analytical Technology Group (ATG). Снимает главную боль прямого SQL: автоматически генерирует набор SQL VIEW поверх базы 1С с человекочитаемыми именами колонок, правильной распаковкой GUID и дат, разворачиванием ссылок.
Вместо SELECT _IDRRef, _Description FROM _Reference123 вы пишете:
SELECT
nom_guid,
nom_code,
nom_name,
nom_parent_code,
nom_unit_name,
is_deleted
FROM ATK.v_Catalog_Nomenclature
WHERE is_deleted = 0;
VIEW хранятся в отдельной схеме (например, ATK), исходная 1С-база не изменяется. Генератор ATK периодически (по расписанию) пересчитывает VIEW при изменении структуры 1С.
- Готовые VIEW с читаемыми именами из коробки
- Автообновление при изменении конфигурации 1С
- Скорость прямого SQL
- Минимум усилий на старт — ETL становится тривиальным
- Не требует 1С-разработчика
- Коммерческая лицензия (оплата за инсталляцию/сервер)
- Привязка к поставщику
- VIEW не всегда покрывают редкие кастомные объекты
Когда применять: быстрый старт BI в средней компании без своей 1С-команды; когда DWH-команда знает SQL, но не хочет разбираться с внутренней структурой 1С. Типовой срок от установки до первой витрины — 1-2 недели.
Denvic Extractor
Ещё один коммерческий инструмент, уровнем выше: уже не просто VIEW, а полноценный managed-ETL. Закрывает весь жизненный цикл: извлечение → CDC → SCD Type 2 → загрузка в целевую БД → оркестрация и мониторинг.
Архитектурно Denvic работает как отдельный сервис, который:
- Подключается к источнику 1С (прямой SQL или реплика)
- По расписанию/триггеру делает CDC: сравнивает текущий snapshot с предыдущим
- Генерирует delta (inserted/updated/deleted) и применяет к целевой БД
- Ведёт журнал изменений для audit и SCD Type 2 (исторические версии)
- Алертит при аномалиях (скачок объёма, расхождение контрольных сумм)
- End-to-end ETL без своей разработки
- Нативная поддержка SCD Type 2 (исторические версии справочников)
- Управление несколькими источниками из одной консоли
- Мониторинг качества данных и алерты
- Дороже ATK (но больше функций)
- Black-box: логика ETL внутри продукта, кастомизация через свои правила
- Требует «своего» DWH под их target-схему
Когда применять: несколько 1С-баз в холдинге (3-10+ юрлиц), нужен исторический срез данных и единый audit-trail, нет ресурсов на собственный ETL. Хорошо заходит там, где качество данных критично — в финансах и консолидации отчётности.
ПланОбмена + узлы регистрации
Встроенный в 1С механизм распределённых информационных баз (РИБ) и обменов данными. Идея: в конфигурации 1С создаётся объект метаданных «ПланОбмена» с узлами-получателями. Когда объекты изменяются, 1С автоматически регистрирует факт изменения для подписанных узлов.
Внешняя система (ваша BI-платформа, DWH) выступает как узел-получатель. Забирает через HTTP/COM/файл-обмен только изменения с момента последней квитанции, применяет к себе и подтверждает получение. 1С очищает регистрацию изменений для этого узла.
// В 1С создаём узел "DWH" в ПланеОбмена "ОбменСBI"
// Регистрируем изменения для объекта "Продажи"
// Чтение изменений через HTTP-сервис
ВыборкаИзменений = ПланыОбмена.ОбменСBI.ВыбратьИзменения(
Узел, НомерСообщения
);
Пока ВыборкаИзменений.Следующий() Цикл
// Сериализуем в JSON/XML, возвращаем внешней системе
КонецЦикла;
// После подтверждения получения внешней системой
ПланыОбмена.ОбменСBI.УдалитьРегистрациюИзменений(
Узел, НомерСообщения
);
- Чистый CDC: читаем только то, что изменилось
- Не пропускает изменения (в отличие от DataVersion-cursor)
- Минимальная нагрузка на 1С и сеть
- Поддержка удаления (tombstones)
- Требует настройки в конфигурации 1С (1С-разработчик)
- Механизм квитанций требует надёжного двухстороннего протокола
- При сбое потребителя регистрация растёт — нужен мониторинг
Когда применять: near-real-time BI (каждые 5-15 минут), когда нельзя пропустить ни одного изменения (финансы, остатки). Часто комбинируется с HTTP-сервисом: endpoint читает регистрацию изменений для узла DWH и отдаёт delta в JSON. ETL на стороне BI применяет изменения и подтверждает квитанцией.
КД 3.0 (Конвертация данных)
Универсальный механизм обмена между конфигурациями 1С. Правила обмена описываются в отдельной подсистеме КД («Конвертация данных»), данные выгружаются в XML-файлы по схеме Enterprise Data.
Для BI применяется редко: формат XML-сообщений тяжёлый, обмен идёт пакетами, полной автоматизации нет. Обычно используется для миграций между 1С-базами (например, при смене конфигурации) или для интеграции с внешними учётными системами.
Когда применять для BI: редко, если вообще. Если в компании уже настроен обмен через КД, можно подцепить BI как получателя XML. Но парсинг больших XML, обработка ошибок и скорость делают этот путь хуже остальных. Упоминаем для полноты картины.
Как выбирать: матрица сценариев
Практические рекомендации в зависимости от исходной ситуации:
| Сценарий | Рекомендуемый метод | Комментарий |
|---|---|---|
| Одна 1С-база, <500k строк, старт BI за 2 недели | OData или ATK BI View | OData при ограниченном бюджете. ATK при наличии средств — быстрее результат. |
| Одна 1С-база, миллионы строк в регистрах | ATK BI View + прямой SQL | OData будет падать на объёмах. Прямой SQL с reverse необходим. |
| Есть 1С-разработчик, сложная бизнес-логика | HTTP-сервисы + ПланОбмена | Полный контроль, преагрегация на стороне 1С, чистый CDC. |
| Холдинг: 5-10 1С-баз, консолидация | Denvic Extractor | Managed ETL окупается на нескольких источниках. |
| Near-real-time дашборды (каждые 5 мин) | ПланОбмена + HTTP-сервис | Единственный рабочий паттерн для real-time. |
| Жёсткие требования к истории (SCD Type 2) | Denvic или собственный ETL на ATK | Denvic даёт историю из коробки. На ATK пишется вручную. |
| Минимальный бюджет, нет 1С-разработчика | OData | Компромисс: медленно, но бесплатно и быстро стартует. |
Гибридные стратегии
На практике одним методом обходятся редко. Типовые рабочие комбинации:
Комбо 01 · ATK + HTTP-сервисы
ATK BI View используется для всех стандартных справочников и простых регистров (80% данных). Для сложных агрегатов или кастомной логики пишется HTTP-сервис. ETL тянет и оттуда, и оттуда, сваливает в Промежуточный DWH, дальше обычная трансформация.
Комбо 02 · Прямой SQL + ПланОбмена
Первоначальная загрузка (initial load) — прямым SQL: быстро наполняем DWH историей. Дальше — ПланОбмена для delta-изменений. Снимаем нагрузку с 1С, имеем актуальные данные без full-scan.
Комбо 03 · OData + HTTP-сервисы
Когда нет доступа к SQL-базе (облачная 1С:Фреш, хостинг без SQL-доступа). OData для справочников, HTTP-сервисы для преагрегированных регистров. Медленнее прямого SQL, но не требует инфраструктурного доступа.
Комбо 04 · Denvic + собственные endpoints
Denvic тянет стандартные объекты, но для специфической бизнес-логики (например, консолидация EBITDA по 10 юрлицам) делается отдельный HTTP-сервис с финальной агрегацией. Получаем масштабируемость Denvic + гибкость 1С-кода.
Типичные грабли при выгрузке из 1С
- Обновление конфигурации 1С ломает SQL-запросы. Новая версия УТ/УПП/ERP меняет структуру таблиц или добавляет новые поля. ATK/Denvic регенерируют VIEW автоматически. Собственный ETL — пересматриваем и правим.
- Регистры бухгалтерии (
_AccRg) имеют нестандартную структуру с измерениями как колонки. ATK и Denvic нормализуют это в удобный вид. При прямом SQL нужна отдельная логика. - Движения и итоги регистров могут расходиться. Если итоги посчитаны некорректно (баг 1С или незакрытый период), SUM(движения) и значения из таблицы итогов будут разными. Правило: для аналитики всегда используйте движения, а не итоги.
- Пометка на удаление ≠ удаление. Объекты с
_Marked = 0x01считаются удалёнными логически, но физически остаются в базе. Не забудьте добавить фильтрWHERE _Marked = 0x00. - Периодические регистры сведений имеют колонку
_Period. При JOIN с другими таблицами учитывайте, что актуальное значение — это запись с максимальным Period. - Перепроведение документов меняет движения регистров задним числом. Если ETL делает инкремент по Date, изменения в старых периодах пропускаются. Компенсация — регулярная ресинхронизация скользящего окна (например, последние 30 дней перечитываем всегда).
- GUID в BINARY(16) со swap-байтами. Прямое приведение к UNIQUEIDENTIFIER даёт некорректную строку. Правильно — использовать функцию-конвертер, которая swap-ит байты по стандарту 1С.
- Бесконечно растущая регистрация ПланаОбмена. Если потребитель (ваш ETL) упал и не квитирует, регистрация накапливается. Мониторьте таблицу регистрации; настройте очистку через N дней или алерт при превышении порога.
Наш production-стек в проектах DEEONE
На типовых проектах среднего бизнеса (500М-5Б ₽ выручки, 1-3 1С-базы) мы чаще всего берём:
- ATK BI View — для быстрого старта, стандартных справочников и основных регистров. Закрывает 80% потребностей без 1С-разработчика.
- HTTP-сервисы — для специфических сценариев: кастомные отчёты, консолидация нескольких юрлиц, тяжёлые преагрегации. Endpoint под каждый отдельный бизнес-вопрос.
- ПланОбмена — когда нужен real-time или near-real-time. Обычно для остатков и продаж в операционных дашбордах.
- OData — редко, только когда нет SQL-доступа к базе (облако или корпоративные ограничения).
Denvic Extractor ставим в холдингах с 5+ 1С-базами, где экономия на собственном ETL окупает стоимость лицензии. Прямой SQL без ATK — когда клиент категорически против коммерческих инструментов и готов содержать собственный reverse-слой. Рабочий путь, но дорогой по поддержке.
Что делать дальше
- Если стартуете BI на 1С с нуля — посмотрите P1 про DWH на MS Stack: там про структуру DWH, куда приземлять данные из 1С. И скачайте карту 1С-источников — закроет вопросы первого интервью с подрядчиком.
- Если выгрузка из 1С уже есть, но тормозит или ломается — BI-аудит за 5 дней найдёт узкие места и даст план перехода.
- Если нужно обсудить конкретную ситуацию — 30-минутный звонок, расскажем какой метод подходит под ваши объёмы и ограничения.
Связанные материалы:
- DWH на стек Microsoft в 2026 — куда приземлять данные из 1С
- Wildberries API: реальные грабли — аналогичный разбор, но для маркетплейсов
- Интеграция 1С + iiko/Rkeeper — для HoReCa
- Интеграция 1С и Power BI — базовый сценарий