Как выполнить прямой запрос к PostgreSQL из 1С на Linux для изменения данных?

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

Переход серверной части 1С на операционную систему Linux ставит перед разработчиками ряд серьезных задач. Одна из самых распространенных — это необходимость взаимодействия со сторонними базами данных PostgreSQL. Если в среде Windows мы привыкли использовать COM-объекты (например, ADODB.Connection), то в Linux этот механизм недоступен. В данной статье мы подробно разберем, как реализовать полноценное управление данными (вставка, обновление, удаление) в сторонней СУБД PostgreSQL, работая в среде Linux. В качестве готовой альтернативы ручной разработке запросов можно применить подсистему для выгрузки и изменения данных во внешней базе SQL.

Способ 1. Использование механизма «Внешние источники данных» (ВИД)

Многие разработчики ошибочно полагают, что механизм Внешние источники данных предназначен только для чтения (SELECT). Однако, начиная с платформы 8.3, этот функционал позволяет выполнять полноценные операции INSERT, UPDATE и DELETE. Рассмотрим процесс настройки по шагам.

Первым делом нам необходимо подготовить окружение на сервере Linux, где запущен сервер 1С. Поскольку 1С взаимодействует с внешними СУБД через стандарт ODBC, нам потребуется установить менеджер драйверов unixODBC и сам драйвер psqlODBC. При возникновении сложностей с настройкой конфигурационных файлов в ОС можно использовать справочник по администрированию Windows/Linux и 1С.

Разберем пример настройки конфигурационных файлов в Linux (обычно находятся в /etc/):

В файле /etc/odbcinst.ini необходимо описать сам драйвер:


[PostgreSQL]
Description = PostgreSQL ODBC driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
Debug = 0
CommLog = 1
UsageCount = 1

В файле /etc/odbc.ini настроим конкретное соединение с базой данных:


[ExternalPostgres]
Description = Connection to Third-Party DB
Driver = PostgreSQL
Database = my_external_db
Servername = 192.168.1.100
UserName = admin
Password = password
Port = 5432
ReadOnly = No
ConnSettings = SET client_encoding to 'UTF8'

Обратите внимание на параметр ReadOnly = No и ConnSettings. Установка кодировки UTF8 критически важна для корректной передачи кириллицы из 1С в PostgreSQL. После настройки системных файлов переходим в Конфигуратор 1С.

В дереве конфигурации создаем новый объект ВнешнийИсточникДанных. В его свойствах на вкладке «Данные» добавляем таблицу из нашей внешней базы. Чтобы иметь возможность изменять данные, обязательно проанализируем настройки таблицы: свойство «Разрешить редактирование» должно быть включено.

Теперь рассмотрим, как программно выполнить произвольный запрос на обновление данных. Мы можем использовать метод ВыполнитьКоманду():


// Пример выполнения произвольного SQL-запроса на удаление
Процедура УдалитьСтарыеЗаписи(ИдентификаторОбъекта)
    ИмяИсточника = "ВнешнийPostgres";
    СтрокаЗапроса = "DELETE FROM public.my_table WHERE object_id = '" + ИдентификаторОбъекта + "'";
    
    // Выполнение команды напрямую через менеджер внешнего источника
    ВнешниеИсточникиДанных[ИмяИсточника].ВыполнитьКоманду(СтрокаЗапроса);
КонецПроцедуры

Способ 2. Использование внешних компонент (Native API)

Если механизм ВИД кажется вам слишком громоздким или требуется максимальная скорость выполнения запросов без «прослойки» платформы, следует рассмотреть использование внешних компонент. В среде Linux 1С отлично работает с компонентами, написанными по технологии Native API (файлы с расширением .so).

Проанализируем преимущества этого подхода. Внешняя компонента может использовать родную библиотеку PostgreSQL — libpq. Это позволяет транслировать SQL-запросы напрямую в сокет СУБД. Выясним, как обычно строится работа с такой компонентой:

  1. Загрузка компоненты в память сервера 1С.
  2. Установка соединения (передача строки подключения с хостом, портом и учетными данными).
  3. Передача строки запроса (например, UPDATE stock SET count = count - 1 WHERE id = 101).
  4. Получение ответа о количестве затронутых строк.

Рассмотрим примерный программный интерфейс такой работы:


// Загрузка компоненты
РезультатЗагрузки = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаPostgres", "PGDB", ТипВнешнейКомпоненты.Native);

Если РезультатЗагрузки Тогда
    ОбъектPG = Новый("AddIn.PGDB.PostgreSQL_Client");
    ОбъектPG.УстановитьСоединение("host=127.0.0.1 port=5432 dbname=test user=postgres password=pass");
    
    ЗапросSQL = "INSERT INTO events (event_time, description) VALUES (NOW(), 'Данные из 1С на Linux')";
    Результат = ОбъектPG.Выполнить(ЗапросSQL);
    
    Если Не Результат Тогда
        Сообщить("Ошибка: " + ОбъектPG.ПоследняяОшибка);
    КонецЕсли;
КонецЕсли;

Способ 3. Вызов консольной утилиты psql

В ситуациях, когда нужно выполнить разовую операцию или регламентное задание, а настраивать ODBC нет времени, можно воспользоваться стандартной утилитой psql, которая всегда есть на сервере, где установлен PostgreSQL. 1С на Linux может вызывать системные команды через ЗапуститьПриложение.

Разберем ситуацию: нам нужно быстро обновить статус заказа во внешней базе. Посмотрим на пример кода:


КомандаЗапуска = "psql -h 127.0.0.1 -U dbuser -d target_db -c ""UPDATE orders SET status = 'processed' WHERE id = 555""";

// Чтобы psql не запрашивал пароль интерактивно, 
// используем переменную окружения или файл .pgpass
ПеременныеОкружения = Новый Соответствие;
ПеременныеОкружения.Вставить("PGPASSWORD", "my_secret_password");

ЗапуститьПриложение(КомандаЗапуска, , Истина, , ПеременныеОкружения);

Важный нюанс: использование переменной PGPASSWORD считается менее безопасным, чем использование файла .pgpass в домашней директории пользователя, под которым запущен процесс usr1cv8. Проанализируем права доступа: файл .pgpass должен иметь права 0600, иначе psql проигнорирует его.

Способ 4. Использование архитектурной прослойки (HTTP API)

Современным и наиболее универсальным способом является отказ от прямых SQL-запросов в пользу HTTP-сервисов. На стороне PostgreSQL можно развернуть небольшое приложение на Python (FastAPI) или использовать готовое решение, такое как PostgREST. Этот инструмент автоматически создает полноценное REST API на основе схем вашей базы данных PostgreSQL.

Выясним, почему это удобно для 1С на Linux:

Посмотрим на пример отправки данных через HTTP:


Соединение = Новый HTTPСоединение("api.myserver.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/rpc/update_inventory");
Запрос.УстановитьТелоИзСтроки("{""item_id"": 10, ""new_qty"": 50}", КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Данные успешно обновлены
КонецЕсли;

Подведем итоги

Мы рассмотрели несколько вариантов решения проблемы «прямых» запросов к PostgreSQL из-под Linux. Выбор конкретного метода зависит от ваших задач:

  1. Для тесной интеграции с бизнес-логикой и использования типов данных 1С лучше всего подходит ODBC + Внешние источники данных.
  2. Для высоконагруженных систем и сложных SQL-запросов оптимально использовать внешние компоненты Native API.
  3. Для простых и редких операций можно ограничиться вызовом psql.
  4. Для построения масштабируемой и современной архитектуры рекомендуем использовать HTTP-сервисы.

Каждый из этих методов позволяет обойти ограничения, связанные с отсутствием COM на Linux, и обеспечить стабильную работу вашей системы 1С с внешними данными.

← На главную