Как писать запросы из 1С к сторонним базам данных SQL Server, Oracle или PostgreSQL?

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

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

Способ №1: Стандартный механизм «Внешние источники данных»

Начиная с версии платформы 8.2.14, в «1С:Предприятии» появился мощный встроенный объект метаданных — Внешние источники данных (ВИД). Этот инструмент позволяет разработчику подключить внешнюю СУБД прямо в конфигураторе и работать с её таблицами так, будто это стандартные справочники или документы 1С.

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

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

Посмотрим на пример кода, с помощью которого мы можем прочитать данные из подключенной внешней таблицы стандартным запросом 1С:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВнешнийИсточник.КодТовара КАК Код,
    |	ВнешнийИсточник.Наименование КАК Наименование,
    |	ВнешнийИсточник.Цена КАК Цена
    |ИЗ
    |	ВнешнийИсточникДанных.ВнешнийКаталогТоваров.Таблица.dbo_Products КАК ВнешнийИсточник
    |ГДЕ
    |	ВнешнийИсточник.Цена > &МинимальнаяЦена";

Запрос.УстановитьПараметр("МинимальнаяЦена", 100);
РезультатЗапроса = Запрос.Выполнить();

Основным преимуществом этого подхода является то, что программисту больше не нужно знать специфичный диалект SQL конкретной внешней СУБД. Платформа 1С берет на себя всю трансляцию кода из своего внутреннего языка запросов в нативный SQL-синтаксис целевой базы данных.

Способ №2: Динамическое подключение через ADO (ActiveX Data Objects)

Бывают ситуации, когда вносить изменения в конфигурацию через конфигуратор категорически запрещено (база находится на строгой поддержке, или у нас нет административных прав), но связаться со сторонней БД необходимо. В таких случаях на помощь приходит низкоуровневое подключение через COM-объект ADODB.Connection.

Этот метод не требует регистрации таблиц в метаданных и работает динамически «на лету». Выясним, как реализовать такое подключение в программном коде:


// Создаем объекты для работы с ADO
Подключение = Новый COMОбъект("ADODB.Connection");
НаборЗаписей = Новый COMОбъект("ADODB.Recordset");

// Формируем строку подключения (пример для MS SQL Server)
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=MyUser;Password=MyPassword;Initial Catalog=ExternalDB;Data Source=ServerName";

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

// Пишем прямой SQL-запрос на языке целевой СУБД
ТекстSQL = "SELECT ProductID, ProductName, Price FROM dbo.Products WHERE Price > 100";

Попытка
    НаборЗаписей.Open(ТекстSQL, Подключение, 3, 1); // 3 - adOpenStatic, 1 - adLockReadOnly
Исключение
    Сообщить("Ошибка выполнения SQL-запроса: " + ОписаниеОшибки());
    Подключение.Close();
    Возврат;
КонецПопытки;

// Переносим полученные данные в стандартную Таблицу Значений 1С
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Код");
ТаблицаДанных.Колонки.Добавить("Наименование");
ТаблицаДанных.Колонки.Добавить("Цена");

Пока НаборЗаписей.EOF() = Ложь Цикл
    НоваяСтрока = ТаблицаДанных.Добавить();
    НоваяСтрока.Код = НаборЗаписей.Fields("ProductID").Value;
    НоваяСтрока.Наименование = НаборЗаписей.Fields("ProductName").Value;
    НоваяСтрока.Цена = НаборЗаписей.Fields("Price").Value;
    
    НаборЗаписей.MoveNext();
КонецЦикла;

// Закрываем соединения
НаборЗаписей.Close();
Подключение.Close();

Этот способ незаменим для простых одноразовых интеграций или работы в жестко ограниченных условиях, однако он лишает нас возможности использовать визуальный конструктор запросов 1С.

Способ №3: Специализированная ADO-консоль запросов с конструктором

Для тех, кто хочет объединить удобство визуального конструирования запросов 1С и гибкость динамического подключения через ADO без изменения конфигурации, существуют специализированные внешние обработки (например, популярные решения на базе ADO-консолей). Рассмотрим принцип их работы.

Такие обработки запускаются в режиме «1С:Предприятие» и выполняют следующие действия:

  1. Подключаются к указанной внешней базе через ADODB.Connection.
  2. Запрашивают системные таблицы метаданных внешней СУБД (например, INFORMATION_SCHEMA в MS SQL) для получения списка таблиц, полей и типов данных.
  3. Динамически воссоздают во временной структуре 1С аналог дерева метаданных этой СУБД.
  4. Позволяют разработчику открыть штатный интерактивный Конструктор запросов 1С, перетаскивать таблицы мышкой, настраивать связи и условия.
  5. При нажатии кнопки «Выполнить» обработка парсит построенный текст запроса 1С, заменяет имена таблиц и полей на реальные SQL-идентификаторы и отправляет сырой SQL-запрос во внешнюю базу через ADO, возвращая результат в удобную таблицу на форме.

Этот гибридный метод существенно ускоряет разработку и отладку сложных запросов к внешним системам.

Критические проблемы и подводные камни при работе с внешними СУБД

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

Проанализируем основные подводные камни:

1. Смещение дат при чтении баз 1С как внешних источников
Если вы решите подключить в качестве внешнего источника данных SQL-таблицы другой информационной базы 1С, вы столкнетесь с тем, что все даты будут смещены на 2000 лет вперед (например, вместо 2026 года отобразится 4026 год). Это связано с тем, что СУБД MS SQL Server не поддерживает исторические даты ниже определенного порога, и платформа 1С на уровне СУБД хранит все даты со сдвигом на 2000 лет. При обычном запросе через ВИД вам придется программно вычитать это смещение с помощью встроенных функций работы с датами.

2. Транзакции и взаимные блокировки (Deadlocks)
Выполняя запросы через ВИД, платформа 1С неявно управляет транзакциями. Если внешняя база данных активно используется другими приложениями в режиме высокой транзакционной нагрузки (OLTP), чтение данных из 1С без указания грязного чтения (уровня изоляции Read Uncommitted) может заблокировать таблицы внешней СУБД. Это приведет к ошибкам таймаута и зависанию смежных систем. При работе через ADO всегда рекомендуется явно указывать инструкции блокировок (например, использовать хинт WITH (NOLOCK) в MS SQL).

3. Медленные смешанные запросы (соединения таблиц 1С и ВИД)
Попытка соединить в одном запросе локальную таблицу 1С (например, справочник Номенклатуры) и внешнюю таблицу (например, остатки из WMS-системы) — одна из главных ошибок начинающих разработчиков. Поскольку физически данные находятся в разных базах данных, СУБД не может выполнить классический JOIN на своем уровне. В этой ситуации платформа 1С вынуждена полностью выкачать внешнюю таблицу в оперативную память сервера приложений 1С и выполнять соединение программно. Если внешняя таблица содержит сотни тысяч строк, сервер приложений быстро исчерпает свободную память и завершит работу с ошибкой.

Правильный подход для смешанных запросов:

  1. Сначала выбрать необходимые ключевые поля из внешнего источника с жестким отбором во временную таблицу.
  2. Проиндексировать временную таблицу по ключевым полям связи.
  3. Выполнить финальное соединение локальных таблиц 1С с этой подготовленной временной таблицей.

4. Ограничения при пакетной записи данных
Запись во внешние источники данных поддерживается платформой, однако имеет низкую производительность. Для необъектных таблиц действует жесткий лимит безопасности: невозможно записать более 50 000 записей в рамках одной транзакции. Кроме того, при необходимости полной очистки внешней таблицы метод Записать() в цикле генерирует медленные одиночные транзакции DELETE, вместо выполнения быстрой операции очистки всей таблицы TRUNCATE.

Современные альтернативы интеграции без использования COM и ADO

Технологии COM, OLE и ADO постепенно устаревают. Они не поддерживаются в операционных системах семейства Linux (на которых все чаще разворачивают сервера «1С:Предприятия»), часто приводят к утечкам памяти и требуют тонкой настройки прав доступа DCOM на серверах Windows. Если вашей целью является интеграция двух баз данных 1С, рассмотрите современные альтернативные варианты:

Использование встроенного интерфейса OData (REST API)
Достаточно опубликовать информационную базу 1С на веб-сервере (IIS или Apache). Платформа автоматически сформирует готовый REST-интерфейс. Любая внешняя система сможет получать данные из справочников и документов с помощью простых HTTP-запросов GET, передавая параметры отбора в формате JSON. Это полностью заменяет необходимость прямого лазания в чужую SQL-базу.

Разработка HTTP-сервисов
Этот подход позволяет написать собственный легковесный программный интерфейс (API) на стороне 1С. Вы определяете структуру HTTP-запроса, пишете код его обработки на встроенном языке 1С и возвращаете внешнему клиенту структурированный ответ. Метод работает кроссплатформенно, быстро и безопасно.

Использование BI-систем для сквозной аналитики
Если запросы к внешним SQL-базам нужны вам исключительно для построения комплексных отчетов и дашбордов, не стоит перегружать этим сервер 1С. Для таких задач отлично подходят специализированные BI-системы (например, Apache Superset, Grafana или Yandex DataLens). Они умеют подключаться к самым разным источникам данных одновременно, визуализировать информацию в реальном времени и не требуют написания сложного интеграционного кода на стороне учетной системы 1С.

← На главную