Переход серверной части 1С на операционную систему Linux ставит перед разработчиками ряд серьезных задач. Одна из самых распространенных — это необходимость взаимодействия со сторонними базами данных PostgreSQL. Если в среде Windows мы привыкли использовать COM-объекты (например, ADODB.Connection), то в Linux этот механизм недоступен. В данной статье мы подробно разберем, как реализовать полноценное управление данными (вставка, обновление, удаление) в сторонней СУБД PostgreSQL, работая в среде Linux. В качестве готовой альтернативы ручной разработке запросов можно применить подсистему для выгрузки и изменения данных во внешней базе SQL.
Многие разработчики ошибочно полагают, что механизм Внешние источники данных предназначен только для чтения (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 = '" + ИдентификаторОбъекта + "'";
// Выполнение команды напрямую через менеджер внешнего источника
ВнешниеИсточникиДанных[ИмяИсточника].ВыполнитьКоманду(СтрокаЗапроса);
КонецПроцедуры
Если механизм ВИД кажется вам слишком громоздким или требуется максимальная скорость выполнения запросов без «прослойки» платформы, следует рассмотреть использование внешних компонент. В среде Linux 1С отлично работает с компонентами, написанными по технологии Native API (файлы с расширением .so).
Проанализируем преимущества этого подхода. Внешняя компонента может использовать родную библиотеку PostgreSQL — libpq. Это позволяет транслировать SQL-запросы напрямую в сокет СУБД. Выясним, как обычно строится работа с такой компонентой:
UPDATE stock SET count = count - 1 WHERE id = 101).Рассмотрим примерный программный интерфейс такой работы:
// Загрузка компоненты
РезультатЗагрузки = ПодключитьВнешнююКомпоненту("ОбщийМакет.Компонента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.ПоследняяОшибка);
КонецЕсли;
КонецЕсли;
В ситуациях, когда нужно выполнить разовую операцию или регламентное задание, а настраивать 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 проигнорирует его.
Современным и наиболее универсальным способом является отказ от прямых SQL-запросов в пользу HTTP-сервисов. На стороне PostgreSQL можно развернуть небольшое приложение на Python (FastAPI) или использовать готовое решение, такое как PostgREST. Этот инструмент автоматически создает полноценное REST API на основе схем вашей базы данных PostgreSQL.
Выясним, почему это удобно для 1С на Linux:
HTTPСоединение.Посмотрим на пример отправки данных через HTTP:
Соединение = Новый HTTPСоединение("api.myserver.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/rpc/update_inventory");
Запрос.УстановитьТелоИзСтроки("{""item_id"": 10, ""new_qty"": 50}", КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Данные успешно обновлены
КонецЕсли;
Мы рассмотрели несколько вариантов решения проблемы «прямых» запросов к PostgreSQL из-под Linux. Выбор конкретного метода зависит от ваших задач:
Каждый из этих методов позволяет обойти ограничения, связанные с отсутствием COM на Linux, и обеспечить стабильную работу вашей системы 1С с внешними данными.