Как правильно выполнить прямые SQL-запросы к PostgreSQL из 1С 8.3 на управляемых формах?

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

При работе с системой 1С:Предприятие 8.3 в некоторых случаях возникает необходимость выполнить прямые SQL-запросы к базе данных PostgreSQL, минуя стандартные объекты и механизмы 1С. Это может быть обусловлено различными причинами, такими как:

  1. Оптимизация производительности: Для выполнения сложных аналитических запросов или обработки больших объемов данных прямой SQL-запрос может быть значительно быстрее, чем аналогичный запрос средствами языка 1С, что наглядно показывает сравнение производительности штатных запросов 1С и прямого SQL.
  2. Доступ к специфичным функциям СУБД: Прямой доступ позволяет задействовать специфические функции PostgreSQL (JSONB, CTE, Window Functions), которые не представлены в стандартном языке запросов 1С.
  3. Интеграция с внешними системами: Иногда требуется получить данные в специфическом формате или выполнить операции, тесно связанные со структурой БД. При проектировании таких решений важно учитывать общую концепцию защищенной IT инфраструктуры, чтобы обеспечить безопасность данных.

Однако при этом подходе необходимо проявлять особую осторожность, поскольку любое некорректное изменение данных напрямую в базе может привести к нарушению целостности информационной базы 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".

Альтернативный механизм 1С: МенеджерОбъектаМетаданных.ПолучитьSQLЗапросКТекущейБазеДанных()

Для ограниченного прямого доступа к текущей базе данных 1С предоставляет механизм МенеджерОбъектаМетаданных.ПолучитьSQLЗапросКТекущейБазеДанных(). Этот метод позволяет получить текст SQL-запроса, который соответствует запросу на языке 1С, для последующего выполнения. Он предназначен для формирования запросов к таблицам конфигурации 1С и может быть полезен для отладки или изучения структуры, но имеет существенные ограничения:

  1. Он предоставляет только SQL-текст, но не выполняет его. Выполнение придется реализовывать сторонними средствами.
  2. Он в основном предназначен для чтения данных и не подходит для выполнения произвольных, сложных SQL-операций, а также для записи или изменения данных. В таких задачах эффективнее помогает специализированная обработка для работы со структурой хранения базы данных.
  3. Его возможности ограничены структурой, генерируемой 1С, и не позволяют использовать произвольные функции PostgreSQL.

Для более гибкого и мощного прямого доступа к PostgreSQL нам потребуется использовать внешние механизмы, такие как ADODB.Connection — для настройки интеграции есть модуль автоматической выгрузки данных 1С во внешние СУБД.

Использование ADODB.Connection для прямого доступа к PostgreSQL

Наиболее универсальным и гибким способом выполнения прямых SQL-запросов к базе данных PostgreSQL из 1С является использование объекта ADODB.Connection. Этот метод позволяет не только читать данные, но и проводить глубокий аудит системы. Рассмотрим по шагам, как это сделать.

Шаг 1: Установка необходимых драйверов

Перед тем как приступить к написанию кода, убедитесь, что на сервере 1С установлены актуальные драйверы ODBC/OLE DB для PostgreSQL. Если вы только разворачиваете окружение, можно использовать сценарий автоматизации установки PostgreSQL и 1С в Astra Linux, который поможет быстро настроить необходимые компоненты системы.

Шаг 2: Формирование строки подключения

Для установления соединения с базой данных нам потребуется строка подключения (connection string). Типичная строка подключения для PostgreSQL выглядит следующим образом:


СтрокаПодключения = "DRIVER={PostgreSQL UNICODE(x64)};SERVER=localhost;PORT=5432;DATABASE=ВашаБаза1С;UID=ПользовательБД;PWD=ПарольБД;";

Разберем параметры строки подключения:

Шаг 3: Установление соединения и выполнение запроса

После подготовки строки подключения мы можем создать объект 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();
КонецЕсли;

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

Одной из самых больших сложностей является определение внутренних имен таблиц (например, _Reference12345). Для оптимизации работы с такими таблицами часто требуется генератор скрипта для индексации таблиц базы данных PostgreSQL. Рассмотрим основные способы получения этих имен.

Способ 1: Использование консоли запросов 1С и виртуальных таблиц метаданных

Вы можете выполнить запрос к виртуальным таблицам метаданных 1С, чтобы увидеть соответствие имен:


ВЫБРАТЬ
    Реквизиты.Имя AS ИмяРеквизита1С,
    Реквизиты.ИмяТаблицыБД AS ИмяТаблицыSQL,
    Реквизиты.ИмяПоляБД AS ИмяПоляSQL
ИЗ
    Метаданные.Справочники.Номенклатура.Реквизиты КАК Реквизиты

Способ 2: Исследование структуры через pgAdmin

pgAdmin позволяет напрямую просматривать схему public, где расположены все таблицы 1С. Имена для справочников начинаются с _Reference, для документов — с _Document, для регистров сведений — с _InfoRg.

Способ 3: Динамическое получение схемы базы данных через ADODB

С помощью метода OpenSchema() можно программно получить список всех таблиц и их полей прямо из кода 1С, что избавляет от необходимости использовать внешние инструменты администрирования.

Способ 4: Запросы к системным таблицам PostgreSQL

Вы можете выполнять запросы к pg_catalog.pg_class или information_schema.columns. Этот подход дает максимальный контроль и детализацию, позволяя получать информацию об индексах и типах данных напрямую от СУБД.

Дополнительные рекомендации и меры предосторожности

  1. Права доступа: Используйте пользователя БД с минимально необходимыми правами.
  2. Безопасность: Не храните пароли к БД в открытом виде в коде.
  3. Транзакции: Настоятельно не рекомендуется изменять данные 1С напрямую через SQL UPDATE или DELETE, так как это нарушает логику контроля ссылочной целостности платформы.
  4. Тестирование: Всегда проверяйте запросы на тестовой копии.

Надеемся, что это подробное руководство поможет вам успешно работать с прямыми SQL-запросами к PostgreSQL из 1С 8.3. Мы рассмотрели все ключевые аспекты, от настройки соединения до анализа внутренней структуры таблиц.

← На главную