Чтение внешней SQL-базы из 1С 8.3: внешние источники данных, ADO и ODBC

· 10 мин

Содержание

Подключиться к SQL из 1С 8.3 можно тремя путями: объектом конфигурации «Внешние источники данных» (ветка Общие → Внешние источники данных в конфигураторе), кодом через COM-объект ADODB.Connection или прямым ODBC-соединением по строке с драйвером. Для регулярного чтения таблиц удобнее первый вариант, для разовых выгрузок и сложных SQL-запросов — второй.

Типичная ситуация: склад ведётся в отдельной WMS на MS SQL, а бухгалтер хочет видеть остатки прямо в отчёте 1С без ручных выгрузок в Excel. Ниже — как настроить такое подключение, какой драйвер поставить и что делать, когда соединение не поднимается.

Какие СУБД работают с 1С и о каком подключении речь

Фраза «подключить 1С к SQL» означает две разные задачи. Их часто путают, поэтому разделим сразу.

ЗадачаЧто происходитГде настраивается
Разместить саму базу 1С на SQL-сервере1С хранит свои данные в СУБД, режим «клиент-сервер»Консоль администрирования кластера серверов 1С
Читать или писать чужую SQL-базу из 1СУчётная база 1С обращается к таблицам другой системыКонфигуратор или код на встроенном языке

Для размещения базы 1С 8.3 поддерживает такие СУБД:

  • 🗄️ Microsoft SQL Server — самый распространённый вариант на Windows;
  • 🐘 PostgreSQL — в сборках с патчами для 1С (их выпускают 1С и Postgres Professional);
  • 🏢 IBM Db2 и Oracle Database — встречаются в крупных компаниях;
  • 📁 файловый режим — без СУБД вообще, данные лежат в файле 1Cv8.1CD.

Конкретные версии СУБД для вашей версии платформы смотрите в системных требованиях к ней: список меняется от релиза к релизу.

Как разместить базу 1С на SQL-сервере

Если задача первая, порядок такой:

  1. Установите сервер 1С:Предприятия и СУБД (они могут стоять на разных машинах).
  2. Откройте консоль администрирования серверов 1С, раскройте кластер, ветку Информационные базы.
  3. Через контекстное меню создайте новую базу.
  4. Укажите тип СУБД, имя сервера СУБД, имя базы данных, логин и пароль пользователя СУБД.
  5. Включите флажок создания базы данных в случае её отсутствия.
  6. Добавьте базу в список у пользователей: Добавить → Создание новой… → На сервере 1С:Предприятия.

Готовую файловую базу переносят на сервер выгрузкой .dt в конфигураторе (Администрирование → Выгрузить информационную базу) и загрузкой в новую серверную базу .

Дальше статья про вторую задачу — работу с внешней SQL-базой.

Три способа подключения 1С к SQL: что выбрать

СпособКогда подходитОграничения
Внешние источники данныхРегулярное чтение одних и тех же таблиц, отчёты на СКД, запросы языком 1СНужно менять конфигурацию (или расширение)
ADO через COMОбъектСложные SQL-запросы, хранимые процедуры, разовые обработкиТолько Windows; провайдер ставится на сервер 1С
ODBC по строке соединенияТо же, что ADO, но через установленный ODBC-драйверРазрядность драйвера должна совпадать с процессом 1С

💡 Внешние источники данных работают и на Linux-сервере 1С через unixODBC. COM-объекты там недоступны, так что ADO на Linux не вариант.

Ещё одно правило выбора: не пишите напрямую в таблицы чужой учётной системы, если её разработчик этого не разрешает. Безопасно читать, а запись лучше делать через промежуточную таблицу, которую система-владелец забирает сама.

Внешние источники данных: настройка по шагам

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

Шаг 1. Подготовьте драйвер и учётную запись

  • 🔌 Поставьте ODBC-драйвер на сервер 1С (в файловом режиме — на компьютер пользователя): для MS SQL — ODBC Driver for SQL Server от Microsoft, для PostgreSQL — psqlODBC.
  • 🧮 Берите драйвер той же разрядности, что и процесс 1С. Сервер 1С x64 — драйвер x64.
  • 👤 Заведите в СУБД отдельного пользователя только с правами чтения нужных таблиц или представлений.

Проверьте соединение до 1С: создайте тестовый DSN в «Администраторе источников данных ODBC» Windows и нажмите проверку. Если тест здесь не проходит, в 1С он тоже не пройдёт.

Шаг 2. Добавьте источник в конфигурацию

  1. Откройте конфигуратор, сделайте резервную копию (Администрирование → Выгрузить информационную базу).
  2. В дереве конфигурации раскройте Общие → Внешние источники данных, добавьте новый источник, задайте имя, например Склад.
  3. В ветке таблиц источника добавьте таблицу. Конфигуратор попросит строку соединения, подключится к базе и покажет список таблиц и представлений. Отметьте нужные.
  4. Для каждой таблицы проверьте поля и их типы. Если в таблице есть ключевое поле, её можно сделать объектной — тогда у записей появится ссылка.
  5. Обновите конфигурацию базы данных.

💡 В типовой конфигурации на поддержке удобнее добавить источник в расширение. Тогда обновления типовой не затронут ваше подключение.

Пример строки соединения для MS SQL:

Driver={ODBC Driver 17 for SQL Server};Server=sql01;Database=Warehouse;Trusted_Connection=yes;

Для PostgreSQL:

Driver={PostgreSQL Unicode(x64)};Server=pg01;Port=5432;Database=wms;Uid=reader;Pwd=***;

Шаг 3. Задайте параметры соединения в рабочей базе

Строка в конфигураторе нужна для загрузки структуры. В режиме 1С:Предприятие параметры задают отдельно:

  1. Включите показ команды «Все функции»: Сервис и настройки → Параметры.
  2. Откройте Все функции → Стандартные → Управление внешними источниками данных.
  3. Выберите источник, укажите строку соединения, пользователя и пароль, сохраните.

То же самое можно сделать кодом — удобно, если строка хранится в константе:

Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "Driver={ODBC Driver 17 for SQL Server};Server=sql01;Database=Warehouse;";
Параметры.Пользователь = "reader";
Параметры.Пароль = ПарольИзНастроек;
ВнешниеИсточникиДанных.Склад.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.Склад.УстановитьСоединение();

Шаг 4. Пишите запросы

К таблице источника обращаются так же, как к справочнику или регистру:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Ост.Code КАК Код,
|	Ост.Qty КАК Количество
|ИЗ
|	ВнешнийИсточникДанных.Склад.Таблица.dbo_Stock КАК Ост
|ГДЕ
|	Ост.WarehouseId = &Склад";
Запрос.УстановитьПараметр("Склад", 12);
Выборка = Запрос.Выполнить().Выбрать();

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

ADO и ODBC из кода на встроенном языке

Когда структуру конфигурации менять нельзя или нужен «настоящий» SQL с хранимыми процедурами, подключаются через COM-объект ADO. Код выполняется на сервере 1С, поэтому провайдер или драйвер ставят туда.

&НаСервере
Функция ПрочитатьОстатки(КодСклада)

	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("Код");
	Результат.Колонки.Добавить("Количество");

	Соединение = Новый COMОбъект("ADODB.Connection");
	Соединение.ConnectionString =
		"Provider=MSOLEDBSQL;Server=sql01;Database=Warehouse;Trusted_Connection=yes;";
	Соединение.ConnectionTimeout = 15;

	Попытка
		Соединение.Open();

		Команда = Новый COMОбъект("ADODB.Command");
		Команда.ActiveConnection = Соединение;
		Команда.CommandText = "SELECT Code, Qty FROM dbo.Stock WHERE WarehouseId = ?";
		Команда.CommandTimeout = 120;
		// 3 = adInteger, 1 = adParamInput
		Команда.Parameters.Append(Команда.CreateParameter("WarehouseId", 3, 1, 4, КодСклада));

		Выборка = Команда.Execute();
		Пока Не Выборка.EOF Цикл
			Строка = Результат.Добавить();
			Строка.Код = Выборка.Fields.Item("Code").Value;
			Строка.Количество = Выборка.Fields.Item("Qty").Value;
			Выборка.MoveNext();
		КонецЦикла;

		Выборка.Close();
		Соединение.Close();
	Исключение
		Если Соединение.State = 1 Тогда
			Соединение.Close();
		КонецЕсли;
		ВызватьИсключение ОписаниеОшибки();
	КонецПопытки;

	Возврат Результат;

КонецФункции

Что здесь сделано правильно и почему:

  • 🛡️ Параметр через ? и CreateParameter, а не склейка строк. Иначе значение с кавычкой сломает запрос или откроет дорогу SQL-инъекции.
  • ⏱️ Два таймаута. ConnectionTimeout — ожидание подключения, CommandTimeout — выполнения запроса. По умолчанию второй равен 30 секундам, тяжёлый отчёт не успевает.
  • 🔒 Закрытие соединения в обработке исключения. Иначе при ошибке соединения копятся на SQL-сервере.

Тот же код работает через ODBC: в ConnectionString вместо Provider=… укажите Driver={ODBC Driver 17 for SQL Server};Server=…;Database=…; — ADO подключится через провайдер ODBC.

Кто подключается при Trusted_Connection

При Windows-аутентификации к SQL-серверу приходит не пользователь 1С, а учётная запись службы сервера 1С (агента ragent). Именно ей выдают логин и права в SQL Server. В файловом режиме подключается Windows-пользователь, который запустил 1С.

Чтение таблиц самой базы 1С через SQL

Иногда нужно наоборот: внешняя система читает базу 1С прямыми SQL-запросами. Таблицы там называются _Reference45, _Document112, _Fld1234. Соответствие этих имён объектам конфигурации возвращает функция ПолучитьСтруктуруХраненияБазыДанных().

Читать базу 1С из SQL можно только для отчётов, и с оглядкой на лицензионное соглашение. Запись в эти таблицы в обход платформы ломает итоги регистров и ссылочную целостность, и такую базу потом приходится долго лечить.

Ошибки подключения и что с ними делать

Диагностика: выберите симптом

Отдельно про PostgreSQL: если вместо кириллицы приходят «кракозябры», выберите Unicode-вариант драйвера psqlODBC, а не ANSI. Если отказывает в подключении с сообщением про pg_hba.conf, на сервере PostgreSQL не разрешён вход с адреса сервера 1С — правит это администратор СУБД.

Как ускорить работу с внешней SQL-базой

Медленное подключение почти всегда упирается не в 1С, а в объём данных, который гоняют по сети.

  1. Фильтруйте на стороне СУБД. Условие ГДЕ в запросе к внешнему источнику уходит в SQL. А выборка всей таблицы с отбором уже в цикле 1С тянет миллионы строк.
  2. Берите только нужные поля. SELECT * по широкой таблице в несколько раз увеличивает трафик.
  3. Создайте представление (view) в СУБД. Сложные соединения таблиц удобнее собрать на стороне SQL и подключить в 1С одну таблицу-представление.
  4. Не открывайте соединение в цикле. Одно соединение на всю обработку, а не на каждую строку.
  5. Кэшируйте редко меняющиеся данные. Регламентное задание раз в час переносит остатки в регистр сведений, отчёты читают уже его. Пользователи не ждут внешний сервер, а сбой связи не роняет отчёт.
  6. Проверьте индексы. Поле, по которому фильтруете, должно быть проиндексировано. Это делает администратор СУБД.
Перед запуском интеграции в работу
Выполнено: 0 / 6

Без прямого SQL: HTTP-сервисы, компоненты, обмен файлами

Прямое подключение к чужой базе — не единственный путь. Иногда он и вовсе запрещён службой безопасности.

СпособКак работаетКогда лучше прямого SQL
HTTP-сервис или REST API внешней системы1С отправляет запросы через HTTPСоединение и разбирает JSONВнешняя система уже даёт API; доступа к её СУБД нет
HTTP-сервис в самой 1СВнешняя система сама отправляет данные в 1СДанные должны приходить сразу при изменении
Внешняя компонента (Native API)Библиотека на C++ с собственным драйвером СУБДНужна экзотическая СУБД или особая производительность
Обмен файлами (CSV, XML, JSON)Одна система выгружает файл, другая забирает по расписаниюСистемы в разных сетях, допустимо отставание данных

HTTP-сервис в 1С публикуется на веб-сервере (Apache или IIS) из конфигуратора: Администрирование → Публикация на веб-сервере. Минус по сравнению с SQL — больше кода на обеих сторонах. Плюс — изменение структуры таблиц во внешней системе не ломает интеграцию, пока API прежний.

Частые вопросы

Нужна ли отдельная лицензия 1С, чтобы подключаться к внешней SQL-базе?
Нет. Внешние источники данных и COM-объекты входят в платформу. Лицензии СУБД и драйверов — вопрос владельца внешней базы.
Можно ли записывать данные во внешнюю таблицу через внешний источник?
Да, если таблица объектная, то есть у неё задано ключевое поле. Запись идёт через объекты на встроенном языке. Для таблиц без ключа доступно только чтение.
Работают ли внешние источники данных в файловой базе?
Работают. Драйвер тогда нужен на каждом компьютере, где запускают 1С, потому что код выполняется у пользователя.
Как подключиться к SQL из внешней обработки, не меняя конфигурацию?
Через COMОбъект("ADODB.Connection") в серверной процедуре обработки. Внешний источник данных в обработке создать нельзя: это объект конфигурации или расширения.
Где безопасно хранить пароль от SQL?
Не в тексте модуля. Подойдёт Windows-аутентификация от службы сервера 1С без пароля в строке, либо безопасное хранилище паролей БСП, которое есть в типовых конфигурациях.