Как настроить двусторонний обмен данными между 1С и внешней базой SQL

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

При интеграции 1С с внешними учетными или технологическими системами часто возникает задача прямой синхронизации: передать справочную информацию во внешнюю СУБД SQL и загрузить оттуда данные для формирования и проведения документов в 1С. Рассмотрим, подходит ли для этих целей конфигурация «Конвертация данных» (КД), а также разберем проверенные архитектурные решения и практические примеры кода для реализации обмена.

Почему «Конвертация данных» не подходит для работы с внешними SQL-базами

Выясним сразу: механизм «Конвертация данных» предназначен строго для обмена информацией между конфигурациями на платформе 1С (через XML, JSON или прямое COM-подключение к другой базе 1С). Конвертация данных опирается на метаданные объектов 1С, их структуру и правила заполнении. Если одна из баз не является реляционной структурой 1С (например, это произвольная СУБД Microsoft SQL Server, PostgreSQL или MySQL от стороннего ПО), использовать КД напрямую нельзя.

Для взаимодействия со сторонними базами данных используются два основных подхода:

  1. Прямое программное подключение с помощью COM-объекта ADODB.Connection.
  2. Использование штатного механизма платформы 1С «Внешние источники данных» (ВИД).

Вариант 1. Прямое подключение через ADO (ADODB.Connection)

Разберем самый распространенный и гибкий способ обмена — прямое чтение и запись через технологии OLE DB / ADO. Этот метод не требует изменения структуры конфигурации и отлично подходит для периодической выгрузки и загрузки данных.

Обратите внимание: использование технологии COM/ADO доступно только в операционных системах семейства Windows. Если сервер 1С запущен под управлением Linux, данный COM-объект вызвать не удастся.

Посмотрим на пример кода подключения к серверу SQL, отправки запроса и удаления или обновления данных:


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

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

// Пример выполнения произвольного команды SQL (запись, обновление или удаление)
ЗапросSQL = "UPDATE Clients SET Status = 1 WHERE Processed = 0";
Попытка
    Соединение.Execute(ЗапросSQL);
Исключение
    Сообщить("Ошибка выполнения запроса SQL: " + ОписаниеОшибки());
КонецПопытки;

Соединение.Close();

Рассмотрим пример чтения данных из базы SQL для последующего создания документов в 1С:


Соединение = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");

Попытка
    Соединение.Open(СтрокаПодключения);
    Command.ActiveConnection = Соединение;
    Command.CommandText = "SELECT Id, ClientName, Amount FROM Orders WHERE Status = 'New'";
    
    Записи = Command.Execute();
    
    Пока НЕ Записи.EOF() Цикл
        // Извлекаем значения полей таблицы SQL
        Идентификатор = Записи.Fields("Id").Value;
        ИмяКлиента = Записи.Fields("ClientName").Value;
        Сумма = Записи.Fields("Amount").Value;
        
        // Создаем документ в 1С
        ДокументОбъект = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
        ДокументОбъект.Дата = ТекущаяДата();
        ДокументОбъект.СуммаДокумента = Сумма;
        ДокументОбъект.Комментарий = "Загружено из SQL. ID: " + Строка(Идентификатор);
        
        НачатьТранзакцию();
        Попытка
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
            ЗафиксироватьТранзакцию();
            
            // Отмечаем запись во внешней базе как обработанную
            Соединение.Execute("UPDATE Orders SET Status = 'Processed' WHERE Id = " + Строка(Идентификатор));
        Исключение
            ОтменитьТранзакцию();
            Сообщить("Не удалось провести документ: " + ОписаниеОшибки());
        КонецПопытки;
        
        Записи.MoveNext();
    КонецЦикла;
    
    Записи.Close();
    Соединение.Close();
Исключение
    Сообщить("Ошибка обработки данных: " + ОписаниеОшибки());
КонецПопытки;

Вариант 2. Использование «Внешних источников данных» (ВИД)

Платформа 1С:Предприятие позволяет подключать внешние таблицы SQL непосредственно в конфигураторе через ветку метаданных «Внешние источники данных». В этом случае таблицы сторонней базы отображаются в 1С аналогично привычным справочникам и документам, и к ним можно обращаться с помощью языка запросов 1С или через объектную модель.

Рассмотрим особенности использования Внешних источников данных:

  1. Кроссплатформенность: В отличие от COM-объектов, ВИД можно использовать под Linux с помощью драйверов ODBC (например, через unixODBC).
  2. Типы данных: Не все специфические типы данных СУБД (например, uniqueidentifier или varbinary) корректно отображаются в 1С. В таких случаях на стороне SQL создают VIEW (представления), приводящие типы к стандартным строкам или числам.
  3. Схема метаданных: При изменении структуры внешней таблицы (добавлении колонок) необходимо вручную обновлять схему Внешнего источника данных в Конфигураторе.

Автоматизация обмена и работа регламентных заданий

Для того чтобы обмен выполнялся автоматически по расписанию без участия пользователя, в 1С применяются Регламентные задания.

Проанализируем специфику выполнения регламентных заданий в зависимости от режима работы базы 1С:

Рекомендуется всегда оборачивать операции записи документов 1С и обновления статусов в базе SQL в блоки Попытка ... Исключение и явные транзакции 1С (НачатьТранзакцию(), ЗафиксироватьТранзакцию()), чтобы избежать рассогласования данных при сбоях связи.

← На главную