Разработка и Конфигурация · 13 мин
1С ADO: что это такое и как использовать подключение к внешним базам данных
1С ADO — что это такое, как работает технология ADODB в 1С: подключение к SQL Server, Access и Excel, строки подключения, типичные ошибки и альтернативы COM.
1С ADO — это способ обращения из встроенного языка 1С к внешним базам данных через технологию Microsoft ActiveX Data Objects (ADO). В коде это выглядит как создание COM-объектов ADODB.Connection и ADODB.Recordset через конструктор Новый COMОбъект(). Технология позволяет напрямую выполнять SQL-запросы к Microsoft SQL Server, Access, Excel, MySQL и другим источникам, для которых существует OLE DB-провайдер или ODBC-драйвер.
Подход активно применялся в конфигурациях на платформе 1С:Предприятие 7.7 и 8.x для интеграции с учётными системами, выгрузки данных из сторонних программ и прямого чтения таблиц без промежуточных файлов. Несмотря на появление современных альтернатив — HTTP-сервисов, веб-сервисов, внешних источников данных, — ADO-подключения до сих пор встречаются во многих работающих решениях, и разработчику важно понимать, как они устроены.
Ниже разобрано, как устроена работа с ADO в 1С, какие объекты используются, как формируется строка подключения, где технология уместна, а где создаёт риски для стабильности и безопасности системы.
Что такое ADO и как она связана с 1С
ADO (ActiveX Data Objects) — компонентная технология Microsoft для доступа к данным. Она представляет собой надстройку над OLE DB и предоставляет простой объектную модель: подключение, команда, набор записей. Приложение обращается к данным через провайдера — драйвер, который «умеет» общаться с конкретной СУБД или форматом файла.
Платформа 1С:Предприятие умеет создавать COM-объекты через конструкцию Новый COMОбъект("ADODB.Connection"). Это и есть точка входа: 1С выступает клиентом, который через ADO отправляет SQL-запросы внешней базе и читает результаты построчно. Сама платформа при этом ничего не знает о структуре чужой базы — вся логика, включая синтаксис SQL, ложится на разработчика.
Важно понимать ограничение: COM-технология доступна только в Windows-окружении. Код с ADO не выполнится на сервере 1С под Linux и в веб-клиенте. Если база 1С работает в клиент-серверном варианте, COM-объект создаётся на той машине, где исполняется код — и именно там должен быть установлен нужный драйвер.
Какие объекты ADO используются в коде 1С
Работа строится вокруг трёх основных объектов. Первый — ADODB.Connection: хранит строку подключения, открывает и закрывает сеанс, позволяет выполнять команды напрямую методом Execute(). Второй — ADODB.Command: описывает параметризованную команду с текстом запроса и параметрами, что снижает риск SQL-инъекций. Третий — ADODB.Recordset: результат выборки, по которому проходят циклом.
Типичный цикл чтения данных выглядит так: создать соединение, открыть его, выполнить запрос, получить Recordset, перебрать записи через MoveNext() до признака конца EOF, закрыть набор и соединение. Пропуск закрытия объектов — частая причина утечек памяти и зависших сессий на стороне SQL Server.
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=SQLOLEDB;Data Source=SERVER;Initial Catalog=Shop;User ID=user;Password=pass;";
Соединение.Open();
Набор = Соединение.Execute("SELECT Code, Name FROM Goods");
Пока НЕ Набор.EOF Цикл
Сообщить(Набор.Fields("Name").Value);
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();Поля записи доступны через коллекцию Fields по имени или индексу. Следует учитывать, что значения приходят в типах COM: даты, числа и NULL из внешней базы нужно аккуратно приводить к типам 1С, иначе возможны ошибки преобразования или неявная потеря данных.
Строка подключения: из чего состоит и как её собрать
Строка подключения (ConnectionString) — ключевой элемент, в котором чаще всего кроются ошибки. Она состоит из пар «параметр=значение», разделённых точкой с запятой. Минимальный набор: провайдер (Provider), сервер (Data Source), база данных (Initial Catalog) и способ аутентификации.
Для SQL Server с провайдером SQLOLEDB аутентификация бывает двух видов: SQL-аутентификация с явным логином и паролем (User ID=...;Password=...) или Windows-аутентификация (Integrated Security=SSPI). Второй вариант безопаснее — пароль не хранится в коде, но требует, чтобы у учётной записи, под которой работает 1С, были права на целевую базу.
Для файловых источников строка отличается. Для Excel применяется провайдер Microsoft ACE OLEDB с параметром Extended Properties="Excel 12.0;HDR=YES", где HDR=YES означает, что первая строка — заголовки. Для старых форматов и Access используется Jet-провайдер, который существует только в 32-битной версии — это критично при выборе разрядности клиента 1С.
| Источник данных | Провайдер / драйвер | Особенность |
|---|---|---|
| MS SQL Server | SQLOLEDB, MSOLEDBSQL | Поддержка Windows- и SQL-аутентификации |
| Excel (xlsx) | Microsoft.ACE.OLEDB.12.0 | Требуется установленный ACE, разрядность должна совпадать с клиентом 1С |
| Access (mdb) | Microsoft.Jet.OLEDB.4.0 | Только 32-битная среда |
| MySQL, PostgreSQL | Через ODBC (MSDASQL) | Нужен предварительно настроенный DSN или строка ODBC-драйвера |
Порядок настройки подключения и проверка результата
Прежде чем писать код, проверьте подключение вне 1С. Самый быстрый способ — создать пустой файл с расширением .udl, открыть его, выбрать провайдера, заполнить параметры и нажать «Проверить подключение». Если тест проходит, готовую строку можно скопировать из файла в код 1С — это исключает ошибки в синтаксисе.
- 1Определите СУБД источника и установите подходящий OLE DB/ODBC-драйвер той же разрядности, что и клиент 1С
- 2Проверьте подключение через UDL-файл или тестовый ODBC-источник вне 1С
- 3Создайте в коде COMОбъект ADODB.Connection и задайте строку подключения
- 4Откройте соединение, выполните тестовый SELECT с ограничением числа строк
- 5Переберите Recordset, преобразуйте значения полей к типам 1С
- 6Закройте Recordset и Connection, обернув работу в Попытка/Исключение с гарантированным закрытием
Обязательно оборачивайте работу с ADO в конструкцию Попытка ... Исключение ... КонецПопытки. Сетевые сбои, отсутствие драйвера и неверные права проявляются как исключения COM, и без обработки пользователь получит непонятную системную ошибку. В блоке исключения фиксируйте текст ошибки и закрывайте объекты, если они были открыты.
Как проверить результат
Объект создаётся без исключения
Ошибка «класс не зарегистрирован» — драйвер не установлен или не совпадает разрядность
Метод Open() отрабатывает, состояние соединения — открыто
Ошибка входа или тайм-аут — проверьте логин, права и доступность сервера по сети
Recordset содержит записи, EOF становится истинным после последней строки
Пустой набор при заведомо существующих данных — проверьте текст запроса и права на таблицу
Типичные ошибки и ограничения технологии
Самая распространённая проблема — несовпадение разрядности. 64-битный клиент 1С не увидит 32-битный драйвер Jet или ACE, и наоборот. Симптом — ошибка «провайдер не зарегистрирован» при физически установленном драйвере. Решение: ставить драйвер нужной разрядности или запускать код на клиенте соответствующей архитектуры.
Ещё одно ограничение — производительность. COM-вызовы медленнее нативных механизмов платформы, а построчный перебор Recordset на больших объёмах становится узким местом. Для регулярной загрузки сотен тысяч записей ADO подходит плохо: лучше рассмотреть выгрузку в файл или прямой обмен на уровне СУБД.
Когда ADO оправдан, а когда лучше выбрать альтернативу
ADO остаётся рабочим вариантом для разовых миграций, чтения данных из унаследованных систем и быстрых интеграций в закрытом Windows-контуре, где обе стороны под контролем. Технология проста, не требует доработки второй стороны и даёт прямой доступ к таблицам.
Для новых постоянных интеграций у платформы есть более надёжные механизмы. Внешние источники данных позволяют подключить таблицы SQL Server как объекты конфигурации и работать с ними штатным языком запросов 1С. HTTP- и веб-сервисы убирают зависимость от драйверов и работают на любой платформе. Планы обмена и форматы EnterpriseData подходят для регулярной синхронизации между учётными системами.
Сравнение вариантов
Подходит для разовых выгрузок и старых систем; ограничения — только Windows, ручное управление соединением, зависимость от драйверов
Таблицы внешней СУБД видны как объекты конфигурации; удобно для постоянного доступа, но требует настройки и поддерживает не все СУБД
Кроссплатформенно и безопасно, работает через брандмауэры; требует доработки на стороне второй системы
Просто и надёжно для регламентных обменов; не даёт оперативности в реальном времени
Как выбрать действие
Безопасность и права доступа
ADO-подключение обходит все механизмы прав 1С: ограничения действуют только на стороне целевой СУБД. Поэтому учётная запись для подключения должна иметь минимально необходимые права — как правило, SELECT на конкретные таблицы или представления. Никогда не подключайтесь под владельцем базы или администратором сервера.
Дополнительно ограничьте доступ к самой обработке в 1С. Код, содержащий строки подключения, должен выполняться на сервере или у ограниченного круга пользователей. Пароли предпочтительно хранить вне кода: в защищённых настройках, доступных только администраторам.
При переносе рабочей базы 1С на новый сервер ADO-интеграции часто «молча» ломаются: на новом сервере забывают установить OLE DB-провайдер. Добавьте в регламент миграции проверку тестового подключения — это занимает несколько минут и избавляет от поиска причины сбоя обмена в рабочее время.
Часто задаваемые вопросы
Работает ли ADO из 1С на сервере под Linux?
Нет. ADO — это COM-технология Microsoft и существует только в Windows. На Linux-сервере 1С вызов Новый COMОбъект завершится ошибкой. Для кроссплатформенных сценариев используют HTTP-сервисы, внешние компоненты по технологии Native API или обмен через файлы.
Почему возникает ошибка «провайдер не зарегистрирован», хотя драйвер установлен?
Чаще всего причина в разрядности: 64-битный клиент 1С не видит 32-битные драйверы и наоборот. Проверьте разрядность исполняемого файла 1С и установите соответствующую версию провайдера. Для старых драйверов вроде Jet 64-битной версии не существует вовсе.
Можно ли через ADO изменять данные в базе 1С из внешней программы?
Технически подключиться к СУБД, где лежит база 1С, можно, но писать напрямую в таблицы категорически не рекомендуется: структура таблиц платформы не документирована для прямой записи, и такое вмешательство нарушает целостность данных и условия поддержки. Для записи используйте штатные механизмы — COM-соединение с самой 1С (V83.COMConnector), веб-сервисы или планы обмена.
Чем отличается SQLOLEDB от MSOLEDBSQL?
SQLOLEDB — старый провайдер, который поставляется с Windows и считается устаревшим. MSOLEDBSQL — современный провайдер Microsoft для SQL Server с поддержкой новых возможностей протокола. Для новых внедрений предпочтительнее MSOLEDBSQL, но его нужно устанавливать отдельно на каждую машину, где выполняется код.
Как защититься от SQL-инъекций при формировании запроса в 1С?
Не подставляйте пользовательский ввод в текст запроса конкатенацией строк. Используйте объект ADODB.Command с коллекцией Parameters: текст команды содержит placeholders, а значения передаются отдельно. Дополнительно ограничьте права учётной записи подключения только чтением нужных таблиц.
Подходит ли ADO для загрузки больших объёмов данных?
Для сотен тысяч и миллионов записей построчный перебор Recordset работает медленно. В таких задачах эффективнее выгрузить данные средствами самой СУБД в файл и загрузить его в 1С, либо организовать обмен на уровне СУБД. ADO разумно применять для выборок ограниченного размера.
Что важно запомнить
1С ADO — это доступ к внешним базам через COM-объекты ADODB, работающий только в Windows и зависящий от установленных драйверов нужной разрядности. Для чтения используйте учётную запись с минимальными правами, проверяйте подключение через UDL-файл до написания кода и всегда закрывайте соединения. Для новых постоянных интеграций предпочтительнее внешние источники данных, HTTP-сервисы и планы обмена.