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

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

Что такое ADO в 1С и как его использовать

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

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

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

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

Как устроена работа с ADO в 1С

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

Три основных объекта, которые используются чаще всего:

  • ADODB.Connection — соединение с источником данных. Открывается строкой подключения (provider, server, database, учётные данные), через него выполняются запросы и управляются транзакции.
  • ADODB.Command — параметризованная команда. Позволяет безопасно передавать параметры в запрос вместо конкатенации строк, что защищает от SQL-инъекций и ошибок с типами данных.
  • ADODB.Recordset — набор записей, результат выполнения SELECT. Перебирается в цикле методом MoveNext, поля доступны через коллекцию Fields.

Ключевой момент: 1С обращается к внешней базе «в обход» собственной модели данных. Никаких объектов метаданных, запросов на языке 1С, прав доступа конфигурации — только чистый SQL и структура чужой базы. Это даёт гибкость, но перекладывает всю ответственность за корректность запросов на разработчика.

Когда ADO оправдан, а когда лучше выбрать другое

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

Однако у технологии есть серьёзные конкуренты внутри самой платформы. Механизм внешних источников данных (ExternalDataSource) позволяет подключить ODBC-доступную базу как часть конфигурации: таблицы становятся похожи на объекты 1С, к ним можно строить запросы на языке 1С, использовать в отчётах СКД и даже размещать в формах. Для постоянных интеграций это почти всегда удобнее, чем ручной перебор Recordset.

Способы доступа к внешним данным

ADO через COM

Полный контроль над SQL, подходит для разовых миграций и нестандартных запросов. Ограничение: только Windows, ручная обработка ошибок, код сложнее поддерживать.

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

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

Файловый обмен (CSV, XML, Excel)

Просто и надёжно, не требует прямого доступа к чужой базе. Ограничение: не real-time, нужна договорённость о формате.

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

Кроссплатформенно, работает через сеть без драйверов. Ограничение: внешняя система должна предоставлять API.

Если источник данных живёт на Linux, если 1С работает на Linux-сервере или если нужен обмен в реальном времени с веб-приложением — ADO отпадает сразу, и правильнее смотреть в сторону HTTP-сервисов или файлового обмена.

Пример: подключение к SQL Server и чтение данных

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

bsl
Процедура ЗагрузитьТовары() Экспорт
	Соединение = Новый COMОбъект("ADODB.Connection");
	СтрокаПодключения = "Provider=SQLOLEDB;Data Source=SQLSERVER;Initial Catalog=ShopDB;User ID=user;Password=pass;";
	Соединение.Open(СтрокаПодключения);
	НаборЗаписей = Соединение.Execute("SELECT Code, Name, Price FROM Goods");
	Пока НЕ НаборЗаписей.EOF Цикл
		КодТовара = НаборЗаписей.Fields("Code").Value;
		Наименование = НаборЗаписей.Fields("Name").Value;
		// ... поиск или создание элемента справочника ...
		НаборЗаписей.MoveNext();
	КонецЦикла;
	НаборЗаписей.Close();
	Соединение.Close();
КонецПроцедуры

Обратите внимание на обязательное закрытие Recordset и Connection. COM-объекты не освобождаются сборщиком мусора 1С мгновенно; незакрытые соединения копятся на SQL Server и рано или поздно упираются в лимиты. В продуктивном коде весь блок работы с ADO оборачивают в попытку/исключение с гарантированным закрытием соединения в ветке исключения.

Для запросов с параметрами используйте ADODB.Command вместо подстановки значений в строку запроса. Это устраняет проблемы с кавычками в наименованиях, форматами дат и десятичными разделителями, а главное — исключает SQL-инъекции, если часть условий приходит от пользователя.

Пример: чтение данных из Excel через ADO

Вторая частая задача — прочитать xls- или xlsx-файл как таблицу базы данных. Это удобно, когда файл большой, листов много, а стандартный табличный документ 1С справляется медленно или требует установленного Excel на машине.

bsl
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\price.xlsx;Extended Properties=""Excel 12.0;HDR=YES"";";
Соединение.Open(СтрокаПодключения);
НаборЗаписей = Соединение.Execute("SELECT * FROM [Лист1$]");

Нюансы, о которых часто забывают. Параметр HDR=YES означает, что первая строка листа — заголовки колонок; если заголовков нет, укажите HDR=NO, и поля получат имена F1, F2 и так далее. Имя листа в запросе пишется с символом доллара и в квадратных скобках: [Лист1$]. Для провайдера ACE.OLEDB нужен установленный драйвер Access Database Engine соответствующей разрядности — на 64-битном сервере 1С нужен 64-битный драйвер.

Ещё одна ловушка: драйвер определяет тип колонки по первым строкам. Если в «числовой» колонке ниже встречается текст, значения могут прочитаться как NULL. Лечится параметром IMEX=1 в Extended Properties либо приведением форматов в самом файле.

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

Большинство проблем с ADO в 1С сводится к нескольким повторяющимся сценариям. Знание симптомов экономит часы отладки.

Типичные ошибки при работе с ADO
01
Ошибка «Класс не зарегистрирован» при создании COMОбъект — код выполняется в тонком или веб-клиенте, где COM недоступен. Перенесите код в серверную процедуру.
02
«Провайдер не зарегистрирован на локальном компьютере» — не установлен нужный OLE DB-провайдер или не совпадает разрядность драйвера и процесса 1С.
03
Ошибка входа в SQL Server — сервер 1С работает под учётной записью без доступа к базе. Проверьте, под какой учёткой запущен агент сервера, или перейдите на SQL-аутентификацию.
04
Поля читаются как NULL или обрезаются — драйвер неправильно определил тип колонки (актуально для Excel и текстовых файлов).
05
Соединения копятся и SQL Server отказывает в новых подключениях — в коде не вызывается Close(), особенно в ветке исключения.
06
Конкатенация значений в текст запроса — ошибки на наименованиях с кавычками и риск SQL-инъекций. Используйте ADODB.Command с параметрами.

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

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

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

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

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

Как проверить, что интеграция работает корректно

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

Open() выполняется без исключения

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

Ошибки провайдера, разрядности или аутентификации

Данные читаются полностью
Норма

Количество обработанных записей совпадает с COUNT(*) в источнике

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

Часть строк потеряна — проверяйте NULL, типы колонок и фильтры

Типы данных
Норма

Даты, числа и строки приходят в ожидаемом виде

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

NULL вместо значений, даты как текст — проблема определения типов драйвером

Ресурсы освобождаются
Норма

После работы Close() вызван для Recordset и Connection

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

Растёт число открытых сессий на SQL Server

Порядок внедрения ADO-обмена в конфигурацию

Порядок действий
  1. 1
    Определите источник данных и убедитесь, что для него существует OLE DB-провайдер или ODBC-драйвер нужной разрядности
  2. 2
    Проверьте строку подключения через UDL-файл на сервере 1С, где будет выполняться код
  3. 3
    Создайте серверную функцию или процедуру в общем модуле с признаком «Сервер»
  4. 4
    Реализуйте чтение через ADODB.Connection и Recordset с обработкой исключений и гарантированным Close()
  5. 5
    Для запросов с параметрами используйте ADODB.Command
  6. 6
    Протестируйте на копии: сверьте количество и содержимое загруженных записей с источником
  7. 7
    Настройте права учётной записи по минимуму и вынесите секреты из кода
  8. 8
    Для регулярного обмена оберните вызов в регламентное задание с логированием ошибок

Если обмен планируется постоянным, а не разовым, перед внедрением ещё раз сравните ADO с внешними источниками данных: второй вариант даст пользователям отчёты и просмотр данных «из коробки», без написания обработок для каждой задачи.

Итог

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

ADO в 1С — это COM-доступ к внешним базам через ADODB.Connection, Command и Recordset с выполнением SQL-запросов. Работает только на Windows-стороне (сервер или толстый клиент), требует совпадения разрядности драйверов, аккуратного закрытия соединений и параметризованных запросов. Для постоянных интеграций сначала оцените внешние источники данных, а прямая запись в базу самой 1С через ADO недопустима.

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

Можно ли использовать ADO в тонком клиенте 1С?

Напрямую — нет: тонкий клиент не поддерживает создание COM-объектов. Решение стандартное: весь код с ADO размещается в серверных процедурах общих модулей, а клиент только вызывает их. При этом сервер 1С должен работать под Windows, поскольку COM и OLE DB — Windows-технологии.

Чем ADO отличается от внешних источников данных в 1С?

ADO — это императивный код: вы сами открываете соединение, пишете SQL, перебираете записи. Внешние источники данных — декларативный механизм платформы: внешние таблицы описываются в конфигурации и дальше доступны запросам 1С, СКД и формам. Для постоянного доступа и отчётности удобнее внешние источники, для разовых миграций и нестандартных запросов — ADO.

Почему возникает ошибка «Провайдер не зарегистрирован на локальном компьютере»?

Чаще всего причина в разрядности: 64-битный процесс сервера 1С не видит 32-битный драйвер (типично для драйверов Excel/Access). Проверьте разрядность сервера 1С и установите драйвер той же разрядности. Вторая возможная причина — драйвер просто не установлен на машине, где выполняется код.

Можно ли через ADO читать данные из базы самой 1С?

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

Как безопасно передать параметры в SQL-запрос из 1С?

Используйте объект ADODB.Command: задайте текст команды с placeholders, добавьте параметры через CreateParameter с указанием типа и значения, затем выполните Execute. Это исключает проблемы с кавычками, форматами дат и десятичными разделителями, а также защищает от SQL-инъекций, если значения приходят от пользователей.

Что делать, если при чтении Excel часть значений приходит пустой?

Драйвер определяет тип колонки по первым строкам листа; если дальше встречаются значения другого типа, они читаются как NULL. Добавьте IMEX=1 в Extended Properties строки подключения — это переводит драйвер в режим «смешанных» данных. Дополнительно проверьте и приведите форматы ячеек в самом файле.