Интеграция 1С с внешними веб-ресурсами — это классическая задача, которая может быть решена несколькими способами в зависимости от архитектуры проекта и требований безопасности. Когда сайт написан на Node.js и использует базу данных (например, MySQL или PostgreSQL), перед разработчиком 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);
КонецЦикла;
Иначе
Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось подключиться: " + ИнформацияОбОшибке().Описание);
КонецПопытки;
КонецПроцедуры
Если по каким-то причинам API написать невозможно, мы можем рассмотреть вариант прямого подключения к базе данных. Однако помните: большинство хостинг-провайдеров блокируют порт 3306 (для MySQL) для внешних соединений. Вам придется добавить IP-адрес вашего сервера 1С в "белый список" в панели управления хостингом.
Рассмотрим использование механизма "Внешние источники данных":
DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=my_server_ip;Database=my_db_name;User=my_user;Password=my_password;Option=3;.Посмотрим на программный пример обращения через объектную модель:
ИмяИсточника = "МойСайтБД";
ВнешнийИсточник = ВнешниеИсточникиДанных[ИмяИсточника];
// Установка параметров соединения программно, если они не заданы в метаданных
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.1;UID=admin;PWD=password;Database=site_db;";
Попытка
ВнешнийИсточник.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешнийИсточник.УстановитьСоединение();
// Пример запроса к внешней таблице
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТоваров.Наименование,
| ТаблицаТоваров.Цена
|ИЗ
| ВнешнийИсточникДанных.МойСайтБД.Таблица.products КАК ТаблицаТоваров";
Результат = Запрос.Выполнить().Выгрузить();
// Обрабатываем результат как обычную таблицу значений 1С
Исключение
Сообщить("Ошибка подключения к SQL: " + ИнформацияОбОшибке().Описание);
КонецПопытки;
Если вы не хотите добавлять таблицы в метаданные конфигурации, можно использовать прямой доступ через 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();
Исключение
Сообщить("Ошибка выполнения прямого запроса: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину возможных ошибок:
CharSet=utf8;.DATETIME в SQL не всегда автоматически конвертируются в Дата 1С. Иногда приходится использовать функции преобразования в самом SQL-запросе, например, DATE_FORMAT(my_date, '%Y-%m-%d %H:%i:%s').localhost:3306. Для 1С это будет выглядеть так, будто база находится на том же сервере.Подведем итог: Самый правильный и современный путь — Способ №1 (API). Он позволяет абстрагироваться от структуры БД, защищает данные и легче масштабируется. Прямое SQL-подключение (Способы №2 и №3) стоит использовать только в закрытых корпоративных сетях или при невозможности модифицировать код сайта.