Как в 1С настроить прямое чтение данных из сторонней базы MS SQL Server?

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

При интеграции 1С с внешними информационными системами часто возникает задача загрузки данных напрямую из реляционных баз данных под управлением СУБД MS SQL Server. Рассмотрим основные способы организации прямого чтения данных средствами платформы 1С:Предприятие 8, разберем по шагам их настройку, преимущества, программную реализацию и ключевые технические нюансы.

Способ 1. Использование штатного механизма «Внешние источники данных» (ВИД)

Штатный механизм внешних источников данных платформы 1С является наиболее удобным и рекомендуемым способом интеграции. Он позволяет добавить внешние таблицы СУБД в дерево метаданных конфигурации и работать с ними как с привычными объектами конфигурации 1С (справочниками, табличными частями) через стандартный язык запросов 1С.

Разберем по шагам процесс подключения к MS SQL Server через внешний источник данных:

  1. Настройка системного DSN или формирование строки подключения ODBC: Убедитесь, что на сервере 1С установлен соответствующий ODBC-драйвер (например, ODBC Driver for SQL Server). Обратите внимание: разрядность драйвера должна строго соответствовать разрядности рабочего процесса сервера 1С (32-бит или 64-бит).
  2. Добавление источника в конфигурации: В дереве метаданных конфигуратора перейдем в ветку ВнешниеИсточникиДанных, добавим новый источник и запустим мастер добавления таблиц.
  3. Сопоставление таблиц и полей: Мастер считает структуру базы MS SQL. В свойствах добавленных таблиц поле ИмяВИсточникеДанных сохранит оригинальное системное имя таблицы SQL, а в свойстве Имя мы можем указать понятное наименование на русском или английском языке для удобного использования в коде 1С. Также источниками могут выступать не только физические таблицы, но и SQL-представления (Views), а также хранимые процедуры.
  4. Программное подключение и чтение данных: Перед обращением к таблицам в коде необходимо инициировать соединение, указав строку подключения и параметры аутентификации.

Посмотрим на пример программной установки соединения и выборки данных с помощью встроенного языка запросов 1С:


ПараметрыПодключения = Новый ПараметрыПодключенияВнешнегоИсточникаДанных;
ПараметрыПодключения.СтрокаСоединения = "Driver={ODBC Driver 17 for SQL Server};Server=sql-server-name;Database=ExternalDB;Uid=sql_user;Pwd=StrongPassword123;";

ВнешниеИсточникиДанных.ВнешняяБазаSQL.УстановитьСоединение(ПараметрыПодключения);

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВнешняяНоменклатура.КодТовара КАК КодТовара,
    |	ВнешняяНоменклатура.Наименование КАК Наименование,
    |	ВнешняяНоменклатура.Цена КАК Цена
    |ИЗ
    |	ВнешнийИсточникДанных.ВнешняяБазаSQL.Таблица.Товары КАК ВнешняяНоменклатура";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Обработка и запись данных в объекты 1С
КонецЦикла;

Способ 2. Прямое подключение через COM-объект (ADO / OLE DB)

Если нет возможности изменять структуру метаданных конфигурации или требуется выполнить разовую загрузку через внешнюю обработку, разберем альтернативный вариант — работу через COM-объект ADODB.Connection.

Рассмотрим подробнее реализацию подключения и чтения набора записей (Recordset):


Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=MSOLEDBSQL;Data Source=sql-server-name;Initial Catalog=ExternalDB;User ID=sql_user;Password=StrongPassword123;";

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

ТекстSQL = "SELECT ItemCode, ItemName, Price FROM Goods WHERE Active = 1";
НаборЗаписей = Соединение.Execute(ТекстSQL);

Пока НаборЗаписей.EOF = 0 Цикл
    Код = Сокращенно(НаборЗаписей.Fields("ItemCode").Value);
    Наименование = Сокращенно(НаборЗаписей.Fields("ItemName").Value);
    Цена = НаборЗаписей.Fields("Price").Value;
    
    // Перенос данных в 1С
    
    НаборЗаписей.MoveNext();
КонецЦикла;

// Обязательное закрытие соединений и очистка памяти
НаборЗаписей.Close();
Соединение.Close();
НаборЗаписей = Неопределено;
Соединение = Неопределено;

Важные технические нюансы и риски прямого чтения

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

  1. Кроссплатформенность сервера: Технология COM доступна только в среде Windows. Если сервер 1С функционирует под управлением ОС Linux, использование ADODB.Connection невозможно — в этом случае применяются исключительно Внешние источники данных с настроенным UnixODBC, либо интеграция через HTTP-сервисы.
  2. Блокировки в рабочей базе SQL: Выполнение массивных SQL-запросов на чтение может устанавливать разделяемые блокировки (Shared Locks) на таблицы сторонней базы. Для предотвращения блокировок рекомендуется использовать уровень изоляции READ COMMITTED SNAPSHOT на стороне MS SQL Server либо директиву WITH (NOLOCK) в текстах SQL-запросов.
  3. Прямое чтение из другой базы 1С: Если целевой базой MS SQL является другая база 1С, прямое чтение ее таблиц крайне не рекомендуется. Внутренняя структура СУБД 1С использует бинарное представление ссылок (GUID), специфическое смещение дат (на 2000 лет), а виртуальные таблицы (остатки, обороты) рассчитываются динамически. Для интеграции между двумя базами 1С следует использовать V83.COMConnector, Web-/HTTP-сервисы или планы обмена.
  4. Производительность запросов ВИД: Избегайте прямого соединения таблиц внешнего источника данных со стандартными таблицами конфигурации 1С в одном запросе платформы. Это приводит к загрузке внешней таблицы во временные таблицы сервера 1С и может существенно замедлить выполнение операции. Оптимально считывать данные порциями или агрегировать их на стороне SQL Server в виде View.
← На главную