Как загрузить данные из внешней базы MS SQL в 1С с помощью Конвертации данных 2.1 и стоит ли это делать?

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

В практике разработчика 1С часто возникает задача интеграции с внешними системами, работающими на СУБД MS SQL, Oracle или PostgreSQL. Одним из классических инструментов для обмена данными является конфигурация «Конвертация данных 2.1» (КД 2.1). Несмотря на то что она изначально предназначена для обмена между базами 1С, её механизмы можно адаптировать для работы с «сырыми» SQL-данными. Разберем подробно, как реализовать такой перенос, какие есть нюансы и стоит ли использовать этот метод сегодня.

Метод 1: Использование КД 2.1 как движка трансформации

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

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

  1. В конфигурации «Конвертация данных» создадим ПВД для нужного объекта.
  2. Установим способ выборки — «Произвольный алгоритм».
  3. В обработчике Перед обработкой или Перед выгрузкой данных нам необходимо инициализировать соединение с внешней базой через COM-объект.

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


// Создаем объект подключения
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQL Server};Server=MyServerName;Database=ExternalDB;Uid=Login;Pwd=Password;";

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

// Выполняем запрос
Recordset = Новый COMОбъект("ADODB.Recordset");
SQLQuery = "SELECT ItemID, ItemName, Article FROM ItemsTable";
Recordset.Open(SQLQuery, Connection);

Пока НЕ Recordset.EOF Цикл
    // Создаем структуру для передачи в правила конвертации
    ДанныеВнешнейБазы = Новый Структура;
    ДанныеВнешнейБазы.Вставить("Код", СокрЛП(Recordset.Fields("ItemID").Value));
    ДанныеВнешнейБазы.Вставить("Наименование", СокрЛП(Recordset.Fields("ItemName").Value));
    ДанныеВнешнейБазы.Вставить("Артикул", СокрЛП(Recordset.Fields("Article").Value));
    
    // Выгружаем по правилу конвертации объектов (ПКО)
    ВыгрузитьПоПравилу(ДанныеВнешнейБазы, , , , "Номенклатура");
    
    Recordset.MoveNext();
КонецЦикла;

Recordset.Close();
Connection.Close();

В данном примере мы используем функцию ВыгрузитьПоПравилу, передавая в неё структуру. Это позволяет нам задействовать все преимущества Правил конвертации свойств (ПКС), настроенных в КД: поиск по полям, синхронизацию и заполнение табличных частей. Для более удобной работы с кодом обработчиков и правилами подойдёт доработанная конфигурация КД 2.1 с контекстными подсказками.

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

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

  1. Типизация данных: Платформа 1С автоматически преобразует типы SQL в типы 1С (строки, числа, даты).
  2. Использование запросов: Мы можем писать обычные запросы на языке 1С к таблицам внешней базы.
  3. Производительность: Прямая работа через механизм ВнешниеИсточникиДанных обычно быстрее, чем создание COM-объектов вручную.

Если данные из SQL нужны только для разовой или периодической загрузки в справочник, в конфигурации УПП (или любой другой) достаточно создать обработку, которая прочитает данные из ВнешнийИсточникДанных.ИмяИсточника.Таблицы.ИмяТаблицы и создаст объекты 1С. В этом случае КД 2.1 становится лишним звеном, так как преобразование данных (ETL) происходит внутри кода 1С.

Метод 3: Прямое использование ADO в обработке

Если задача разовая и простая (как в случае с загрузкой Номенклатуры), использование КД 2.1 может быть избыточным. Выясним причину: КД 2.1 требует создания файла правил, выгрузки в XML, а затем загрузки в приемник. Рациональнее написать простую обработку, изучив современные подходы к интеграции через ADO, в том числе для работы в средах Linux через ODBC.

Рассмотрим пример кода для прямой загрузки в справочник Номенклатура, используя библиотеку готовых шаблонов функций для работы с ADO:


Connection = Новый COMОбъект("ADODB.Connection");
// Настройка строки подключения (ODBC драйвер)
Connection.Open("Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;User ID=user;Password=pass;");

Recordset = Connection.Execute("SELECT * FROM MyTable");
Пока Recordset.EOF = 0 Цикл
    НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйОбъект.Наименование = Recordset.Fields("Name").Value;
    // Логика поиска и заполнения
    НовыйОбъект.Записать();
    Recordset.MoveNext();
КонецЦикла;
Connection.Close();

Сравнение подходов: КД 2.1 против прямых запросов

Выясним, когда КД 2.1 всё же оправдана при работе с внешними СУБД, учитывая особенности оптимизации при загрузке миллионов записей:

Важное ограничение: Помните, что при работе через COM-объекты на сервере 1С должны быть установлены соответствующие драйверы. Если сервер 1С работает под Linux, использование ADODB.Connection будет невозможно, и в этом случае единственным выходом станет использование Внешних источников данных через ODBC.

Итоги и рекомендации

Подводя итог, можно сказать, что использование КД 2.1 для обмена с внешними базами — это не «древний век», а специфический инструмент. Однако в 90% случаев современные задачи интеграции решаются проще:

  1. Для простых загрузок используйте универсальную обработку для загрузки из SQL или прямые ADO-запросы в обработках.
  2. Для сложных трансформаций с сохранением объектных связей используйте КД 2.1, подключаясь к SQL в обработчиках ПВД.
  3. Для современных систем на платформе 8.3 присмотритесь к Конвертации данных 3.0, если внешняя система может отдавать данные через HTTP/JSON.

Мы рассмотрели основные способы подключения к SQL-базам и выяснили, как интегрировать эти данные в экосистему 1С. Выбор конкретного метода зависит от сложности структуры ваших данных и требований к производительности системы.

← На главную