К статье
Практический материал

Разработка и Конфигурация · 13 мин

Подключение через ADO в 1С: что это и как настроить

Что такое ADO-подключение в 1С, как написать строку подключения к SQL Server, Access и Excel, примеры кода, типичные ошибки и способы проверки результата.

Подключение через ADO в 1С — это способ обратиться из кода встроенного языка 1С к внешней базе данных напрямую, минуя штатные механизмы платформы. ADO (ActiveX Data Objects) — технология Microsoft, предоставляющая COM-объекты для работы с источниками данных: SQL Server, Access, Excel, текстовыми файлами и другими ODBC-источниками.

В 1С работа с ADO строится через объект COMОбъект (на клиенте) или Новый COMОбъект на сервере. Разработчик создаёт объект ADODB.Connection, открывает его с нужной строкой подключения, выполняет SQL-запросы через ADODB.Command или получает наборы записей через ADODB.Recordset. Всё это доступно и в обычных, и в управляемых формах, если на компьютере или сервере установлен соответствующий провайдер данных.

Технология применяется там, где штатных средств 1С недостаточно: прямой обмен с учётной системой на SQL Server без промежуточных файлов, чтение прайсов из Excel без сохранения во временный файл, выгрузка в старую базу Access, интеграция с оборудованием, чьи данные лежат в ODBC-источнике. При этом ADO — механизм низкоуровневый: платформа не контролирует транзакции, права и целостность внешней базы, поэтому ответственность за корректность запросов лежит на разработчике.

Что такое ADO и как оно работает в связке с 1С

ADO — набор COM-компонентов Windows, предоставляющий единый интерфейс к разным источникам данных. Конкретный «драйвер» доступа называется провайдером: для SQL Server это SQLOLEDB или MSOLEDBSQL, для старых файлов Access и Excel — Microsoft.Jet.OLEDB.4.0, для новых — Microsoft.ACE.OLEDB.12.0, для произвольных источников — MSDASQL (обёртка над ODBC).

1С обращается к этим компонентам через COM-технологию. На тонком и толстом клиенте доступен объект COMОбъект, на сервере 1С — тот же COM, но уже в контексте серверного процесса. Важное следствие: провайдер данных должен быть установлен и зарегистрирован на том компьютере, где выполняется код, а его разрядность (32 или 64 бита) должна совпадать с разрядностью процесса 1С.

Три основных объекта ADO, которые используются из 1С: ADODB.Connection — само соединение, ADODB.Command — параметризованная команда, ADODB.Recordset — результат выборки, по которому можно итерироваться в цикле. Для простых выборок достаточно Connection и его метода Execute.

Когда ADO-подключение оправдано, а когда лучше обойтись без него

ADO уместен, когда нужен прямой, быстрый и контролируемый доступ к внешней базе: чтение данных из учётной системы на SQL Server в реальном времени, запись результатов расчёта во внешнюю таблицу, разовая миграция данных. В таких сценариях ADO даёт минимальные накладные расходы и полный контроль над SQL.

Однако у подхода есть серьёзные ограничения. COM-технология работает только на Windows, поэтому на Linux-сервере 1С ADO недоступен. Веб-клиент и мобильная платформа COM-объекты не поддерживают вовсе. Для регулярных обменов между двумя базами 1С предпочтительнее COMConnector, планы обмена или HTTP-сервисы, а для обмена с внешними системами часто надёжнее файловые форматы или веб-сервисы.

Сравнение вариантов обмена

ADO (ADODB)

Прямой SQL-доступ к внешней БД. Только Windows, только толстый/тонкий клиент или Windows-сервер. Полный контроль над запросами, но нет защиты платформы.

COMConnector / COMОбъект V83.COMConnector

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

HTTP-сервисы и веб-сервисы

Универсальный вариант для регулярной интеграции, работает на любой платформе, но требует разработки сервисной части.

Внешние источники данных

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

Как создать подключение: базовый код

Минимальный сценарий подключения к SQL Server из кода 1С выглядит так: создаётся COM-объект, устанавливается строка подключения, вызывается метод Open. Обязательно оберните код в попытку/исключение — при недоступности сервера или неверной строке подключения COM выбросит ошибку, которую нужно обработать.

Connection = Новый COMОбъект("ADODB.Connection");

СтрокаПодключения = "Provider=SQLOLEDB;Data Source=SERVER\INSTANCE;"

+ "Initial Catalog=MyBase;Integrated Security=SSPI;";

Попытка

Connection.Open(СтрокаПодключения);

Исключение

Сообщить("Ошибка подключения: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

Recordset = Connection.Execute("SELECT Code, Name FROM Goods");

Пока НЕ Recordset.EOF Цикл

Сообщить(Recordset.Fields("Name").Value);

Recordset.MoveNext();

КонецЦикла;

Recordset.Close();

Connection.Close();

Обратите внимание на порядок завершения: сначала закрывается Recordset, затем Connection, после чего переменные желательно обнулить, чтобы сборщик освободил COM-ресурсы. Незакрытые соединения накапливаются и могут исчерпать пул подключений на стороне SQL Server.

Порядок действий при настройке ADO-подключения
  1. 1
    Определите тип источника данных и подберите провайдер (SQLOLEDB, ACE.OLEDB, MSDASQL)
  2. 2
    Убедитесь, что провайдер установлен на компьютере, где выполняется код 1С, и совпадает по разрядности с процессом
  3. 3
    Сформируйте строку подключения и проверьте её вне 1С (например, через UDL-файл)
  4. 4
    Создайте COMОбъект ADODB.Connection и откройте соединение в блоке Попытка/Исключение
  5. 5
    Выполните тестовый запрос и обойдите Recordset в цикле
  6. 6
    Закройте Recordset и Connection, обработайте возможные ошибки

Строки подключения для разных источников

Синтаксис строки подключения зависит от провайдера. Ниже — типовые варианты, которые покрывают большинство практических задач. Параметры указываются через точку с запятой, значения с пробелами берутся в кавычки.

ИсточникПровайдерПример строки подключения
SQL Server (Windows-авторизация)SQLOLEDBProvider=SQLOLEDB;Data Source=SRV;Initial Catalog=DB;Integrated Security=SSPI;
SQL Server (логин/пароль)SQLOLEDBProvider=SQLOLEDB;Data Source=SRV;Initial Catalog=DB;User ID=user;Password=pass;
Excel (xlsx)ACE.OLEDB.12.0Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\file.xlsx;Extended Properties="Excel 12.0;HDR=Yes";
Access (mdb)Jet.OLEDB.4.0Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\base.mdb;
ODBC-источникMSDASQLProvider=MSDASQL;DSN=MyDSN;UID=user;PWD=pass;

Как проверить строку подключения без 1С

Удобный приём — создать пустой файл с расширением .udl, открыть его двойным щелчком, на вкладке «Поставщик данных» выбрать провайдер, заполнить параметры и нажать «Проверить подключение». Если проверка прошла, откройте файл в «Блокноте» — готовая строка подключения будет внутри, её останется скопировать в код 1С.

Чтение данных и параметризованные запросы

Метод Execute подходит для простых запросов, но при подстановке пользовательских значений конкатенация строк опасна: она открывает путь к SQL-инъекциям и ломается на кавычках в данных. Правильный способ — объект ADODB.Command с параметрами.

Command = Новый COMОбъект("ADODB.Command");

Command.ActiveConnection = Connection;

Command.CommandText = "SELECT Name FROM Goods WHERE Code = ?";

Параметр = Command.CreateParameter("Code", 200, 1, 50, ИскомыйКод);

Command.Parameters.Append(Параметр);

Recordset = Command.Execute();

Тип параметра задаётся числовой константой: 200 — строка переменной длины (adVarChar), 3 — целое число (adInteger), 5 — дробное (adDouble), 135 — дата (adDBTimeStamp). Направление 1 означает входной параметр. Несовпадение типа параметра с типом колонки — частая причина ошибок вида «недопустимый тип данных».

Типичные ошибки и как их диагностировать

Большинство проблем при ADO-подключении возникает не в коде 1С, а в окружении: отсутствующий провайдер, несовпадение разрядности, недостаточные права учётной записи. Диагностику стоит начинать с текста ошибки — COM-ошибки обычно содержат код и описание от провайдера.

Типичные ошибки
01
Ошибка «Поставщик не зарегистрирован» — провайдер не установлен или его разрядность не совпадает с разрядностью процесса 1С; установите нужную версию драйвера
02
Использование Jet.OLEDB.4.0 на 64-разрядном сервере — этот провайдер существует только в 32-битной версии, переходите на ACE.OLEDB.12.0
03
Подключение работает на клиенте, но падает на сервере — код выполняется в другом контексте; на сервере 1С провайдер и сетевой доступ нужно настраивать отдельно под учётной записью службы агента
04
Конкатенация значений в текст запроса — SQL-инъекции и ошибки на кавычках; используйте ADODB.Command с параметрами
05
Незакрытые Connection и Recordset — утечка соединений и блокировки на стороне СУБД; закрывайте объекты в секции Исключение тоже
06
Чтение полей по индексу вместо имени — при изменении порядка колонок в запросе код молча возвращает не те данные

Отдельная группа проблем — кодировки и типы данных. Даты из Recordset приходят как COM-даты и обычно корректно конвертируются в тип Дата 1С, но NULL-значения превращаются в Неопределено, что нужно учитывать при сравнениях. Денежные и дробные значения иногда приходят с плавающей точностью — для точных расчётов их лучше явно приводить к нужному формату.

Контрольные точки

Как проверить результат

Соединение открыто
Норма

Свойство Connection.State равно 1 (adStateOpen)

Тревожный признак

State = 0 или исключение при Open — соединение не установлено

Запрос вернул данные
Норма

Recordset.EOF = Ложь сразу после Execute

Тревожный признак

EOF = Истина — выборка пуста, проверьте условия запроса

Обход записей
Норма

Цикл проходит все строки, значения полей соответствуют источнику

Тревожный признак

Пропуски строк или неверные значения — проверьте MoveNext и имена полей

Освобождение ресурсов
Норма

После Close соединение не видно в списке активных сессий СУБД

Тревожный признак

Сессии накапливаются — где-то не вызывается Close

Безопасность и ограничения технологии

Учётные данные в строке подключения хранятся в открытом виде, если код доступен пользователям. Не вшивайте логин и пароль в общие модули конфигурации — храните их в защищённых настройках, доступных только серверному коду, и используйте учётную запись с минимально необходимыми правами (только чтение нужных таблиц или представлений).

По возможности предпочитайте Windows-аутентификацию (Integrated Security=SSPI): пароль не фигурирует в коде вообще, а доступ контролируется доменными политиками. Помните, что при серверном выполнении под этой авторизацией подключается учётная запись службы агента сервера 1С — ей и нужно выдавать права на внешнюю базу.

По производительности ADO приемлем для пакетных операций: выборка десятков тысяч строк через Recordset выполняется быстро, но обход в цикле 1С построчно — медленнее, чем обработка на стороне СУБД. Поэтому тяжёлую логику (агрегации, соединения таблиц, фильтрацию) выносите в SQL-запрос, а в 1С забирайте уже готовый результат.

Итог

Что важно запомнить

ADO в 1С — это COM-доступ к внешним базам через ADODB.Connection и строку подключения. Проверяйте провайдер и разрядность, используйте параметризованные запросы, всегда закрывайте соединения и никогда не пишите напрямую в таблицы базы 1С. Для регулярных интеграций рассмотрите COMConnector или веб-сервисы.

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

Чем ADO отличается от ODBC в контексте 1С?

ODBC — более старый низкоуровневый интерфейс доступа к данным, а ADO — COM-надстройка, которая умеет работать и поверх ODBC (через провайдер MSDASQL), и напрямую через «родные» OLE DB-провайдеры. Из кода 1С вы всегда работаете с ADO-объектами; ODBC появляется лишь как настроенный DSN-источник, если родного провайдера для нужной СУБД нет.

Почему на сервере 1С подключение не работает, хотя на клиенте всё в порядке?

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

Можно ли через ADO подключиться к другой базе 1С?

Технически можно подключиться к СУБД, на которой лежит база 1С, и читать таблицы напрямую, но делать это не рекомендуется: структура таблиц недокументирована, имена полей служебные, а запись напрямую нарушает целостность. Для доступа к другой базе 1С используйте COMConnector (V83.COMConnector) — он даёт объектную модель с соблюдением бизнес-логики.

Работает ли ADO-подключение в веб-клиенте или на Linux?

Нет. COM-технология существует только в Windows, поэтому ADO доступен только в толстом и тонком клиенте под Windows и на Windows-сервере 1С. Для веб-клиента и Linux-окружений используйте HTTP-сервисы, веб-сервисы или обмен файлами.

Как безопасно передать пароль в строке подключения?

Лучший вариант — вообще не передавать пароль: используйте Windows-аутентификацию (Integrated Security=SSPI). Если SQL-аутентификация неизбежна, храните пароль в защищённом хранилище настроек на сервере, подставляйте его только в серверном коде и выдайте учётной записи минимальные права — в идеале только чтение конкретных представлений.

Что делать, если Recordset возвращает даты и числа в неверном формате?

Значения приходят в том виде, в каком их отдаёт провайдер. Даты обычно корректно преобразуются в тип Дата, NULL превращается в Неопределено — проверяйте это перед сравнением. Дробные числа могут терять точность; при необходимости приводите их функцией Окр() или запрашивайте в SQL уже отформатированное значение через CAST/CONVERT.