Перенос данных из отчетов 1С, таких как Оборотно-сальдовая ведомость (ОСВ), в сторонние базы данных SQL — это классическая задача интеграции. Она часто возникает при необходимости построения консолидированной отчетности в BI-системах, хранилищах данных (DWH) или при обмене информацией между разрозненными базами. Рассмотрим подробнее, как реализовать эту задачу наиболее эффективными способами.
Прежде чем мы перейдем к технической части выгрузки в SQL, проанализируем структуру ОСВ. Типовой отчет в 1С формирует ТабличныйДокумент. Это объект, предназначенный для визуального представления и печати. В нем присутствуют объединенные ячейки, иерархические группировки и пустые строки для отступов. Попытка программно "читать" ячейки сформированного отчета (например, методом Область.Текст) — это трудоемкий и крайне нестабильный путь. Любое изменение настроек отчета пользователем приведет к поломке алгоритма чтения.
Разберем правильный подход: для выгрузки данных нам нужно обращаться не к самому отчету, а к источнику, из которого он берет данные. В случае с ОСВ это Регистр бухгалтерии (обычно Хозрасчетный). Мы должны программно получить таблицу значений, идентичную данным отчета, и уже ее передавать в SQL.
Выясним причину, по которой этот метод является приоритетным. Используя Систему компоновки данных (СКД) или прямой запрос к виртуальным таблицам регистра, мы получаем "плоскую" таблицу с четкими типами данных. Рассмотрим пример кода, который получает остатки и обороты по счету:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
| ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
| ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НашОстатокДт,
| ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НашОстатокКт,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК ДебетЗаПериод,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК КредитЗаПериод
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , , , ) КАК ХозрасчетныйОстаткиИОбороты";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
После того как мы получили объект ТаблицаЗначений, мы готовы к передаче данных во внешнюю СУБД.
Рассмотрим вариант прямого подключения к MS SQL Server из кода 1С. Этот метод отлично подходит для серверов под управлением ОС Windows. Мы создаем COM-объект, который позволяет выполнять SQL-инструкции напрямую.
Проанализируем шаги реализации:
ADODB.Connection.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.
В платформе 1С 8.3 существует встроенный механизм — ВнешниеИсточникиДанных. Он позволяет подключить таблицу SQL так, что она будет выглядеть в конфигурации как обычный справочник или документ. Разберем по шагам, как это настроить:
Теперь в коде 1С вы можете работать с SQL-таблицей через объект МенеджерЗаписи или создавая новые объекты, как в обычном регистре сведений.
НоваяЗапись = ВнешниеИсточникиДанных.МояБазаSQL.Таблицы.dbo_OsvTable.СоздатьМенеджерЗаписи();
НоваяЗапись.Account = СтрокаДанных.Счет;
НоваяЗапись.Debit = СтрокаДанных.ДебетЗаПериод;
НоваяЗапись.Записать();
Если ваша ОСВ содержит сотни тысяч строк (например, детализация до субконто и документов), обычные методы записи будут работать слишком долго. В этой ситуации проанализируем использование массовой вставки. Процесс выглядит так:
ТаблицаЗначений во временный текстовый файл (CSV или TXT) с определенным разделителем.Пример SQL-команды, которую нужно отправить через ADO:
BULK INSERT MyDatabase.dbo.MyOsvTable
FROM 'C:\Temp\osv_data.csv'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 1
);
Этот метод работает в десятки раз быстрее, чем построчное добавление записей, так как SQL-сервер оптимизирует операции ввода-вывода.
Если ваш сервер 1С работает на Linux, использование COM-объектов (ADO) невозможно. В этом случае мы рекомендуем современный архитектурный подход: создание промежуточного микросервиса (на Python, Node.js или C#), который принимает данные в формате JSON и записывает их в базу. 1С в данном случае выступает в роли HTTP-клиента.
Рассмотрим логику работы:
ЗаписьJSON.HTTPЗапрос для отправки данных на внешний сервис.При создании таблицы на стороне SQL важно правильно сопоставить типы данных 1С. Посмотрим на типовые соответствия:
Число (15, 2) в 1С соответствует decimal(15, 2) или numeric(15, 2) в SQL.Строка в 1С — nvarchar в SQL (поддерживает Unicode).Дата в 1С — datetime или datetime2 в SQL.Подведем итог: для решения задачи выгрузки ОСВ в SQL наиболее надежным способом является получение данных через запрос к регистру бухгалтерии с последующей передачей через Внешние источники данных (для простоты разработки) или ADO (для гибкости управления). Если требуется максимальная скорость — выбирайте Bulk Insert.