Как получить данные из SQL-базы данных сайта на Node.js в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция 1С с внешними веб-ресурсами — это классическая задача, которая может быть решена несколькими способами в зависимости от архитектуры проекта и требований безопасности. Когда сайт написан на Node.js и использует базу данных (например, MySQL или PostgreSQL), перед разработчиком 1С встает выбор: подключаться к базе напрямую или взаимодействовать с сайтом через "прослойку" в виде API. Рассмотрим подробно оба подхода, их плюсы, минусы и техническую реализацию.

Способ №1: Создание собственного API (Рекомендуемый метод)

Этот метод считается стандартом индустрии. Мы не лезем в "кишки" базы данных напрямую, а просим сайт отдать нам нужные данные в понятном формате (обычно JSON). Это безопаснее, так как база данных сайта остается закрытой от внешнего мира, а логику отбора данных контролирует сервер Node.js.

Разберем по шагам реализацию на стороне Node.js (Express):

Для начала на стороне сайта создается endpoint (конечная точка), к которой 1С будет обращаться с HTTP-запросом. Простейший пример на фреймворке Express может выглядеть так:


const express = require('express');
const app = express();
const mysql = require('mysql');

// Настройка подключения к БД
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'mysite_db'
});

app.get('/api/getdata', (req, res) => {
    let sql = 'SELECT * FROM orders WHERE status = "new"';
    db.query(sql, (err, results) => {
        if(err) throw err;
        res.json(results); // Отправляем данные в формате JSON
    });
});

app.listen('3000', () => {
    console.log('Server started on port 3000');
});

Проанализируем ситуацию на стороне 1С (новичкам поможет обучающий курс по HTTP-запросам):

В 1С мы используем объекты HTTPСоединение и HTTPЗапрос (для их отладки пригодится аналог Postman на платформе 1С). Полученный ответ мы разбираем с помощью встроенных средств работы с JSON.


&НаСервере
Процедура ПолучитьДанныеССайте()
    
    Сервер = "mysite.ru";
    Порт = 443; // Или 80, если без SSL
    
    // Создаем соединение (используйте защищенное соединение для HTTPS)
    Соединение = Новый HTTPСоединение(Сервер, Порт, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    
    Запрос = Новый HTTPЗапрос("/api/getdata");
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            // Читаем JSON
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            ДанныеБазы = ПрочитатьJSON(Чтение);
            Чтение.Закрыть();
            
            // Теперь в переменной ДанныеБазы у нас Массив или Структура
            Для Каждого СтрокаДанных Из ДанныеБазы Цикл
                Сообщить("Получен заказ №: " + СтрокаДанных.id);
            КонецЦикла;
        Иначе
            Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось подключиться: " + ИнформацияОбОшибке().Описание);
    КонецПопытки;
    
КонецПроцедуры

Способ №2: Прямое подключение к SQL (через ODBC или Внешние источники данных)

Если по каким-то причинам API написать невозможно, мы можем рассмотреть вариант прямого подключения к базе данных. Однако помните: большинство хостинг-провайдеров блокируют порт 3306 (для MySQL) для внешних соединений. Вам придется добавить IP-адрес вашего сервера 1С в "белый список" в панели управления хостингом.

Рассмотрим использование механизма "Внешние источники данных":

  1. В конфигураторе 1С найдите ветку Внешние источники данных.
  2. Добавьте новый источник. На вкладке "Таблицы" нажмите "Добавить".
  3. Вам потребуется настроить строку соединения. Для MySQL она выглядит примерно так: DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=my_server_ip;Database=my_db_name;User=my_user;Password=my_password;Option=3;.
  4. Важно: Разрядность ODBC-драйвера (32 или 64 бита) должна совпадать с разрядностью вашего сервера 1С (или клиента, если код выполняется на клиенте).

Посмотрим на программный пример обращения через объектную модель:


ИмяИсточника = "МойСайтБД";
ВнешнийИсточник = ВнешниеИсточникиДанных[ИмяИсточника];

// Установка параметров соединения программно, если они не заданы в метаданных
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.1;UID=admin;PWD=password;Database=site_db;";

Попытка
    ВнешнийИсточник.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
    ВнешнийИсточник.УстановитьСоединение();
    
    // Пример запроса к внешней таблице
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТаблицаТоваров.Наименование,
        |   ТаблицаТоваров.Цена
        |ИЗ
        |   ВнешнийИсточникДанных.МойСайтБД.Таблица.products КАК ТаблицаТоваров";
    
    Результат = Запрос.Выполнить().Выгрузить();
    // Обрабатываем результат как обычную таблицу значений 1С
Исключение
    Сообщить("Ошибка подключения к SQL: " + ИнформацияОбОшибке().Описание);
КонецПопытки;

Способ №3: Использование COM-объекта ADO (для Windows-серверов)

Если вы не хотите добавлять таблицы в метаданные конфигурации, можно использовать прямой доступ через ADODB.Connection. Этот метод часто используется в "старой школе" программирования 1С, но он по-прежнему эффективен для простых разовых операций.

Разберем по шагам создание подключения через COM:


Соединение = Новый COMОбъект("ADODB.Connection");
RecordSet = Новый COMОбъект("ADODB.Recordset");

СтрокаСоединения = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=your_host;Database=your_db;User=your_user;Password=your_pass;";

Попытка
    Соединение.Open(СтрокаСоединения);
    ТекстЗапроса = "SELECT login, email FROM users WHERE active = 1";
    
    RecordSet = Соединение.Execute(ТекстЗапроса);
    
    Пока НЕ RecordSet.EOF Цикл
        Сообщить("Пользователь: " + RecordSet.Fields("login").Value + " Email: " + RecordSet.Fields("email").Value);
        RecordSet.MoveNext();
    КонецЦикла;
    
    RecordSet.Close();
    Соединение.Close();
Исключение
    Сообщить("Ошибка выполнения прямого запроса: " + ОписаниеОшибки());
КонецПопытки;

Нюансы, которые стоит учитывать

Выясним причину возможных ошибок:

Подведем итог: Самый правильный и современный путь — Способ №1 (API). Он позволяет абстрагироваться от структуры БД, защищает данные и легче масштабируется. Прямое SQL-подключение (Способы №2 и №3) стоит использовать только в закрытых корпоративных сетях или при невозможности модифицировать код сайта.

← На главную