Подключение к SQL-серверу из 1С:Предприятие 8 (пример кода)

Logo_1c_8_RazradotkaВ данной статье приведены экземпляры кода на языке 1С, которые позволяют подключаться к базе данных на SQL-сервере, получать из нее данные, а также записывать новые и обновлять существующие записи в таблицах этой базы данных. Код протестирован на платформе 8.3.5, а также на версиях SQL Server 2008 R2 и SQL Server 2012. Операционная система Windows Server 2008 и Windows Server 2012. Есть предположение, что указанный код будет работать и на других версиях 1С, SQL и Windows.

 

0. Оглавление

  1. Постановка задачи
  2. Подключение к SQL-серверу
  3. Добавление записей в таблицу
  4. Обновление записей в таблице
  5. Просмотр выборки из таблицы
  6. Удаление записей из таблицы
  7. Закрытие соединения
  8. Общий текст процедуры

1. Постановка задачи

Итак, имеется SQL-сервер с адресом WIN2012\TEST_SQL. Для подключения используется имя входа SQL-сервера UserDB с паролем Pass123456.

podkly-k-sql-iz-1s_004

На сервере размещена база данных с именем TestDB. В базе имеется таблица с именем Table_1, в которой 3 столбца:

  • C_DateTime, с типом datetime
  • C_Char, с типом char(50)
  • C_Numeric, с типом numeric(18,0)

podkly-k-sql-iz-1s_001

Изначально таблица пустая:

podkly-k-sql-iz-1s_002

У пользователя UserDB есть права на чтение и запись в базу данных TestDB. В данном случае пользователь является владельцем указанной базы данных.

podkly-k-sql-iz-1s_003

Требуется научиться записывать в базу данных и читать из базы данных из 1С при помощи прямых запросов к SQL-серверу.

2. Подключение к SQL-серверу

Весь приведенный ниже код может работать как на клиенте, так и на сервере. Главное чтобы был доступен COM-объект «ADODB» (подробнее о данной библиотеке можно прочитать, например, здесь). Также с клиента (или с сервера, смотря где выполняется код) должен быть доступен указанный SQL-сервер (настроено правило в Брандмауере для возможности внешнего подключения). Код приводится совсем простой, для понимания с чего вообще начинать разработчику, который раньше с этим не сталкивался.

Итак, для подключения необходимо создать COM-объект «ADODB». Для этого выполняется код 1С:

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)

    //Инициализация переменных
    ИмяСервераSQL = "WIN2012\TEST_SQL";
    ПользовательSQL = "UserDB";
    ПарольSQL = "Pass123456";
    БазаДанныхSQL = "TestDB";
    ТаблицаSQL = "Table_1";


    /////////////////////////////////////////
    //Подключение к SQL-серверу
    Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
            "driver={SQL Server};" +
            "server="+ИмяСервераSQL+";"+
            "uid="+ПользовательSQL+";"+
            "pwd="+ПарольSQL+";"+
            "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
        Сообщить("Успешное подключение!");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;

КонецПроцедуры

Результат работы в 1С:Предприятии:

podkly-k-sql-iz-1s_005

Теперь, в общем то, можно выполнять любой запрос SQL через данный COM-объект. Посмотрим как это делать на самых распространенных примерах.

3. Добавление записей в таблицу

Теперь добавим новую строку в нашу пока еще пустую таблицу. Для этого необходимо выполнить код:

    /////////////////////////////////////////
    //Добавляем запись в таблицу
    ТекДата = ТекущаяДата();
    ТекСтрока = "Запись строки";
    ТекЧисло = 123456;

    //Приобразуем данные
    Если НЕ ЗначениеЗаполнено(ТекДата) Тогда
        //Для пустой даты необходимо отправлять 01.01.1753
        ТекДата = Дата(1753,1,1);
    КонецЕсли;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "INSERT INTO "+ТаблицаSQL+"
        |([C_DateTime], [C_Char], [C_Numeric])
        |VALUES ('"+ТекДата+"', N'"+ТекСтрока+"', '"+ТекЧисло+"')";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись добавлена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

Смотрим результат и видим, что строка появилась в таблице:

podkly-k-sql-iz-1s_006

4. Обновление записей в таблице

Теперь попробуем обновить все записи в таблице со значением C_Numeric=123456. Для этого выполняем код:

    /////////////////////////////////////////
    //Обновляем записи в таблице с C_Numeric = 123456
    ТекЧисло = 123456;
    ТекДатаНовая = Дата(1,1,1);
    ТекСтрокаНовая = "Обновленная запись строки";

    //Приобразуем данные
    Если НЕ ЗначениеЗаполнено(ТекДатаНовая) Тогда
        //Для пустой даты необходимо отправлять 01.01.1753
        ТекДатаНовая = Дата(1753,1,1);
    КонецЕсли;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "UPDATE "+ТаблицаSQL+"
        |SET
        |   [C_Char] = N'"+ТекСтрокаНовая+"',
        |   [C_DateTime] = '"+ТекДатаНовая+"'
        |WHERE [C_Numeric]='"+ТекЧисло+"'";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись обновлена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

Проверяем, что запись обновилась:

podkly-k-sql-iz-1s_007

5. Просмотр выборки из таблицы

Писать и обновлять записи в таблице мы научились. Теперь посмотрим как просматривать выборку из запроса с SQL-сервера:

    /////////////////////////////////////////
    //Читаем записи
    ТекстИнструкции =
        "SELECT
        |   [C_DateTime], [C_Char], [C_Numeric]
        |FROM "+ТаблицаSQL;
    Попытка
        Команда.CommandText = ТекстИнструкции;
        Выборка = Команда.Execute();
        Если Выборка.BOF = Ложь Тогда
            Выборка.MoveFirst();
            Пока Выборка.EOF = Ложь Цикл
                Сообщить("[C_DateTime]="+Дата(Выборка.Fields("C_DateTime").Value)
                    +", [C_Char]="+СокрЛП(Выборка.Fields("C_Char").Value)
                    +", [C_Numeric]="+Число(Выборка.Fields("C_Numeric").Value));
                Выборка.MoveNext();
            КонецЦикла;
        КонецЕсли;
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

Результат в предприятии:

podkly-k-sql-iz-1s_008

6. Удаление записей из таблицы

Для удаления всех записей в таблице со значением C_Numeric=123456 выполняем код:

    /////////////////////////////////////////
    //Удаляем записи в таблице с C_Numeric = 123456
    ТекЧисло = 123456;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "DELETE FROM "+ТаблицаSQL+"
        |WHERE [C_Numeric]='"+ТекЧисло+"'";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись удалена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

Проверяем, что записей в таблице не осталось:

podkly-k-sql-iz-1s_009

7. Закрытие соединения

Ну и после выполнения всех необходимых действий необходимо закрыть соединение с SQL-сервером. Для этого достаточно вызвать метод Close() созданного COM-объекта:

    /////////////////////////////////////////
    //Закрытия соединения
    Попытка
        Соединение.Close();
        Сообщить("Соединение закрыто!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

8. Общий текст процедуры

Общий текст всей процедуры получился следующий:

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)

    //Инициализация переменных
    ИмяСервераSQL = "WIN2012\TEST_SQL";
    ПользовательSQL = "UserDB";
    ПарольSQL = "Pass123456";
    БазаДанныхSQL = "TestDB";
    ТаблицаSQL = "Table_1";


    /////////////////////////////////////////
    //Подключение к SQL-серверу
    Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
            "driver={SQL Server};" +
            "server="+ИмяСервераSQL+";"+
            "uid="+ПользовательSQL+";"+
            "pwd="+ПарольSQL+";"+
            "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
        Сообщить("Успешное подключение!");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;


    /////////////////////////////////////////
    //Добавляем запись в таблицу
    ТекДата = ТекущаяДата();
    ТекСтрока = "Запись строки";
    ТекЧисло = 123456;

    //Приобразуем данные
    Если НЕ ЗначениеЗаполнено(ТекДата) Тогда
        //Для пустой даты необходимо отправлять 01.01.1753
        ТекДата = Дата(1753,1,1);
    КонецЕсли;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "INSERT INTO "+ТаблицаSQL+"
        |([C_DateTime], [C_Char], [C_Numeric])
        |VALUES ('"+ТекДата+"', N'"+ТекСтрока+"', '"+ТекЧисло+"')";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись добавлена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;


    /////////////////////////////////////////
    //Обновляем записи в таблице с C_Numeric = 123456
    ТекЧисло = 123456;
    ТекДатаНовая = Дата(1,1,1);
    ТекСтрокаНовая = "Обновленная запись строки";

    //Приобразуем данные
    Если НЕ ЗначениеЗаполнено(ТекДатаНовая) Тогда
        //Для пустой даты необходимо отправлять 01.01.1753
        ТекДатаНовая = Дата(1753,1,1);
    КонецЕсли;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "UPDATE "+ТаблицаSQL+"
        |SET
        |   [C_Char] = N'"+ТекСтрокаНовая+"',
        |   [C_DateTime] = '"+ТекДатаНовая+"'
        |WHERE [C_Numeric]='"+ТекЧисло+"'";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись обновлена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

    /////////////////////////////////////////
    //Читаем записи
    ТекстИнструкции =
        "SELECT
        |   [C_DateTime], [C_Char], [C_Numeric]
        |FROM "+ТаблицаSQL;
    Попытка
        Команда.CommandText = ТекстИнструкции;
        Выборка = Команда.Execute();
        Если Выборка.BOF = Ложь Тогда
            Выборка.MoveFirst();
            Пока Выборка.EOF = Ложь Цикл
                Сообщить("[C_DateTime]="+Дата(Выборка.Fields("C_DateTime").Value)
                    +", [C_Char]="+СокрЛП(Выборка.Fields("C_Char").Value)
                    +", [C_Numeric]="+Число(Выборка.Fields("C_Numeric").Value));
                Выборка.MoveNext();
            КонецЦикла;
        КонецЕсли;
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

    /////////////////////////////////////////
    //Удаляем записи в таблице с C_Numeric = 123456
    ТекЧисло = 123456;
    ТекЧисло = Формат(ТекЧисло,"ЧГ="); //Удаляем пробелы

    ТекстТекущейИнструкции =
        "DELETE FROM "+ТаблицаSQL+"
        |WHERE [C_Numeric]='"+ТекЧисло+"'";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
        Сообщить("Запись удалена!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;


    /////////////////////////////////////////
    //Закрытия соединения
    Попытка
        Соединение.Close();
        Сообщить("Соединение закрыто!");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Результат работы в 1С:Предприятии:

podkly-k-sql-iz-1s_010

Помогла ли вам данная статья?
Да, спасибо, все получилось.
Немного помогла.
Совсем не помогла.
Не то, что я искал(а).
Смотреть результаты
Запись опубликована в рубрике Разработка в 1С с метками , , . Добавьте в закладки постоянную ссылку.




3 комментария на «Подключение к SQL-серверу из 1С:Предприятие 8 (пример кода)»

  1. myr4ik07 говорит:

    Дуже корисно. Дякую.

  2. Олег говорит:

    Спасибо, очень помогли!

  3. Алексей говорит:

    Отличная интересная статья о том как можно подключить свою страницу в интернете к 1с предприятию — очень удобно управлять торговлей.

Добавить комментарий

Ваш e-mail не будет опубликован.