Как программно добавить данные в таблицу PostgreSQL из 1С

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

Интеграция 1С с внешними базами данных — это стандартная задача при построении сложных корпоративных систем. Одной из наиболее популярных СУБД для связки с 1С является PostgreSQL. В этой статье мы подробно разберем, как реализовать запись и чтение данных из PostgreSQL, используя технологию ADO (ActiveX Data Objects), проанализируем типичные ошибки и рассмотрим альтернативные, более современные подходы.

Решение задачи через COM-объекты ADO

Для взаимодействия с PostgreSQL из среды 1С чаще всего используется интерфейс ADODB. Это позволяет отправлять прямые SQL-запросы к базе данных. Рассмотрим пошагово процесс настройки соединения и выполнения команды вставки данных.

Первым делом нам необходимо подготовить строку подключения. Она зависит от установленного в системе драйвера ODBC. Разберем пример рабочего кода, который позволяет инициализировать соединение и выполнить INSERT запрос.


// 1. Инициализация соединения
Соединение = Новый ComObject("ADODB.Connection");
ConnectionString = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=my_database;Uid=my_user;Pwd=my_password;";

Попытка
    Соединение.Open(ConnectionString);
    Сообщить("Подключение к PostgreSQL успешно установлено!");
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// 2. Создание команды для записи данных
Команда = Новый ComObject("ADODB.Command");
Команда.ActiveConnection = Соединение;

// Текст запроса (важно соблюдать синтаксис PostgreSQL)
Команда.CommandText = "INSERT INTO documents (number, date) VALUES ('4516', '2020-10-01');";

Попытка
    Команда.Execute();
    Сообщить("Данные успешно добавлены");
Исключение
    Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
КонецПопытки;

Соединение.Close();

Проанализируем ситуацию, с которой часто сталкиваются разработчики: ошибка «нет поименованных аргументов». Как правило, она возникает, если объект Command или Connection инициализирован некорректно или если в строке запроса присутствуют символы, которые драйвер интерпретирует неверно. Использование явного создания объекта ADODB.Command вместо прямого вызова Execute у соединения помогает избежать многих проблем с типизацией параметров.

Чтение данных из PostgreSQL в таблицу значений 1С

После того как мы научились записывать данные, рассмотрим обратную задачу — получение данных. Для этого используется объект ADODB.RecordSet. Выясним причину, почему важно правильно переносить типы данных из SQL в 1С.

Рассмотрим пример получения данных и их выгрузки в ТаблицаЗначений:


Соединение = Новый ComObject("ADODB.Connection");
Соединение.Open(ConnectionString);

Команда = Новый ComObject("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "SELECT * FROM documents";

НаборЗаписей = Команда.Execute();

ВременнаяТаблица = Новый ТаблицаЗначений;

// Динамическое создание колонок на основе полей БД
Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count - 1 Цикл
    ИмяСтолбца = НаборЗаписей.Fields.Item(НомерСтолбца).Name;
    ВременнаяТаблица.Колонки.Добавить(ИмяСтолбца);
КонецЦикла;

// Перебор записей
Пока НЕ НаборЗаписей.EOF Цикл
    НоваяСтрока = ВременнаяТаблица.Добавить();
    Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count - 1 Цикл
        // Используем СокрЛП для строковых данных и корректное получение Value
        НоваяСтрока[НомерСтолбца] = НаборЗаписей.Fields(НомерСтолбца).Value;
    КонецЦикла;
    НаборЗаписей.MoveNext();
КонецЦикла;

Соединение.Close();

Критически важные нюансы при работе с PostgreSQL

При работе с внешними источниками через ADO существует несколько «подводных камней», о которых важно знать заранее, чтобы не тратить часы на отладку.

  1. Проблема разрядности (x86 vs x64): Это самая частая причина неудач. Если ваш сервер 1С работает в 64-битном режиме, вам необходимо установить в операционной системе именно 64-битный драйвер PostgreSQL ODBC. Если вы запускаете код в тонком клиенте на 32-битной Windows — нужен 32-битный драйвер. Помните, что 64-битный процесс не «видит» 32-битные драйверы и наоборот.
  2. Регистр имен таблиц и полей: PostgreSQL по умолчанию приводит все имена к нижнему регистру, если они не заключены в двойные кавычки. Если в pgAdmin вы создали таблицу Documents (с большой буквы), то в запросе из 1С лучше писать её имя в кавычках "Documents" или всегда использовать нижний регистр documents при проектировании базы.
  3. Формат даты: При передаче даты строкой всегда используйте стандарт ISO: YYYY-MM-DD. Это гарантирует, что PostgreSQL правильно интерпретирует значение независимо от региональных настроек сервера.

Использование внешних источников данных (native-способ)

Начиная с версии платформы 8.3, в 1С появился мощный инструмент — Внешние источники данных. Это более надежная альтернатива ADO.

Разберем преимущества этого метода:

Безопасность и оптимизация: Параметризованные запросы

Проанализируем ситуацию: что если в номере документа появится кавычка? Прямая склейка строки запроса приведет к ошибке или, что хуже, к SQL-инъекции. Рекомендуем использовать коллекцию Parameters объекта Command.


Команда = Новый ComObject("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "INSERT INTO documents (number, date) VALUES (?, ?)";

// Создаем параметры (Тип, Размер, Значение)
// 200 - adVarChar (строка), 135 - adDBTimeStamp (дата)
ПараметрНомер = Команда.CreateParameter("num", 200, 1, 20, "4516/А");
Команда.Parameters.Append(ПараметрНомер);

ПараметрДата = Команда.CreateParameter("dat", 135, 1, , ТекущаяДата());
Команда.Parameters.Append(ПараметрДата);

Команда.Execute();

Такой подход позволяет передавать данные в их исходном виде, а драйвер сам позаботится о правильном экранировании и форматировании. Кроме того, при массовой вставке данных (тысячи строк) обязательно используйте транзакции через методы Соединение.BeginTrans() и Соединение.CommitTrans(). Это ускоряет запись в десятки раз, так как база данных фиксирует изменения на диске один раз в конце транзакции, а не после каждой строки.

Таким образом, мы рассмотрели как базовые способы подключения к PostgreSQL через ADODB, так и более продвинутые методики, обеспечивающие стабильность и высокую скорость работы интеграции.

← На главную