При работе с системой 1С:Предприятие 8.3 в некоторых случаях возникает необходимость выполнить прямые SQL-запросы к базе данных PostgreSQL, минуя стандартные объекты и механизмы 1С. Это может быть обусловлено различными причинами, такими как:
Однако при этом подходе необходимо проявлять особую осторожность, поскольку любое некорректное изменение данных напрямую в базе может привести к нарушению целостности информационной базы 1С.
В этой статье мы подробно разберем, как правильно установить соединение с базой данных PostgreSQL из 1С, выполнить SQL-запросы и получить результаты, а также как справиться с наиболее распространенными трудностями, такими как определение внутренних имен таблиц и полей.
СоединениеСБазойДанных() и ЗапросSQL()Начнем с распространенной ошибки, с которой часто сталкиваются разработчики. Многие пытаются использовать встроенные методы 1С, такие как СоединениеСБазойДанных() и ЗапросSQL(), для выполнения прямых запросов к той же самой базе данных, на которой работает текущая информационная база 1С. Однако это неверный подход.
Мы выяснили, что методы СоединениеСБазойДанных() и ЗапросSQL() предназначены для работы с внешними базами данных, отличными от той, на которой функционирует текущая 1С-система. Если вам необходимо настроить передачу информации в стороннее хранилище, лучше использовать готовую подсистему выгрузки данных во внешнюю базу SQL — в этом поможет подсистема автоматической выгрузки данных из 1С в PostgreSQL. Если же вы пытаетесь применить штатные методы к собственной базе 1С, вы, скорее всего, столкнетесь с ошибками типа "Ошибка при вызове метода контекста (Выполнить): Ошибка СУБД: column "Поле1" does not exist" или "Ошибки СУБД: ERROR: function pg_get_keywords() does not exist".
МенеджерОбъектаМетаданных.ПолучитьSQLЗапросКТекущейБазеДанных()Для ограниченного прямого доступа к текущей базе данных 1С предоставляет механизм МенеджерОбъектаМетаданных.ПолучитьSQLЗапросКТекущейБазеДанных(). Этот метод позволяет получить текст SQL-запроса, который соответствует запросу на языке 1С, для последующего выполнения. Он предназначен для формирования запросов к таблицам конфигурации 1С и может быть полезен для отладки или изучения структуры, но имеет существенные ограничения:
Для более гибкого и мощного прямого доступа к PostgreSQL нам потребуется использовать внешние механизмы, такие как ADODB.Connection — для настройки интеграции есть модуль автоматической выгрузки данных 1С во внешние СУБД.
Наиболее универсальным и гибким способом выполнения прямых SQL-запросов к базе данных PostgreSQL из 1С является использование объекта ADODB.Connection. Этот метод позволяет не только читать данные, но и проводить глубокий аудит системы. Рассмотрим по шагам, как это сделать.
Перед тем как приступить к написанию кода, убедитесь, что на сервере 1С установлены актуальные драйверы ODBC/OLE DB для PostgreSQL. Если вы только разворачиваете окружение, можно использовать сценарий автоматизации установки PostgreSQL и 1С в Astra Linux, который поможет быстро настроить необходимые компоненты системы.
Для установления соединения с базой данных нам потребуется строка подключения (connection string). Типичная строка подключения для PostgreSQL выглядит следующим образом:
СтрокаПодключения = "DRIVER={PostgreSQL UNICODE(x64)};SERVER=localhost;PORT=5432;DATABASE=ВашаБаза1С;UID=ПользовательБД;PWD=ПарольБД;";
Разберем параметры строки подключения:
DRIVER={PostgreSQL UNICODE(x64)}: Указывает используемый ODBC-драйвер.SERVER=localhost: IP-адрес или имя хоста сервера PostgreSQL.PORT=5432: Порт PostgreSQL (стандартный — 5432).DATABASE=ВашаБаза1С: Имя вашей информационной базы в PostgreSQL.UID=ПользовательБД и PWD=ПарольБД: Данные для авторизации.После подготовки строки подключения мы можем создать объект ADODB.Connection и использовать его для выполнения SQL-запросов. Рассмотрим пример:
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DRIVER={PostgreSQL UNICODE(x64)};SERVER=localhost;PORT=5432;DATABASE=ВашаБаза1С;UID=ПользовательБД;PWD=ПарольБД;";
Попытка
Соединение.Open(СтрокаПодключения);
Сообщить("Соединение с PostgreSQL установлено успешно.");
// Пример SQL-запроса к таблице справочника
ЗапросSQL = "SELECT ""_Fld12345"" AS ПолеКода, ""_Fld67890"" AS ПолеНаименования
FROM public.""_Reference12345""
WHERE ""_Fld12345"" LIKE '00%';";
НаборЗаписей = Соединение.Execute(ЗапросSQL);
Пока Не НаборЗаписей.EOF Цикл
ЗначениеКода = НаборЗаписей.Fields("ПолеКода").Value;
ЗначениеНаименования = НаборЗаписей.Fields("ПолеНаименования").Value;
Сообщить("Код: " + ЗначениеКода + ", Наименование: " + ЗначениеНаименования);
НаборЗаписей.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
КонецПопытки;
Если Соединение.State = 1 Тогда
Соединение.Close();
КонецЕсли;
Одной из самых больших сложностей является определение внутренних имен таблиц (например, _Reference12345). Для оптимизации работы с такими таблицами часто требуется генератор скрипта для индексации таблиц базы данных PostgreSQL. Рассмотрим основные способы получения этих имен.
Вы можете выполнить запрос к виртуальным таблицам метаданных 1С, чтобы увидеть соответствие имен:
ВЫБРАТЬ
Реквизиты.Имя AS ИмяРеквизита1С,
Реквизиты.ИмяТаблицыБД AS ИмяТаблицыSQL,
Реквизиты.ИмяПоляБД AS ИмяПоляSQL
ИЗ
Метаданные.Справочники.Номенклатура.Реквизиты КАК Реквизиты
pgAdmin позволяет напрямую просматривать схему public, где расположены все таблицы 1С. Имена для справочников начинаются с _Reference, для документов — с _Document, для регистров сведений — с _InfoRg.
С помощью метода OpenSchema() можно программно получить список всех таблиц и их полей прямо из кода 1С, что избавляет от необходимости использовать внешние инструменты администрирования.
Вы можете выполнять запросы к pg_catalog.pg_class или information_schema.columns. Этот подход дает максимальный контроль и детализацию, позволяя получать информацию об индексах и типах данных напрямую от СУБД.
UPDATE или DELETE, так как это нарушает логику контроля ссылочной целостности платформы.Надеемся, что это подробное руководство поможет вам успешно работать с прямыми SQL-запросами к PostgreSQL из 1С 8.3. Мы рассмотрели все ключевые аспекты, от настройки соединения до анализа внутренней структуры таблиц.