Интеграция 1С с внешними базами данных — это стандартная задача при построении сложных корпоративных систем. Одной из наиболее популярных СУБД для связки с 1С является PostgreSQL. В этой статье мы подробно разберем, как реализовать запись и чтение данных из PostgreSQL, используя технологию ADO (ActiveX Data Objects), проанализируем типичные ошибки и рассмотрим альтернативные, более современные подходы.
Для взаимодействия с 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 у соединения помогает избежать многих проблем с типизацией параметров.
После того как мы научились записывать данные, рассмотрим обратную задачу — получение данных. Для этого используется объект 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();
При работе с внешними источниками через ADO существует несколько «подводных камней», о которых важно знать заранее, чтобы не тратить часы на отладку.
Documents (с большой буквы), то в запросе из 1С лучше писать её имя в кавычках "Documents" или всегда использовать нижний регистр documents при проектировании базы.YYYY-MM-DD. Это гарантирует, что PostgreSQL правильно интерпретирует значение независимо от региональных настроек сервера.Начиная с версии платформы 8.3, в 1С появился мощный инструмент — Внешние источники данных. Это более надежная альтернатива ADO.
Разберем преимущества этого метода:
unixODBC).Проанализируем ситуацию: что если в номере документа появится кавычка? Прямая склейка строки запроса приведет к ошибке или, что хуже, к 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, так и более продвинутые методики, обеспечивающие стабильность и высокую скорость работы интеграции.