Как в 1С работать с внешними базами данных SQL штатными средствами и через COM?

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

При разработке и интеграции корпоративных систем часто возникает задача взаимодействия 1С со сторонними реляционными базами данных (MS SQL Server, PostgreSQL, MySQL, Oracle). Разработчики нередко используют привычный COM-объект ADODB.Recordset или ADODB.Command, однако платформа «1С:Предприятие 8» предоставляет и специализированные штатные средства. Разберем все доступные варианты, их особенности, преимущества и ограничения.

Штатный механизм: Внешние источники данных

Начиная с версии 8.2.14, в платформе 1С реализован объект конфигурации Внешние источники данных. Это полностью встроенный и поддержанный разработчиками платформы механизм взаимодействия со сторонними СУБД через драйверы ODBC.

Проанализируем основные возможности этого механизма:

  1. Чтение данных: Таблицы внешнего источника становятся доступны в обычном встроенном языке запросов 1С, а также в схемах компоновки данных (СКД). Вы можете связывать таблицы внешней СУБД с таблицами и справочниками 1С в одном запросе.
  2. Изменение данных: Внешние источники данных позволяют выполнять не только выборку, но и добавление, изменение и удаление строк (операции INSERT, UPDATE, DELETE).
  3. Вызов хранимых процедур: Механизм поддерживает вызов встроенных функций и процедур внешней СУБД.
  4. Динамическая настройка: Структура таблиц фиксируется в метаданных (в конфигурации или расширении), однако параметры подключения (строку соединения, логин, пароль) можно изменять динамически в режиме «1С:Предприятие» без внесения правок в конфигурацию.

Рассмотрим пример кода для поиска и изменения записи во внешней таблице через объектную модель 1С:


// Получаем ссылку на строку во внешней таблице по ключевому полю
СсылкаСотрудник = ВнешниеИсточникиДанных.ВнешняяБД.Таблицы.dbo_tblEmployees.НайтиПоПолю("colUserChangedID", ДанныеФормы.colUserChangedID);

Если Не СсылкаСотрудник.Пустая() Тогда
    // Получаем объект для редактирования
    ОбъектСотрудник = СсылкаСотрудник.ПолучитьОбъект();
    ОбъектСотрудник.colPhoto = ДанныеФормы.colPhoto;
    
    // Записываем изменения во внешнюю СУБД
    ОбъектСотрудник.Записать();
КонецЕсли;

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


НоваяЗапись = ВнешниеИсточникиДанных.ВнешняяБД.Таблицы.dbo_tblEmployees.СоздатьМенеджерЗаписи();
НоваяЗапись.colUserChangedID = "USR-00125";
НоваяЗапись.colName = "Иванов Иван Иванович";
НоваяЗапись.colPhoto = ДвоичныеДанныеФото;
НоваяЗапись.Записать();

Использование COM-объектов (ADODB)

Использование технологии COM через COMОбъект("ADODB.Connection") или COMОбъект("ADODB.Command") — исторически популярный метод, позволяющий выполнять произвольные прямые SQL-запросы без изменения дерева метаданных конфигурации (например, из внешней обработки).

Посмотрим на типовой пример выполнения запроса через ADODB:


Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Driver={SQL Server};Server=db-server;Database=ExternalDB;Uid=sa;Pwd=secret;";
Соединение.Open();

Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "UPDATE dbo_tblEmployees SET colActive = 1 WHERE colUserChangedID = ?";
Команда.Parameters.Append(Команда.CreateParameter("pID", 200, 1, 50, "USR-00125"));
Команда.Execute();

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

Однако данный подход имеет ряд существенных недостатков, из-за которых его часто не рекомендуют использовать в современной разработке:

  1. Привязка к ОС Windows: Технология COM не поддерживается на серверах под управлением Linux. Если кластер серверов 1С работает на Linux, попытка создания COMОбъект приведет к ошибке.
  2. Проблема разрядности (32/64 бит): 64-разрядный рабочий процесс 1С (rphost) требует наличия установленных 64-битных OLE DB/ODBC провайдеров. Использование 32-битных библиотек приводит к сбоям.
  3. Утечки ресурсов: Некорректно освобожденные COM-соединения могут блокировать память и системные дескрипторы на сервере.

Альтернативные современные способы интеграции

Если штатные внешние источники данных не подходят (например, требуется динамическое формирование сложных конструкций SQL, специфичных для конкретной СУБД, без изменения метаданных), применяют следующие архитектурные подходы:

  1. Внешние компоненты (Native API): Кроссплатформенные библиотеки на C++/Rust, подключаемые через метод ЗагрузитьВнешнююКомпоненту(). Они работают на Windows и Linux, напрямую связываются с драйверами СУБД (PostgreSQL, MS SQL, MySQL, SQLite) и обеспечивают высокую скорость работы без накладных расходов COM.
  2. Промежуточный REST API (микросервис): Создается отдельный сервис-прослойка, взаимодействующий с базой данных SQL, а 1С обращается к нему через штатные объекты HTTPСоединение, HTTPЗапрос и HTTPОтвет. Это исключает необходимость установки драйверов СУБД на сервер 1С.
  3. Брокеры сообщений (RabbitMQ, Apache Kafka): Используются для асинхронного гарантированного обмена данными вместо прямых синхронных SQL-запросов.

Важное лицензионное ограничение

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

← На главную