Описание
PG1C - это расширение PostgreSQL, которое "встраивает" информационную базу 1С (файловую или клиент-серверную) в PostgreSQL - создает и обновляет таблицы максимально идентичные таблицам 1С (объектам конфигурации). Данные 1С интегрированы в PostgreSQL "как есть": простые SQL-запросы копируются из платформы 1С (например, из Консоли запросов) в PostgreSQL без изменений, сложные — с минимальными изменениями.
Данные в таблицах обновляются либо по расписанию, либо непосредственно в SQL-запросе. Поддерживаются 4 режима обновления данных: полное и быстрое отдельной процедурой (например, в фоновом режиме по расписанию), полное и по первичному ключу в SQL-запросе (например, в важных отчетах). Обновление метаданных выполняется без пересоздания таблицы, данных — без перезаписи строк таблицы, это позволяет настраивать права доступа к таблице, создавать индексы, внешние ключи и представления.
Схема взаимодействия
-- Устанавливаем расширение и настраиваем доступ к серверу 1С create extension pg1c; update pg1c.server_1c set web_address='192.168.1.10',publication='InfoBase',user_1c='odata'; -- Создаем таблицу и загружаем данные из 1С select pg1c.create_table('Справочник.Контрагенты'); -- Выбираем данные из таблицы select * from Справочник.Контрагенты; -- Выбираем данные из табличной части 2 способами select * from Справочник.Контрагенты_КонтактнаяИнформация; select КонтактнаяИнформация from Справочник.Контрагенты; -- Обновляем и выбираем данные select * from Справочник.Контрагенты();
SQL-запросы в консоли запросов 1С
SQL-запросы в PostgreSQL, перенесены с минимальными изменениями
Платформа 1С:Предприятие поддерживает "из коробки" доступ к данным по открытому протоколу OData (автоматически формируемый REST интерфейс). Установка и настройка состоит из 3 этапов: публикация информационной базы в конфигураторе, установка расширения и настройка доступов. Данный функционал доступен во всех конфигурациях, включая бесплатную учебную версию. Протокол OData позволяет получать не только данные, но и их описание (метаданные) — список доступных таблиц, табличные части, столбцы с типами данных, первичные и внешние ключи. В отличие от прямого доступа к данным 1С, работа по протоколу OData не нарушает лицензионного соглашения. Использование клиентской лицензии на подключение оптимизировано.
Расширение PG1C обращается к платформе 1С через web-сервер по протоколу OData, на основе метаданных создает в PostgreSQL таблицы и хранимые процедуры для обновления данных. Созданные хранимые процедуры вызываются по расписанию или непосредственно в SQL-запросе. Поддерживается работа с несколькими серверами 1С в одной бд PostgreSQL: для каждого сервера можно настроить отдельные схемы (например, через префикс) или для каждой таблицы 1С явно указать схему и наименование в PostgreSQL. PostgreSQL имеет ограничение 63 байта на длину имен таблиц и столбцов. Длинные имена либо усекаются, либо сокращаются (настраивается). При усечении в SQL-запросе можно использовать и длинное имя (как в 1С).
Основные процедуры и функции
| pg1c.create_table([таблица_1С]) | — | создание в PostgreSQL таблицы аналогичной таблице 1С |
| [Таблица_1С]() | — | полностью обновить таблицу и вернуть ее |
| pg1c.refresh_data_all() | — | обновить данные всех созданных таблиц |
Более подробно на странице Документация
Структура таблиц
- Названия, порядок и тип данных полей максимально соответствуют между собой в 1С и PostgreSQLУниверсальность обновления данных
- обновление данных возможно по расписанию в двух режимах - полное и быстрое, в SQL-запросе - полное и по первичному ключу"Мягкое" обновление данных
- выполняется только update измененных строк, это позволяет избежать блокировок по первичному ключуОбновление метаданных
- обновление метаданных (структуры) выполняется без пересоздания таблицы, это позволяет настраивать доступ, создавать индексыДлинные наименования
- наименования усекаются до 63 байт (ограничение PostgreSQL), в SQL-запросах можно использовать полное имя таблицы - ошибки не будет. Альтернативно можно настроить автоматическое сокращение именПустые значения
- пустые значения (NULL) в результатах SQL-запросов максимально соответствуют в 1С и PostgreSQL (например, дата 01.01.0001)Составной тип данных 1С
- поддерживается составной тип данных 1С, для него в PostgreSQL создан тип pg1c.value_anyЗагрузка данных частями
- большие объемы данных загружаются частями во временную таблицу и только после полной загрузки выполняется обновление данных в одной транзакцииСоблюдение лицензионного соглашения
- использование штатного доступа по протоколу OData не нарушает лицензии 1С в отличие от прямого обращения к данным информационной базы (ответ 1С на вопрос 65 по лицензированию)
Масштабные проекты
— базовая версия PG1C создает критическую нагрузку на сервер при регулярном обновлении больших объемов данных. Проблема решается переходом на коммерческую модификацию либо использованием альтернативной архитектуры (HTTP-сервисы, 1С:Шина, механизм копий баз данных 1С:КОРП)Ограничения OData
— протокол OData не поддерживает получение прав пользователя на таблицу, транзакции, сортировку некоторых типов данных, получение только измененных данных (CDC), огрубляет типы данных. Соответственно, ограничения OData перенесены в PG1CСортировка в перечислениях
— сортировка значений (поле Порядок) перечислений не передается, поле Порядок заполняется автоматически, но его можно отредактировать в PostgreSQLРадикальные изменения таблицы
— при радикальных изменениях объекта конфигурации 1С (например, переназначение первичного ключа на другой реквизит) возможно некорректное изменение структуры таблицы в PostgreSQL, рекомендуется пересоздание (pg1c.drop_table и pg1c.create_table)Пересоздание представления
— при изменении метаданных табличной части (например, удаление реквизита) соответствующее представление удаляется и создается снова (PostgreSQL поддерживает только добавление столбцов в представление), рекомендуется создать хранимую функцию-обертку с динамическим запросом
Для высоконагруженных систем разработана коммерческая модификация расширения, в которой быстрое обновление данных в Postgres (процедура
pg1c.refresh_data_all(fast=>true)) происходит через захват изменений данных в 1С (Change Data Capture).
Протокол OData, который использовается в базовой весрии, не позволяет получать только изменения.
Механизм CDC можно применять выборочно — например, только для важных объектов конфигурации (таблиц 1С).
Плагин входит в состав PGSuite Highload Pack
Преимущества
- Снижение нагрузки — радикальное снижение времени быстрого обновления и нагрузки на сервер, т.к. не требуется полностью вычитывать объект конфигурации (таблицу 1С) во временную таблицу для последующего сравнения
- Частота обновления — быстрое обновление можно выполнять значительно чаще, т.к. общий объем обновленных данных не меняется (при более частых вызовах в одном обновлении выполняется меньше работы)
- Расширение 1С — в 1С:Предприятие модификация устанавливается как расширение, при этом конфигурация 1С не меняется, не снимает ее с поддержки и может быть обновлена
Иными словами, БД 1С и PostgreSQL можно сделать почти синхронными (1-2 минуты).
Архитектура и реализация
В 1С:Предприятие устанавливается расширение состоящее из Плана обмена и HTTP-сервиса с общим названием PG1C, в состав Плана обмена добавляются необходимые таблицы, HTTP-сервис публикуется.
Если при выполнении процедур pg1c.refresh_metadata или pg1c.refresh_all через HTTP-сервис определяется, что объект конфигурации (таблица 1С) добавлена в План обмена, то создается отдельная хранимая процедура для быстрого обновления одной записи. Поцедура
pg1c.refresh_data_all с параметром fast=>true работает принципиально иначе:
получает через HTTP-сервис изменения, вызывает для них процедуры быстрого обновления,
отправляет подтвердение в План обмена о успешном обновлении данных.
Обзорное видео размещено на RUTUBE