Интеграция между 1С и сторонними базами данных на базе MSSQL — это классическая задача, с которой сталкиваются разработчики при необходимости консолидации данных, миграции или обмена информацией с веб-порталами и производственным ПО. В этой статье мы подробно разберем, как реализовать подключение, выполнить запрос и правильно обработать полученные результаты, избежав типичных ошибок новичков.
Для взаимодействия с MSSQL в среде Windows чаще всего используется технология ADO (ActiveX Data Objects). В 1С это реализуется через создание COM-объектов. Первым шагом нам необходимо сформировать правильную строку соединения. Рассмотрим пример кода, который инициирует подключение:
// Формируем строку соединения для драйвера SQL Server
СтрокаСоединения = "Driver={SQL Server};Server=" + Объект.SQLServer +
";UID=" + Объект.Login +
";PWD=" + Объект.Password +
";DataBase=" + Объект.ИмяБД;
СоединениеSQL = Новый ComObject("ADODB.Connection");
СоединениеSQL.ConnectionString = СтрокаСоединения;
Попытка
СоединениеSQL.Open();
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Обратите внимание на использование параметров UID (логин) и PWD (пароль). Если ваш SQL-сервер настроен на Windows-аутентификацию, строка соединения будет выглядеть иначе (вместо логина и пароля используется Trusted_Connection=Yes). Также важно учитывать, что для современных версий SQL Server рекомендуется использовать драйвер MSOLEDBSQL или SQL Server Native Client для лучшей поддержки типов данных.
После успешного подключения нам нужно получить данные. Для этого используется объект RecordSet. Часто возникает ситуация, когда мы не знаем точного состава колонок таблицы. Рассмотрим, как программно перебрать все доступные поля в результате запроса:
ТекстЗапроса = "SELECT * FROM [НазваниеТаблицы]";
ЗаписиSQL = СоединениеSQL.Execute(ТекстЗапроса);
// Пройдемся по коллекции Fields, чтобы узнать имена колонок
Для каждого ПолеSQL Из ЗаписиSQL.Fields Цикл
Сообщить("Найдена колонка: " + ПолеSQL.Name);
КонецЦикла;
Использование свойства Name объекта Field позволяет динамически анализировать структуру таблицы, что полезно при создании универсальных обработок импорта.
Чтобы перенести данные в 1С (например, в таблицу значений или справочник), нам нужно организовать цикл по всем записям RecordSet. Важно не забывать использовать метод MoveNext(), иначе цикл станет бесконечным.
Пока НЕ ЗаписиSQL.EOF Цикл
// Обращение к конкретным колонкам по имени
ЗначениеКолонки1 = ЗаписиSQL.Fields("ИмяКолонки1").Value;
ЗначениеКолонки2 = ЗаписиSQL.Fields("ИмяКолонки2").Value;
Сообщить("Данные: " + ЗначениеКолонки1 + " | " + ЗначениеКолонки2);
// Переход к следующей строке обязателен!
ЗаписиSQL.MoveNext();
КонецЦикла;
// Не забываем закрывать соединение после работы
СоединениеSQL.Close();
Одной из самых частых проблем при выполнении SQL-запросов из 1С является ошибка "Invalid object name" (Недопустимое имя объекта). Это происходит, когда драйвер не может однозначно определить, в какой схеме или базе находится таблица. Выясним причину: часто SQL-сервер ожидает полного пути к таблице.
Вместо простого запроса SELECT * FROM MyTable, попробуем использовать полное квалифицированное имя:
// Формат: [ИмяБазы].[Схема].[ИмяТаблицы]
ТекстЗапроса = "SELECT * FROM [MyDatabase].[dbo].[MyTable]";
ЗаписиSQL = СоединениеSQL.Execute(ТекстЗапроса);
Совет: Чтобы быстро получить правильный текст запроса со всеми скобками и схемами, откройте SQL Server Management Studio (SSMS), найдите нужную таблицу, нажмите на нее правой кнопкой мыши и выберите "Script Table as -> SELECT To -> New Query Editor Window". Сгенерированный текст будет эталонным для использования в 1С.
Разберем дополнительные моменты, которые помогут сделать вашу интеграцию надежной:
NULL. В 1С при чтении через COM это преобразуется в специальный тип NULL. Обязательно проверяйте данные перед записью: Если Значение = NULL Тогда Значение = ""; КонецЕсли;.MoveNext() работает медленно на больших объемах данных (десятки тысяч строк). Для ускорения работы можно использовать метод GetRows(), который выгружает все данные в двумерный массив одним махом.ADODB.Command и параметры.Проанализируем ситуацию: если вам нужно постоянно работать с таблицами MSSQL, рассмотрите механизм "Внешние источники данных", доступный в платформе 8.3. Он позволяет подключить таблицы SQL прямо в дерево конфигурации. В этом случае работа с ними будет вестись через стандартные запросы 1С, без использования COM-объектов и низкоуровневого SQL-кода, что значительно упрощает поддержку системы.