Перейти к содержанию

SELTA/Устройство

Материал из Etersoft wiki


Устройство SELTA@Etersoft

SELTA@Etersoft позволяет 1С:Предприятию 7.7 (SQL-версии), которое умеет работать только с MS SQL Server, работать с PostgreSQL. Сама 1С не меняется: она думает, что работает с MS SQL Server. SELTA состоит из клиентской части на каждом рабочем месте Windows и серверной части — схемы SELTA в каждой базе PostgreSQL.

Путь запроса

 1С:Предприятие 7.7 (32-битное)
      │  ODBC, драйвер «SQL Server»
      ▼
 Диспетчер ODBC Windows (odbc32.dll)
      │
      ▼
 psqlodbc35wselta.dll — ODBC-драйвер SELTA, зарегистрирован вместо драйвера «SQL Server»
      │  текст запроса T-SQL
      ▼
 selta.dll — транслятор T-SQL → SQL/PL/pgSQL PostgreSQL (GOLD Parser)
      │  запрос PostgreSQL
      ▼
 сеть, протокол PostgreSQL (TCP 5432, пароль SCRAM-SHA-256 или MD5)
      ▼
 PostgreSQL: база 1С со схемой SELTA (типы mchar/mvarchar, функции и таблицы,
             изображающие MS SQL Server) и служебная база master
  1. 1С открывает подключение к «SQL Server» с указанными в Конфигураторе сервером, базой, пользователем и паролем. Первым делом она подключается к базе master, как к MS SQL Server.
  2. Диспетчер ODBC загружает драйвер, зарегистрированный под именем «SQL Server». После установки SELTA это драйвер SELTA, а исходный драйвер Microsoft сохраняется и возвращается при выключении или удалении SELTA.
  3. Драйвер подключается к PostgreSQL, проверяет версию схемы SELTA в базе и отвечает 1С версией MS SQL Server. Затем передаёт серверу имя компьютера клиента для HOST_NAME().
  4. Каждый запрос 1С драйвер передаёт транслятору selta.dll. Транслятор разбирает T-SQL грамматикой GOLD Parser и строит запрос PostgreSQL, вызывающий при необходимости функции схемы SELTA. Запросы с префиксом !! идут на сервер без трансляции (так работают служебные запросы самой SELTA).
  5. Результат PostgreSQL драйвер отдаёт 1С так, как его отдал бы драйвер MS SQL Server.

Клиентская часть (Windows)

Ставится файлом selta.msi (32-битная) или selta64.msi (64-битная) в каталог Program Files\Selta.

Файл Назначение
psqlodbc35wselta.dll ODBC-драйвер. Основан на драйвере psqlodbc 8.2 с изменениями SELTA: выдаёт себя за драйвер MS SQL Server, вызывает транслятор, эмулирует динамические курсоры и управление транзакциями MS SQL, поддерживает PostgreSQL 9.2–18 и вход по SCRAM-SHA-256. Исходные коды драйвера открыты по лицензии драйвера PostgreSQL.
selta.dll Транслятор T-SQL (закрытая часть). Проверяет лицензию.
odbcbcp.dll Эмуляция BCP API MS SQL Server (массовая загрузка). Копируется в системный каталог, исходная библиотека сохраняется как ms_odbcbcp.dll.
Selta.exe Центр управления SELTA@Etersoft: включение и выключение SELTA, лицензия, создание, инициализация, обновление и диагностика баз, конвертор, тест запросов, загрузка дампа.
SeltaCmd.exe Управление из командной строки (конвертор).
Scripts\8308\*.sql Скрипты схемы SELTA: установка, обновление между версиями, удаление.
selta.lic Файл лицензии, добавляется после установки.

Регистрация в реестре: HKLM\Software\Etersoft\SELTA@Etersoft (путь установки, состояние «включена/выключена»), драйвер «SQL Server» в HKLM\Software\ODBC\ODBCINST.INI\SQL Server. 32-битная версия на 64-битной Windows пишет в 32-битный раздел реестра (Wow6432Node) и в SysWOW64 — именно его видит 32-битная 1С 7.7.

32 и 64 бита

1С:Предприятие 7.7 бывает только 32-битным, поэтому для неё всегда нужна 32-битная SELTA (selta.msi), в том числе на 64-битной Windows. 64-битная SELTA (selta64.msi) нужна только 64-битным программам, которые обращаются к базе 1С как к MS SQL Server (например, Excel x64 или MS Query). Обе версии можно поставить на один компьютер. Учтите: 64-битная SELTA подменяет драйвер «SQL Server» для всех 64-битных программ этого компьютера.

Серверная часть (PostgreSQL)

В каждой базе, с которой работает 1С через SELTA, ставится схема SELTA (версия 1.1.6 — схема 116):

  • типы mchar и mvarchar — аналоги char/varchar MS SQL Server со сравнением без учёта регистра (модуль mchar, см. варианты PostgreSQL);
  • системные представления MS SQL Server, к которым обращается 1С: sysobjects, syscolumns, sysindexes, sysdatabases, sysprocesses, sysmessages, syscomments;
  • функции MS SQL Server: OBJECT_ID, DB_ID, SERVERPROPERTY, HOST_NAME, sp_addmessage/sp_dropmessage, DAY/MONTH/YEAR, LEFT/RIGHT, LTRIM/RTRIM, STR и другие;
  • типизированный LIKE с правилами MS SQL Server (selta_like; правила сверены с SQL Server 2022: хвостовые пробелы, [...], ESCAPE, «ё»);
  • служебные функции и таблицы SELTA: pg_selta_version (версия схемы), selta_supported_mssql_version, динамические курсоры, блокировки (selta_lock_table), триггеры учёта изменений, загрузка таблиц BCP (LoadTable).

База master — служебная, как в MS SQL Server; 1С подключается к ней первой.

Схему ставят, обновляют и удаляют скриптами из Scripts\8308 — из Центра управления на клиенте или скриптом selta-pg-setup на сервере Linux. Обновление идёт цепочкой скриптов 8308selta_up_A_to_B.sql одной транзакцией: при ошибке база остаётся прежней.

Серверу нужны настройки, без которых 1С не работает:

  • standard_conforming_strings = off, escape_string_warning = off — транслятор строит строки с обратной косой чертой;
  • client_min_messages = error — 1С считает ошибкой любое замечание сервера (NOTICE);
  • модуль mchar в shared_preload_libraries; у PostgreSQL для 1С туда же добавляют fasttrun, fulleq, online_analyze, plantuner;
  • базы в кодировке UTF8, локаль ru_RU.UTF-8.

selta-pg-setup выставляет их сам.

Лицензия

Файл selta.lic подписан ключом Etersoft (DSA). Без действующей лицензии драйвер не загружается. Срок проверяется по дате UTC: DATE_START — первый день действия, DATE_END — день окончания.

Где лежит исходный код

  • драйвер, Центр управления, схема SELTA, MSI — репозиторий selta;
  • транслятор — репозиторий goldparser;
  • серверный пакет и скрипт настройки — etersoft/selta-server;
  • модуль mchar для обычного PostgreSQL — etersoft/postgresql-mchar.