При разработке и интеграции корпоративных систем часто возникает задача взаимодействия 1С со сторонними реляционными базами данных (MS SQL Server, PostgreSQL, MySQL, Oracle). Разработчики нередко используют привычный COM-объект ADODB.Recordset или ADODB.Command, однако платформа «1С:Предприятие 8» предоставляет и специализированные штатные средства. Разберем все доступные варианты, их особенности, преимущества и ограничения.
Начиная с версии 8.2.14, в платформе 1С реализован объект конфигурации Внешние источники данных. Это полностью встроенный и поддержанный разработчиками платформы механизм взаимодействия со сторонними СУБД через драйверы ODBC.
Проанализируем основные возможности этого механизма:
INSERT, UPDATE, DELETE).Рассмотрим пример кода для поиска и изменения записи во внешней таблице через объектную модель 1С:
// Получаем ссылку на строку во внешней таблице по ключевому полю
СсылкаСотрудник = ВнешниеИсточникиДанных.ВнешняяБД.Таблицы.dbo_tblEmployees.НайтиПоПолю("colUserChangedID", ДанныеФормы.colUserChangedID);
Если Не СсылкаСотрудник.Пустая() Тогда
// Получаем объект для редактирования
ОбъектСотрудник = СсылкаСотрудник.ПолучитьОбъект();
ОбъектСотрудник.colPhoto = ДанныеФормы.colPhoto;
// Записываем изменения во внешнюю СУБД
ОбъектСотрудник.Записать();
КонецЕсли;
Для добавления новых записей используется метод создания менеджера записи или объекта:
НоваяЗапись = ВнешниеИсточникиДанных.ВнешняяБД.Таблицы.dbo_tblEmployees.СоздатьМенеджерЗаписи();
НоваяЗапись.colUserChangedID = "USR-00125";
НоваяЗапись.colName = "Иванов Иван Иванович";
НоваяЗапись.colPhoto = ДвоичныеДанныеФото;
НоваяЗапись.Записать();
Использование технологии 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();
Однако данный подход имеет ряд существенных недостатков, из-за которых его часто не рекомендуют использовать в современной разработке:
COMОбъект приведет к ошибке.rphost) требует наличия установленных 64-битных OLE DB/ODBC провайдеров. Использование 32-битных библиотек приводит к сбоям.Если штатные внешние источники данных не подходят (например, требуется динамическое формирование сложных конструкций SQL, специфичных для конкретной СУБД, без изменения метаданных), применяют следующие архитектурные подходы:
ЗагрузитьВнешнююКомпоненту(). Они работают на Windows и Linux, напрямую связываются с драйверами СУБД (PostgreSQL, MS SQL, MySQL, SQLite) и обеспечивают высокую скорость работы без накладных расходов COM.HTTPСоединение, HTTPЗапрос и HTTPОтвет. Это исключает необходимость установки драйверов СУБД на сервер 1С.Следует помнить о лицензионном соглашении «1С:Предприятие 8»: прямое чтение и тем более запись средствами SQL в таблицы собственной информационной базы 1С в обход сервера приложений платформы строго запрещены лицензией и приводят к нарушению целостности данных. Механизмы прямой работы с SQL предназначены исключительно для взаимодействия со сторонними внешними базами данных.