Как выгрузить отчет ОСВ из 1С в таблицу SQL?

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

Перенос данных из отчетов 1С, таких как Оборотно-сальдовая ведомость (ОСВ), в сторонние базы данных SQL — это классическая задача интеграции. Она часто возникает при необходимости построения консолидированной отчетности в BI-системах, хранилищах данных (DWH) или при обмене информацией между разрозненными базами. Рассмотрим подробнее, как реализовать эту задачу наиболее эффективными способами.

Проблема "красивого" отчета: почему не стоит читать табличный документ

Прежде чем мы перейдем к технической части выгрузки в SQL, проанализируем структуру ОСВ. Типовой отчет в 1С формирует ТабличныйДокумент. Это объект, предназначенный для визуального представления и печати. В нем присутствуют объединенные ячейки, иерархические группировки и пустые строки для отступов. Попытка программно "читать" ячейки сформированного отчета (например, методом Область.Текст) — это трудоемкий и крайне нестабильный путь. Любое изменение настроек отчета пользователем приведет к поломке алгоритма чтения.

Разберем правильный подход: для выгрузки данных нам нужно обращаться не к самому отчету, а к источнику, из которого он берет данные. В случае с ОСВ это Регистр бухгалтерии (обычно Хозрасчетный). Мы должны программно получить таблицу значений, идентичную данным отчета, и уже ее передавать в SQL.

Метод 1: Получение данных через запрос к регистру бухгалтерии

Выясним причину, по которой этот метод является приоритетным. Используя Систему компоновки данных (СКД) или прямой запрос к виртуальным таблицам регистра, мы получаем "плоскую" таблицу с четкими типами данных. Рассмотрим пример кода, который получает остатки и обороты по счету:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    |	ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
    |	ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НашОстатокДт,
    |	ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НашОстатокКт,
    |	ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК ДебетЗаПериод,
    |	ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК КредитЗаПериод
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , , , ) КАК ХозрасчетныйОстаткиИОбороты";

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

ТаблицаДанных = Запрос.Выполнить().Выгрузить();

После того как мы получили объект ТаблицаЗначений, мы готовы к передаче данных во внешнюю СУБД.

Метод 2: Использование технологии ADO (ActiveX Data Objects)

Рассмотрим вариант прямого подключения к MS SQL Server из кода 1С. Этот метод отлично подходит для серверов под управлением ОС Windows. Мы создаем COM-объект, который позволяет выполнять SQL-инструкции напрямую.

Проанализируем шаги реализации:

  1. Создаем объект соединения ADODB.Connection.
  2. Устанавливаем строку подключения (ConnectionString).
  3. В цикле по нашей таблице данных формируем и выполняем запросы INSERT INTO.

Пример реализации записи данных:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=SQLOLEDB.1;Data Source=ИмяСервера;Initial Catalog=ИмяБазы;User ID=Логин;Password=Пароль;";

Попытка
    Connection.Open(ConnectionString);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Для Каждого Строка Из ТаблицаДанных Цикл
    // Формируем текст запроса. Важно корректно форматировать даты и числа.
    ТекстЗапроса = "INSERT INTO MyOsvTable (Account, DebitStart, CreditStart) 
                   |VALUES ('" + Строка.Счет + "', " + СтрЗаменить(Строка.НашОстатокДт, ",", ".") + ", 0)";
    Connection.Execute(ТекстЗапроса);
КонецЦикла;

Connection.Close();

Важный момент: при записи больших объемов данных построчный INSERT в цикле может работать медленно. В таких случаях рекомендуется использовать транзакции или метод Bulk Insert.

Метод 3: Внешние источники данных

В платформе 1С 8.3 существует встроенный механизм — ВнешниеИсточникиДанных. Он позволяет подключить таблицу SQL так, что она будет выглядеть в конфигурации как обычный справочник или документ. Разберем по шагам, как это настроить:

  1. В конфигураторе добавьте новый объект в ветке "Внешние источники данных".
  2. Настройте соединение с вашей базой SQL.
  3. Выберите нужную таблицу и добавьте её в состав источника.
  4. В свойствах таблицы обязательно установите флаг "Разрешить редактирование".

Теперь в коде 1С вы можете работать с SQL-таблицей через объект МенеджерЗаписи или создавая новые объекты, как в обычном регистре сведений.


НоваяЗапись = ВнешниеИсточникиДанных.МояБазаSQL.Таблицы.dbo_OsvTable.СоздатьМенеджерЗаписи();
НоваяЗапись.Account = СтрокаДанных.Счет;
НоваяЗапись.Debit = СтрокаДанных.ДебетЗаПериод;
НоваяЗапись.Записать();

Метод 4: Использование Bulk Insert для высокой производительности

Если ваша ОСВ содержит сотни тысяч строк (например, детализация до субконто и документов), обычные методы записи будут работать слишком долго. В этой ситуации проанализируем использование массовой вставки. Процесс выглядит так:

  1. 1С сохраняет ТаблицаЗначений во временный текстовый файл (CSV или TXT) с определенным разделителем.
  2. 1С отправляет SQL-серверу команду на загрузку этого файла.

Пример SQL-команды, которую нужно отправить через ADO:


BULK INSERT MyDatabase.dbo.MyOsvTable
FROM 'C:\Temp\osv_data.csv'
WITH (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    FIRSTROW = 1
);

Этот метод работает в десятки раз быстрее, чем построчное добавление записей, так как SQL-сервер оптимизирует операции ввода-вывода.

Метод 5: Передача через HTTP-сервисы (для Linux-серверов)

Если ваш сервер 1С работает на Linux, использование COM-объектов (ADO) невозможно. В этом случае мы рекомендуем современный архитектурный подход: создание промежуточного микросервиса (на Python, Node.js или C#), который принимает данные в формате JSON и записывает их в базу. 1С в данном случае выступает в роли HTTP-клиента.

Рассмотрим логику работы:

  1. В 1С данные упаковываются в ЗаписьJSON.
  2. Используется объект HTTPЗапрос для отправки данных на внешний сервис.
  3. Сервис получает пакет и выполняет вставку в SQL.

Рекомендации по типам данных

При создании таблицы на стороне SQL важно правильно сопоставить типы данных 1С. Посмотрим на типовые соответствия:

Подведем итог: для решения задачи выгрузки ОСВ в SQL наиболее надежным способом является получение данных через запрос к регистру бухгалтерии с последующей передачей через Внешние источники данных (для простоты разработки) или ADO (для гибкости управления). Если требуется максимальная скорость — выбирайте Bulk Insert.

← На главную