RE: Как подключиться из 1С к другой базе 1С MSSQL запросом через ADO?

#30721
bot_avaOdin — Одинэсник
Участник

    Для подключения из одной базы 1С на сервере MSSQL к другой базе 1С на том же сервере и выполнения запросов, можно использовать библиотеку ADO (ActiveX Data Objects). Ниже приведен пример, как это можно сделать.

    ### Шаги для подключения и выполнения запросов:

    1. **Создание функции для подключения к базе данных**:
    Используйте объект `ADODB.Connection` для создания соединения с другой базой данных.

    2. **Выполнение SQL-запросов**:
    Используйте объект `ADODB.Command` для выполнения SQL-запросов и получения данных.

    ### Пример кода:

    1C
    Функция СоединитьСерверSQL(ИмяСервера, ИмяБазы, Логин, Пароль) Экспорт
        con = Новый COMОбъект("ADODB.Connection");
        con.ConnectionTimeout = 5;
        con.CommandTimeout = 0;
        con.CursorLocation = 3;
    
        // Формируем строку подключения
        con.ConnectionString = "Driver={SQL Server};Server=" + ИмяСервера + ";Database=" + ИмяБазы + ";Uid=" + Логин + ";Pwd=" + Пароль + ";";
    
        Попытка
            con.Open();
        Исключение
            Сообщить("Ошибка подключения: " + ОписаниеОшибки());
            Возврат Неопределено;
        КонецПопытки;
    
        Возврат con;
    КонецФункции
    
    Функция ПолучитьДанные(ТекстЗапроса, Соединение) Экспорт
        Таблица = Новый ТаблицаЗначений;
        cmd = Новый COMОбъект("ADODB.Command");
        cmd.ActiveConnection = Соединение;
        cmd.CommandText = ТекстЗапроса;
    
        Попытка
            rs = cmd.Execute();
            Для НомерСтолбца = 0 По rs.Fields.Count - 1 Цикл
                ИмяНовойКолонки = rs.Fields(НомерСтолбца).Name;
                Таблица.Колонки.Добавить(ИмяНовойКолонки);
            КонецЦикла;
    
            Если Не rs.eof Тогда
                rs.MoveFirst();
            КонецЕсли;
    
            Пока Не rs.eof Цикл
                НоваяСтрока = Таблица.Добавить();
                Для НомерСтолбца = 0 По rs.Fields.Count - 1 Цикл
                    ИмяНовойКолонки = rs.Fields(НомерСтолбца).Name;
                    Значение = rs.Fields.Item(ИмяНовойКолонки).Value;
                    Если Значение  Null Тогда
                        НоваяСтрока[ИмяНовойКолонки] = Значение;
                    КонецЕсли;
                КонецЦикла;
                rs.MoveNext();
            КонецЦикла;
        Исключение
            Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
        КонецПопытки;
    
        Возврат Таблица;
    КонецФункции
    
    // Пример использования
    ИмяСервера = "ВашСервер";
    ИмяБазы = "ИмяДругойБазы";
    Логин = "ВашЛогин";
    Пароль = "ВашПароль";
    
    Соединение = СоединитьСерверSQL(ИмяСервера, ИмяБазы, Логин, Пароль);
    Если Соединение  Неопределено Тогда
        ТекстЗапроса = "SELECT * FROM ВашаТаблица"; // Замените на ваш запрос
        Данные = ПолучитьДанные(ТекстЗапроса, Соединение);
        Соединение.Close();
    КонецЕсли;
    

    ### Объяснение кода:
    — **СоединитьСерверSQL**: Функция для создания соединения с другой базой данных. Принимает параметры: имя сервера, имя базы, логин и пароль.
    — **ПолучитьДанные**: Функция для выполнения SQL-запроса и получения данных в виде таблицы значений.
    — **Пример использования**: В конце кода показан пример, как использовать эти функции для подключения и получения данных.

    ### Важно:
    — Убедитесь, что у вас есть необходимые права доступа к целевой базе данных.
    — Проверьте, что SQL Server настроен для разрешения удаленных подключений.

    Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/1260010/

    База знаний 1С