Чтение внешней SQL-базы из 1С 8.3: внешние источники данных, ADO и ODBC
Содержание
Подключиться к
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С, раскройте кластер, ветку
Информационные базы. - Через контекстное меню создайте новую базу.
- Укажите тип СУБД, имя сервера СУБД, имя базы данных, логин и пароль пользователя СУБД.
- Включите флажок создания базы данных в случае её отсутствия.
- Добавьте базу в список у пользователей:
Добавить → Создание новой… → На сервере 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. Добавьте источник в конфигурацию
- Откройте конфигуратор, сделайте резервную копию (
Администрирование → Выгрузить информационную базу). - В дереве конфигурации раскройте
Общие → Внешние источники данных, добавьте новый источник, задайте имя, напримерСклад. - В ветке таблиц источника добавьте таблицу. Конфигуратор попросит строку соединения, подключится к базе и покажет список таблиц и представлений. Отметьте нужные.
- Для каждой таблицы проверьте поля и их типы. Если в таблице есть ключевое поле, её можно сделать объектной — тогда у записей появится ссылка.
- Обновите конфигурацию базы данных.
💡 В типовой конфигурации на поддержке удобнее добавить источник в расширение. Тогда обновления типовой не затронут ваше подключение.
Пример строки соединения для 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С:Предприятие параметры задают отдельно:
- Включите показ команды «Все функции»:
Сервис и настройки → Параметры. - Откройте
Все функции → Стандартные → Управление внешними источниками данных. - Выберите источник, укажите строку соединения, пользователя и пароль, сохраните.
То же самое можно сделать кодом — удобно, если строка хранится в константе:
Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "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С, а в объём данных, который гоняют по сети.
- Фильтруйте на стороне СУБД. Условие
ГДЕв запросе к внешнему источнику уходит в SQL. А выборка всей таблицы с отбором уже в цикле 1С тянет миллионы строк. - Берите только нужные поля.
SELECT *по широкой таблице в несколько раз увеличивает трафик. - Создайте представление (view) в СУБД. Сложные соединения таблиц удобнее собрать на стороне SQL и подключить в 1С одну таблицу-представление.
- Не открывайте соединение в цикле. Одно соединение на всю обработку, а не на каждую строку.
- Кэшируйте редко меняющиеся данные. Регламентное задание раз в час переносит остатки в регистр сведений, отчёты читают уже его. Пользователи не ждут внешний сервер, а сбой связи не роняет отчёт.
- Проверьте индексы. Поле, по которому фильтруете, должно быть проиндексировано. Это делает администратор СУБД.
Без прямого 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-базе?
Можно ли записывать данные во внешнюю таблицу через внешний источник?
Работают ли внешние источники данных в файловой базе?
Как подключиться к SQL из внешней обработки, не меняя конфигурацию?
COMОбъект("ADODB.Connection") в серверной процедуре обработки. Внешний источник данных в обработке создать нельзя: это объект конфигурации или расширения.