Разработка и Конфигурация · 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.
Способы доступа к внешним данным
Полный контроль над SQL, подходит для разовых миграций и нестандартных запросов. Ограничение: только Windows, ручная обработка ошибок, код сложнее поддерживать.
Таблицы внешней базы доступны как объекты конфигурации, работают запросы 1С и СКД. Ограничение: требуется настройка ODBC, меньше гибкости в нестандартных сценариях.
Просто и надёжно, не требует прямого доступа к чужой базе. Ограничение: не real-time, нужна договорённость о формате.
Кроссплатформенно, работает через сеть без драйверов. Ограничение: внешняя система должна предоставлять API.
Если источник данных живёт на Linux, если 1С работает на Linux-сервере или если нужен обмен в реальном времени с веб-приложением — ADO отпадает сразу, и правильнее смотреть в сторону HTTP-сервисов или файлового обмена.
Пример: подключение к SQL Server и чтение данных
Классический сценарий — прочитать данные из базы SQL Server и загрузить их в 1С. Код выполняется на сервере 1С (или в толстом клиенте), учётная запись, под которой работает сервер 1С, должна иметь доступ к целевой базе, либо используется SQL-аутентификация с явным логином и паролем.
Процедура ЗагрузитьТовары() Экспорт
Соединение = Новый 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 на машине.
Соединение = Новый 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С сводится к нескольким повторяющимся сценариям. Знание симптомов экономит часы отладки.
При отладке полезно проверить строку подключения вне 1С: создайте на той же машине файл с расширением .udl, настройте соединение визуально, нажмите «Проверить подключение», а затем откройте файл блокнотом — внутри будет готовая корректная строка. Если соединение не работает даже в UDL-файле, проблема в драйверах или сетевом доступе, а не в коде 1С.
Безопасность и ограничения
Отдельно о правах. Учётная запись, под которой 1С ходит во внешнюю базу, должна иметь минимально необходимые права: если нужно только чтение — не выдавайте права на запись. Пароли в строке подключения не храните в открытом виде в коде общих модулей: их видно всем, у кого есть доступ к конфигуратору или выгрузке конфигурации. Лучше хранить параметры в защищённых настройках или запрашивать у администратора при настройке обмена.
Производительность тоже требует внимания. Запрос, выбирающий миллионы записей без фильтрации, заблокирует и внешнюю базу, и сеанс 1С. Всегда ограничивайте выборку условиями WHERE, переносите агрегацию на сторону SQL-сервера и для больших загрузок используйте порционную обработку или фоновые задания, чтобы не блокировать работу пользователей.
Как проверить, что интеграция работает корректно
Open() выполняется без исключения
Ошибки провайдера, разрядности или аутентификации
Количество обработанных записей совпадает с COUNT(*) в источнике
Часть строк потеряна — проверяйте NULL, типы колонок и фильтры
Даты, числа и строки приходят в ожидаемом виде
NULL вместо значений, даты как текст — проблема определения типов драйвером
После работы Close() вызван для Recordset и Connection
Растёт число открытых сессий на SQL Server
Порядок внедрения ADO-обмена в конфигурацию
- 1Определите источник данных и убедитесь, что для него существует OLE DB-провайдер или ODBC-драйвер нужной разрядности
- 2Проверьте строку подключения через UDL-файл на сервере 1С, где будет выполняться код
- 3Создайте серверную функцию или процедуру в общем модуле с признаком «Сервер»
- 4Реализуйте чтение через ADODB.Connection и Recordset с обработкой исключений и гарантированным Close()
- 5Для запросов с параметрами используйте ADODB.Command
- 6Протестируйте на копии: сверьте количество и содержимое загруженных записей с источником
- 7Настройте права учётной записи по минимуму и вынесите секреты из кода
- 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 строки подключения — это переводит драйвер в режим «смешанных» данных. Дополнительно проверьте и приведите форматы ячеек в самом файле.