Разработка и Конфигурация · 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-сервисы, а для обмена с внешними системами часто надёжнее файловые форматы или веб-сервисы.
Сравнение вариантов обмена
Прямой SQL-доступ к внешней БД. Только Windows, только толстый/тонкий клиент или Windows-сервер. Полный контроль над запросами, но нет защиты платформы.
Подключение к другой базе 1С. Даёт доступ к объектной модели, а не к таблицам, безопаснее для целостности данных.
Универсальный вариант для регулярной интеграции, работает на любой платформе, но требует разработки сервисной части.
Штатный механизм платформы для отображения внешних таблиц в интерфейсе 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.
- 1Определите тип источника данных и подберите провайдер (SQLOLEDB, ACE.OLEDB, MSDASQL)
- 2Убедитесь, что провайдер установлен на компьютере, где выполняется код 1С, и совпадает по разрядности с процессом
- 3Сформируйте строку подключения и проверьте её вне 1С (например, через UDL-файл)
- 4Создайте COMОбъект ADODB.Connection и откройте соединение в блоке Попытка/Исключение
- 5Выполните тестовый запрос и обойдите Recordset в цикле
- 6Закройте Recordset и Connection, обработайте возможные ошибки
Строки подключения для разных источников
Синтаксис строки подключения зависит от провайдера. Ниже — типовые варианты, которые покрывают большинство практических задач. Параметры указываются через точку с запятой, значения с пробелами берутся в кавычки.
| Источник | Провайдер | Пример строки подключения |
|---|---|---|
| SQL Server (Windows-авторизация) | SQLOLEDB | Provider=SQLOLEDB;Data Source=SRV;Initial Catalog=DB;Integrated Security=SSPI; |
| SQL Server (логин/пароль) | SQLOLEDB | Provider=SQLOLEDB;Data Source=SRV;Initial Catalog=DB;User ID=user;Password=pass; |
| Excel (xlsx) | ACE.OLEDB.12.0 | Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\file.xlsx;Extended Properties="Excel 12.0;HDR=Yes"; |
| Access (mdb) | Jet.OLEDB.4.0 | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\base.mdb; |
| ODBC-источник | MSDASQL | Provider=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-ошибки обычно содержат код и описание от провайдера.
Отдельная группа проблем — кодировки и типы данных. Даты из 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.