diamond АШ Tlg

SQL-Proxy: http-сервис, транслирующий SQL-запросы через REST API

Предназначен для миграции конфигураций 1C, использующих ADODB, на платформу Linux с минимальными трудозатратами. Поддерживает PostgreSQL, MS SQL, MySQL.

Описание

Легковесный REST-сервис для работы с базами данных в условиях отсутствия ADODB (например, в 1С на Linux)

Этот REST-сервис был разработан как альтернатива прямым вызовам SQL-запросов через устаревший слой ADODB, который недоступен при работе 1С:Предприятие на Linux-платформах. Он позволяет продолжить использование SQL-операций из конфигурации 1С даже в тех средах, где нативные драйверы БД или COM-объекты недоступны.

Почему это полезно для 1С?

Начиная с поддержки 1С в облаке и на Linux, многие традиционные способы взаимодействия с внешними базами данных (например, через ADODB) перестают работать. У 1С есть есть костыль в виде объекта конфигурации "Внешний источник данных", но лично мне он не нравится из-за необходимости коренной ломки конфигурации и ограниченности некоторых функций, а также крайнего неудобства и трудоёмкости разработки. Данный сервис закрывает этот пробел, позволяя переносить существующие решения 1С на новые платформы без потери функционала и существенной ломки уже работающих алгоритмов, структур и доступов к СУБД.

Особенности реализации

  • Написан на компилируемом языке, что обеспечивает высокую производительность и минимальную потребность в вычислительных ресурсах, в особенности отличаясь по этим параметрам от подобных решений на Java, JavaScrypt и Python
  • Не требует установки дополнительных библиотек, драйверов или зависимостей
  • Кроссплатформенный — работает одинаково хорошо на Windows, Linux и в облаке
  • Гибкая система настроек и минимальное время на развёртывание
  • Безопасное управление учётными данными - сервис не хранит учетные данные SQL серверов, обеспечивая защиту конфиденциальной информации
  • Безопасность - не выполняет проверку SQL-запросов в целях безопасности. Ответственность за настройку соответствующих привилегий лежит на администраторе баз данных (помним, что это замена вызовов ADODB).

Поставляется в виде готового проекта с исходным кодом на языке Go:

Ссылка на репозиторий GitHub

Основные функции

  • Поддержка нескольких типов баз данных без необходимости установки драйверов в систему: PostgreSQL, Microsoft SQL Server и MySQL. При необходимости могут быть интегрированы дополнительные стандартные драйверы, имеющиеся в репозиториях экосистемы Golang;
  • Режим запуска: можно настроить как простую отдельную службу, так и использовать в контейнере в k8s;
  • Безопасная передача данных: при необходимости поддерживает HTTPS для безопасной передачи данных через сеть;
  • Пул соединений: использует общий, SQL-соединения переиспользуются. Задачи обслуживания регулярно автоматически удаляют неиспользуемые или зависшие подключения;
  • Поддержка SQL-команд: в настоящее время поддерживаются все SQL-команды без ограничений. Команда SELECT возвращает результаты запроса в виде гибкого JSON-набора записей;
  • Ограничение результатов: есть настройка на ограничение на количество строк, возвращаемых командами SELECT, с индикацией о превышении;
  • Сетевые привязки: может быть ограничен для доступа на localhost или любой указанный IP-адрес для повышения безопасности. По умолчанию предполагается привязка на localhost и работа на одном сервере с сервисом ПО-клиента, например на сервере 1С-Предприятия;
  • Мониторинг: предоставляет метрики Prometheus для мониторинга производительности и состояния;
  • Prepared statements: поддерживаются.

Описание API

См. спецификацию Swagger OpenAPI 3.0 в /src/docs в исходниках - можно смотреть соответствующим плагином Vscode.

API swagger

Там же можно найти пример вызова методов REST API из модуля 1С, ниже фрагмент получения результата выполнения обычного запроса:

// Выполняет обычные SQL-запросы вида выборки таблиц
// Параметры: 
// 		SQLСоединение - Строка - GUID открытого соединения
// 		SQLЗапрос 	  - Строка - Текст SQL-запроса
// Возвращаемое значение: 
// 		Результат запроса - Структура, содержащая массив структур - результат выборки запроса
Функция ЗапросВыборкаДанных(SQLСоединение, SQLЗапрос) Экспорт
		
	http = Новый HTTPСоединение("localhost", 8080);
	path = "/api/v1/query";                        	
	
	headers = Новый Соответствие;
	headers.Вставить("API-Version", "1.2");	
	headers.Вставить("Connection-Id", SQLСоединение);	
	headers.Вставить("Content-Type", "text/plain;charset=UTF-8");	
	
	query = Новый HTTPЗапрос(path, headers);
	query.УстановитьТелоИзСтроки(SQLЗапрос);
		
	Ответ = http.ВызватьHTTPМетод("POST", query);
	КодРезультата = Ответ.КодСостояния;
	Если КодРезультата = 200 Тогда	
		Возврат ДесериализоватьИзJSON(Ответ.ПолучитьТелоКакСтроку());
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции	

Как скомпилировать

Выполнить в папке проекта:

make prod

Как запустить

Настройки передаются через переменные окружения, см. Makefile для деталей. По умолчанию без переданных параметров сервис слушает на localhost:8080. Для запуска демоном необходимо написать соответствующий файл конфигурации или скрипт для системы инициализации конкретного дистрибутива Linux, для запуска в контейнере написать свой Dockerfile.

BIND_ADDR=localhost BIND_PORT=8081 MAX_ROWS=10000 LOG_LEVEL=3 sql-proxy