В практике разработчика 1С часто возникает задача интеграции с внешними системами, работающими на СУБД MS SQL, Oracle или PostgreSQL. Одним из классических инструментов для обмена данными является конфигурация «Конвертация данных 2.1» (КД 2.1). Несмотря на то что она изначально предназначена для обмена между базами 1С, её механизмы можно адаптировать для работы с «сырыми» SQL-данными. Разберем подробно, как реализовать такой перенос, какие есть нюансы и стоит ли использовать этот метод сегодня.
Рассмотрим ситуацию, когда нам необходимо загрузить справочник Номенклатура из внешней базы MS SQL в 1С:УПП. Основная сложность здесь заключается в том, что КД 2.1 «из коробки» не умеет подключаться к сторонним СУБД как к источнику. Однако мы можем использовать обработчики событий для реализации собственной логики выборки. Для упрощения этой задачи можно использовать обработку для формирования правил КД 2 и загрузки данных через ADO.
Для этого проанализируем работу Правил выгрузки данных (ПВД). Выясним, как использовать произвольный алгоритм ПВД для получения данных из внешних источников:
Перед обработкой или Перед выгрузкой данных нам необходимо инициализировать соединение с внешней базой через 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 с контекстными подсказками.
Проанализируем современную альтернативу, доступную в платформе 8.3. Вместо написания сложных обработчиков в КД 2.1, мы можем использовать механизм внешних источников данных (ВИД) и подключить таблицы MS SQL напрямую к метаданным 1С. Разберем по шагам, почему это зачастую удобнее:
ВнешниеИсточникиДанных обычно быстрее, чем создание COM-объектов вручную.Если данные из SQL нужны только для разовой или периодической загрузки в справочник, в конфигурации УПП (или любой другой) достаточно создать обработку, которая прочитает данные из ВнешнийИсточникДанных.ИмяИсточника.Таблицы.ИмяТаблицы и создаст объекты 1С. В этом случае КД 2.1 становится лишним звеном, так как преобразование данных (ETL) происходит внутри кода 1С.
Если задача разовая и простая (как в случае с загрузкой Номенклатуры), использование КД 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 всё же оправдана при работе с внешними СУБД, учитывая особенности оптимизации при загрузке миллионов записей:
НайтиПоКоду или НайтиПоНаименованию вручную.Важное ограничение: Помните, что при работе через COM-объекты на сервере 1С должны быть установлены соответствующие драйверы. Если сервер 1С работает под Linux, использование ADODB.Connection будет невозможно, и в этом случае единственным выходом станет использование Внешних источников данных через ODBC.
Подводя итог, можно сказать, что использование КД 2.1 для обмена с внешними базами — это не «древний век», а специфический инструмент. Однако в 90% случаев современные задачи интеграции решаются проще:
Мы рассмотрели основные способы подключения к SQL-базам и выяснили, как интегрировать эти данные в экосистему 1С. Выбор конкретного метода зависит от сложности структуры ваших данных и требований к производительности системы.