Принцип использования


Перед использованием необходимо выполнить публикацию информационной базы 1С, разрешить доступ по протоколу OData и установить расширение pg1c, подробности в разделе Загрузка

1. Создание таблиц
С помощью функций create_table и create_table_all в базе данных PostgreSQL создаются таблицы, идентичные таблицам 1С (объектам метаданных).

2. Обновление данных и метаданных
Рекомендуется настроить автоматическое обновление данных по расписанию, используя хранимые процедуры refresh_data_all и refresh_all. При настройке расписания не требуется обеспечивать синхронизацию, т.к. при попытке одновременного выполнения указанных функция для одного сервера 1С возникнет исключение. Для мониторинга обновления можно использовать информационную таблицу table.
Альтернативно, можно получать актуальные данные непосредствнно в запросе с помощью функций [Таблица]() и [Таблица](Ссылка).

3. Внешние ключи и представления
При использовании таблиц 1С (особенно справочников, констант и перечислений) как части общей схемы данных в PostgreSQL, рекомендуется создать внешние ключи на таблицы. Внешние ключи должны быть отложенными (deferred, т.е. проверяться при выполнении commit), т.к. в некоторых случаях при обновлении метаданных (структуры таблиц) возможно полное обновление данных. При обновлении метаданных проводится модификация структуры таблицы SQL-командами alter table без пересоздания, это позволяет на основе таблиц 1С создавать другие объекты бд: представления, в т.ч. материализованные, партиции, унаследованные таблицы.

4. Доступ пользователей
Пользователям выдаются права на чтение таблиц и выполнение хранимых процедур получения данных.

5. Целевое использование
см. примеры SQL-запросы, Доступ и Представления и функции.

6. Оптимизация
При длительном выполнении SQL-запросов, использующих таблицы 1С, на необходимые поля требуется создать неуникальные индексы.


Примеры

Создание таблиц различными способами
-- Получаем список доступных таблиц 1С
select * from pg1c.metadata_tables();

-- Создаем таблицу
select pg1c.create_table('Справочник.Контрагенты');

-- Создаем таблицу с другими схемой и названием (public.Goods) в PostgreSQL
select pg1c.create_table('Справочник.Товары', schema=>'public', table_name_pg=>'Goods');

-- Создаем все таблицы
call pg1c.create_table_all();

-- Получаем список всех созданных таблиц
select * from pg1c.table;

Варианты расписаний обновления данных и метаданных для ОС Linux
postgres@debian:~$ crontab -l
# Вариант 1
#   ночью полное обновление, включая метаданные
#   в рабочее время обновление данных: каждый час - полное, каждые 5 минут - быстрое
#   рекомендуется при использовании всех типов данных (справочники,документы и т.д)
00      03    * * * psql -d mydb -c "call pg1c.refresh_all()"
00      08-20 * * * psql -d mydb -c "call pg1c.refresh_data_all()"
05-55/5 08-20 * * * psql -d mydb -c "call pg1c.refresh_data_all(fast=>true)"

# Вариант 2
#   с 00:00 до 01:00 полное обновление данных каждые 10 минут
#   в остальное время быстрое обновление данных каждую минуту
#   обновление метаданных выполняется вручную после обновлений 1С
#   рекомендуется при высокой актуальности справочников и констант
*/10 00    * * * psql -d mydb -c "call pg1c.refresh_data_all()"
*    01-23 * * * psql -d mydb -c "call pg1c.refresh_data_all(fast=>true)"

# Вариант 3
#   в 00:00 создание новых доступных таблиц и полное обновление, включая метаданные
#   в остальное время полное обновление данных каждый час
#   рекомендуется для аналитических баз данных
00 00    * * * psql -d mydb -с "call pg1c.create_table_all(commit_tables=>1)" -c "call pg1c.refresh_all()"
00 01-23 * * * psql -d mydb -c "call pg1c.refresh_data_all()"

SQL-запросы по работе с данными
-- Выбираем данные из таблицы,
-- обновление данных выполняется отдельно по расписанию 
select * from Справочник.Контрагенты;

-- Выбираем данные из табличной части 2 способами:
-- detail-представление
select * from Справочник.Контрагенты_КонтактнаяИнформация;
-- поле типа массив master-таблицы
select КонтактнаяИнформация from Справочник.Контрагенты;

-- Обновляем и выбираем данные непосредственно в запросе
select * from Справочник.Контрагенты();

-- Обновляем только нужные данные и выбираем их 2 способами:
-- соединение
select * from myorders m
  cross join Справочник.Контрагенты(m.partner_id);
-- вызов функции
select *,(Справочник.Товары(m.ТоварСсылка)).Наименование from myorders m;

Создание внешних ключей на таблицы, рекомендуется делать отложенными (deferred)
-- Создание ключа в момент создания таблицы
create table myorders(
  id serial primary key, 
  partner_id uuid references Справочник.Контрагенты deferrable initially deferred
);

-- Создание ключа для существующей таблицы 2 способами:
-- сокращенное, имя будет сформировано автоматически 
alter table myorders add foreign key (partner_id)
  references Справочник.Контрагенты deferrable initially deferred;
-- полное с указанием имени и поля первичного ключа
alter table myorders add constraint myorders_partner_fk foreign key (partner_id)
  references Справочник.Контрагенты(Ссылка) deferrable initially deferred;

Выдача привилегий на таблицы
-- Выдача права чтения таблицы пользователю
grant select on Справочник.Контрагенты to user_1;

-- Выдача права обновления таблицы роли
grant execute on function Справочник.Товары(),Справочник.Товары(uuid) to role_analysts;

-- Выдача разработчику права создания внешнего ключа на таблицу
grant references on table Справочник.Товары to developer_1;

-- ! Выдача прав на табличную часть (представление) не рекомендуется,
-- т.к. при обновлении метаданных из-за особенностей PostgreSQL 
-- может возникнуть исключение
-- Рекомедуется создать функцию, возвращающую запрос, и выдать права на нее
grant select on Справочник.Контрагенты_КонтактнаяИнформация to user_1;

Представления и функции с использованием таблиц
-- ! Создание представлений с непосредственным использовнием таблиц не рекомендуется,
-- т.к. при обновлении метаданных из-за особенностей PostgreSQL может возникнуть исключение
-- Рекомендуется создавать функции-оберки и использовать их в представлениях, см. ниже
create or replace view myview1 as 
  select * from Справочник.Товары where not ПометкаУдаления; 
alter table Справочник.Товары ... ; -- ! Возможно исключение при использовании myview1

-- Функция на языке SQL, выдача прав пользователю
create or replace function myquery1()
  returns setof Справочник.Товары language sql as
$$
  select * from Справочник.Товары where not ПометкаУдаления;
$$;
grant execute on function myquery1 to user_1; 

-- Функция на языке plpgsql, которая: обновляет таблицу, 
-- создает на ее основе временную таблицу, возвращает SQL-запрос  
-- Определение возвращаемых полей необходимо для возможности
-- использования в представлениях      
create or replace function myquery2()
  returns table(Ссылка uuid,ПометкаУдаления boolean) language plpgsql as
$$
begin
  perform Справочник.Товары();
  create temp table temp_myquery2 on commit drop as
    select * from Справочник.Товары limit 10;
  return query select Ссылка,ПометкаУдаления from temp_myquery2;
end 
$$;

-- Функция с параметром и динамическим SQL-запросом
create or replace function myquery3(lim int)
  returns table(Ссылка uuid,ПометкаУдаления boolean) language plpgsql as
$$
begin
  return query  
    execute $SQL$
       select Ссылка,ПометкаУдаления from Справочник.Товары limit $1
    $SQL$
    using lim;
end 
$$;

-- Создание обычного и материализованного представлений на основе функции
-- Обновление метаданных не приведет к исключению, т.к. нет прямой связи с таблицей
create or replace view myview2 as select * from myquery2(); 
create materialized view myview3 as select * from myquery3(20);
refresh materialized view myview3;
grant select on myview2,myview3 to user_1;


Работа с данными

pg1c.create_table(table_1c, server_1c, schema, table_name_pg)


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

Параметры:
table_1cvarchar-Таблица 1С
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)
schemaname-Схема создаваемой таблицы в PostgreSQL (необязательный, по умолчанию тип объекта конфигурации 1С)
table_name_pgname-Имя создаваемой таблицы в PostgreSQL (необязательный, по умолчанию имя объекта конфигурации 1С)

Примеры использования:
-- Создаем таблицу
select pg1c.create_table('Справочник.Контрагенты');

-- Создаем таблицу с другими схемой и названием (public.Goods) в PostgreSQL
select pg1c.create_table('Справочник.Товары', schema=>'public', table_name_pg=>'Goods');

-- Создаем таблицу без загрузки данных для сервера УТ
select pg1c.create_table_only('Справочник.Контрагенты', 'УТ');

pg1c.create_table_all(server_1c, commit_tables)


Процедура создает все таблицы, доступные по протоколу OData (результат функции pg1c.metadata_tables).
Ранее созданные таблицы пропускаются. При успешном выполнении в любом случае фиксируется транзакция (commit), необходимо для снятия блокировки с сервера

Параметры:
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)
commit_tablesint-Количество таблиц, создаваемых в одной транзакции. Значение null отключает промежуточное фиксирование транзакций (необязательный, по умолчанию 100)

Примеры использования:
-- Создаем все таблицы
call pg1c.create_table_all();

-- Создаем все таблицы для сервера УТ без промежуточного фиксирования транзакций
call pg1c.create_table_only('УТ', null);

-- Получаем список всех созданных таблиц
select * from pg1c.table;

[Таблица]()


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

Примеры использования:
-- Обновляем и выбираем все данные
select * from Справочник.Контрагенты();

-- Обновляем и используем данные на процедурном языке PL/pgSQL
do $$ begin
  perform Справочник.Контрагенты();
  -- Далее используем актуальные данные
  -- select * from Справочник.Контрагенты,Справочник.Контрагенты_КонтактнаяИнформация;
end $$;

[Таблица]([primary key])


Функция обновляет данные по первичному ключу (обычно поле Ссылка) в одноименной таблице PostgreSQL из соответствующей таблицы 1С и возвращает их

Параметр:
[primary key] -Значения первичного ключа

Примеры использования:
-- Обновляем и выбираем по указанной Ссылке
select * from Справочник.Контрагенты('bbb41b6a-768d-11f0-ae5b-bcaec5b7b36a');

-- Обновляем и получаем данные контрагента для каждой строки заказа
select *
  from order o
  cross join Справочник.Контрагенты(o.client_id) 

-- Обновляем и используем данные на процедурном языке PL/pgSQL
do $$ declare 
  товар Справочник.Номенклатура;
begin
  товар := Справочник.Номенклатура('df7d0771-7690-11f0-ae5b-bcaec5b7b36a');
  -- Далее используем актуальные данные из переменной товар
end $$;

pg1c.refresh_data(table_1c, server_1c)


Процедура обновляет данные таблицы

Параметры:
table_1cvarchar-Таблица 1С
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)

Примеры использования:
-- Обнвляем данные таблицы
call pg1c.refresh_data('Справочник.Товары');

-- Обнвляем данные таблицы для сервера УТ
select pg1c.create_table_only('Справочник.Контрагенты', 'УТ');

pg1c.refresh_data_all(server_1c, fast, commit_tables)


Процедура обновляет данные всех таблиц.
При быстром обновлении (параметр fast) обновляются таблицы с небольшим количеством строк (условие row_count<fetch_size)

Параметры:
server_1cvarchar-Сервер 1С (необязательный, по умолчанию null, будут обновлены данные для всех серверов)
fastboolean-Быстрое обновление (необязательный, по умолчанию Ложь)
commit_tablesint-Количество таблиц, обновляемых в одной транзакции. Значение null отключает промежуточное фиксирование транзакций (необязательный, по умолчанию 1)

Примеры использования:
-- Обнвляем данные таблиц всех серверов
call pg1c.refresh_data_all();

-- Обнвляем данные небольших таблиц для сервера УТ в одной транзакции
call pg1c.refresh_data_all('УТ', fast=>true, commit_tables=>null);

pg1c.refresh_metadata(table_1c, server_1c, refresh_data)


Процедура обновляет метаданные (структуру таблицы).
После внесения некоторых изменений (например, добавлен новый столбец/реквизит) автоматически выполняется обновление данных. Для обновления данных в любом случае необходимо установить параметр refresh_data.
Если требуется обновить только метаданные, нужно вызывать функцию pg1c.refresh_metadata_only с аналогичными параметрами и после вызова inout-параметру refresh_data будет присвоена необходимость обновления данных.

В некоторых случаях на время работы процедуры может потребоваться отключение внешних ключей, во избежание этого рекомендуется создавать внешние ключими отложенными (deferrad)

Параметры:
table_1cvarchar-Таблица 1С
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)
refresh_databoolean-Принудительное обновление данных (необязательный, по умолчанию false)

Примеры использования:
-- Обновляем метаданные (структуру таблицы) и данные при необходимости
call pg1c.refresh_metadata('Справочник.Контрагенты');

-- Обновляем метаданные и данные в любом случае
call pg1c.refresh_metadata('Справочник.Товары', refresh_data=>true);

-- Обновляем только метаданные, в переменную v_refresh_data получаем необходимость
-- обновления данных, после выполнения таблица может быть пустой 
do $$ declare 
  v_refresh_data boolean;
begin
  call pg1c.refresh_metadata_only('Справочник.Товары', refresh_data=>v_refresh_data);
end $$;

pg1c.refresh_all(server_1c, commit_tables)


Процедура обновляет метаданные и данные всех таблиц

Параметры:
server_1cvarchar-Сервер 1С (необязательный, по умолчанию null, будут обновлены данные для всех серверов)
commit_tablesint-Количество таблиц, обновляемых в одной транзакции. Значение null отключает промежуточное фиксирование транзакций (необязательный, по умолчанию 1)

Примеры использования:
-- Обнвляем метаданные и данные таблиц всех серверов
call pg1c.refresh_data_all();

-- Обнвляем метаданные и данные таблиц для сервера УТ в одной транзакции
select pg1c.refresh_data_all('УТ', commit_tables=>null);

pg1c.drop_table(table_1c, server_1c)


Процедура удаляет в PostgreSQL таблицу 1С, действие обратное к pg1c.create_table.
Удаление не каскадное (аналогично drop table restrict), предварительно требуется удалить внешние ключи и использование в представлениях. При отсутствии таблицы будет выдано информационное сообщение, исключения не возникнет (аналогично drop table if not exists)

Параметры:
table_1cvarchar-Таблица 1С
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)

Примеры использования:
-- Удаляем таблицу
call pg1c.drop_table('Справочник.Контрагенты');

-- Удаляем таблицу для сервера УТ
select pg1c.create_table_only('Справочник.Контрагенты', 'УТ');

pg1c.drop_table_all(server_1c, commit_tables)


Процедура удаляет в PostgreSQL все таблицы 1С для указанного сервера.
При успешном выполнении в любом случае фиксируется транзакция (commit), необходимо для снятия блокировки с сервера

Параметры:
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)
commit_tablesint-Количество таблиц, удаляемых в одной транзакции. Значение null отключает промежуточное фиксирование транзакций (необязательный, по умолчанию 100)

Примеры использования:
-- Удаляем все таблицы для сервера по умолчанию (DEFAULT)
call pg1c.drop_table_all();

-- Удаляем все таблицы для сервера УТ без промежуточного фиксирования транзакций
call pg1c.drop_table_all('УТ', null);

Таблица pg1с.server_1c


Таблица содержит список серверов(публикаций) 1С и информацию для подключения к ним. Для настройки списка серверов необходимо редактировать данную таблицы средствами SQL.
Полный доступ к таблице имеет только суперпользователь (postgres), разработчики имеют право читать основные поля. Функции, используемые в SQL-выражениях, выполняются с правами создателя (security definer), поэтому во избежание SQL-инъекций они должны быть недоступны для модификации

Столбцы:
idvarchar-Идентификатор
web_addressinet-IP-адрес WEB-сервера 1С
web_portint-Порт WEB-сервера 1С (по умолчанию 80)
publicationvarchar-Публикация (обычно информационной базы)
user_1cvarchar-Пользователь 1С
password_1cvarchar-Пароль пользователя 1С (не рекомендуется использовать, см. Безопасность)
auth_expressionboolean-SQL-выражение для формирования строки авторизации в формате HTTP
schema_expressionvarchar-SQL-выражение для формирования схемы таблицы PostgreSQL, переменная $1 содержит тип метаданных 1С
owner_expressionvarchar-SQL-выражение для формирования владельца таблицы PostgreSQL (по умолчанию session_user)
names_pg_shortboolean-Сокращать имена таблиц,столбцов PostgreSQL (по умолчанию false)
memory_buffer_mbint-Размер буффера памяти при получении данных по протоколу OData, Мб
check_updatesboolean-Проверять обновления PG1C при получении метаданных, выполняется 1 раз в неделю (по умолчанию true)
check_updates_timestamptimestamptz-Дата-время последней проверки обновления PG1C

Примеры использования:
-- Устанавливаем расширение и настраиваем параметры подключения сервера DEFAULT
create extension pg1c;
update pg1c.server_1c set web_address='192.168.1.10',publication='Acc',user_1c='odata',password_1c='[пароль]';"

-- Получаем URL для проверки в WEB-браузере
select pg1c.http_url();

-- Получаем список серверов (при выполнении в SQL-менеджере можно редактировать)
select * form pg1c.server_1c;

-- Добавляем новый сервер УТ
insert into pg1c.server_1c(id, web_address, publication, user_1c)
  values ('УТ', '192.168.1.10', 'TM', 'Администратор (ФедоровБМ)');

-- Для сервера УТ добавляем префикс "УТ_" к схеме создаваемых таблиц 
update pg1c.server_1c set schema_expression=$$ 'УТ_'||$1 $$ where id='УТ';

Настройка и информация

Таблица pg1с.server_1c


Таблица содержит список серверов(публикаций) 1С и информацию для подключения к ним. Для настройки списка серверов необходимо редактировать данную таблицы средствами SQL.
Полный доступ к таблице имеет только суперпользователь (postgres), разработчики имеют право читать основные поля.

! Функции, используемые в SQL-выражениях, выполняются с правами создателя (security definer), поэтому во избежание SQL-инъекций они должны быть доступны для модификации только DBA

Столбцы:
idvarchar-Идентификатор
web_addressinet-IP-адрес WEB-сервера 1С
web_portint-Порт WEB-сервера 1С (по умолчанию 80)
publicationvarchar-Публикация (обычно информационной базы)
user_1cvarchar-Пользователь 1С
password_1cvarchar-Пароль пользователя 1С (не рекомендуется использовать, см. Безопасность)
auth_expressionboolean-SQL-выражение для формирования строки авторизации в формате HTTP
schema_expressionvarchar-SQL-выражение для формирования схемы таблицы PostgreSQL, переменная $1 содержит тип метаданных 1С
owner_expressionvarchar-SQL-выражение для формирования владельца таблицы PostgreSQL (по умолчанию session_user)
names_pg_shortboolean-Сокращать имена таблиц,столбцов PostgreSQL (по умолчанию false)
memory_buffer_mbint-Размер буффера памяти при получении данных по протоколу OData, Мб
check_updatesboolean-Проверять обновления PG1C при получении метаданных, выполняется 1 раз в неделю (по умолчанию true)
check_updates_timestamptimestamptz-Дата-время последней проверки обновления PG1C

Примеры использования:
-- Устанавливаем расширение и настраиваем параметры подключения сервера DEFAULT
create extension pg1c;
update pg1c.server_1c set web_address='192.168.1.10',publication='Acc',user_1c='odata',password_1c='[пароль]';"

-- Получаем URL для проверки в WEB-браузере
select pg1c.http_url();

-- Получаем список серверов (при выполнении в SQL-менеджере можно редактировать)
select * form pg1c.server_1c;

-- Добавляем новый сервер УТ
insert into pg1c.server_1c(id, web_address, publication, user_1c)
  values ('УТ', '192.168.1.10', 'TM', 'Администратор (ФедоровБМ)');

-- Для сервера УТ добавляем префикс "УТ_" к схеме создаваемых таблиц 
update pg1c.server_1c set schema_expression=$$ 'УТ_'||$1 $$ where id='УТ';

Таблица pg1с.table


Таблица содержит список таблиц 1С, для которых созданы соответствующие таблицы в PostgreSQL.
Допускается только редактировние поля fetch_size. Поля refresh_metadata_timestamp и refresh_data_timestamp записываются при успешном выполнении процедур обновления (например, pg1с.refresh_all), независимо от того, были ли изменения в (мета)данных

Столбцы:
server_1cvarchar-Сервер 1С (ссылка на таблицу pg1с.server_1c)
name_1cvarchar-Наименование таблицы 1С
metadata_typevarchar-Тип метаданных
schemaname-Схема PostgreSQL
name_pgname-Наименование таблицы в PostgreSQL
fetch_sizeint-Количество строк, получаемых за один HTTP-запрос
row_countint-Количество строк в таблице на момент последнего полного обновления
refresh_metadata_timestamptimestamptz-Момент последнего обновления метаданных (структуры таблицы)
refresh_data_timestamptimestamptz-Момент последнего обновления данных
refresh_data_durationinterval-Продолжительность последнего обновления данных

Примеры использования:
-- Получаем список всех таблиц 1С
select * from pg1c.table;

-- Получаем список всех таблиц 1С для сервера УТ 
select * from pg1c.table where server_1c='УТ' order by schema,name_pg;

-- Для указанной таблицы устанавливаем кол-во строк, получаемых за один HTTP-запрос
update pg1c.table set fetch_size=5000 where name_1c='Справочник.Контрагенты';

-- Проверяем актуальность данных и метаданных, получая самые ранние моменты обновлния.
-- Рекомендуется использовать для мониторинга процесса обновления по расписанию
select min(refresh_data_timestamp),min(refresh_metadata_timestamp) from pg1c.table;

-- Получаем продолжительность обновления данных всех таблиц
select sum(refresh_data_duration) from pg1c.table;

pg1c.metadata_tables(server_1c)


Функция для указанного сервера возвращает список таблиц 1С, доступных по протоколу OData

Параметр:
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)

Примеры использования:
-- Получаем список доступных таблиц 1С
select * from pg1c.metadata_tables();

-- Получаем список доступных таблиц 1С сервера УТ
select table_1c from pg1c.metadata_tables('УТ') order by 1;

-- Получаем список доступных таблиц 1С, которых нет в PostgreSQL
select * 
  from pg1c.metadata_tables()
  where table_1c not in (select name_1c from pg1c.table);

pg1c.http_url(urn, server_1c, mask_password)


Функция возвращает URL для получения данных и метаданных по протоколу HTTP, полученное значение можно использовать в адресной строке WEB-браузера.
Выполняется с правами вызывающего (security invoker), поэтому должна быть доступна и использоваться только DBA

Параметры:
urnvarchar-Название ресурса OData (необязательный, по умолчанию $metadata - получение метаданных)
server_1cvarchar-Сервер 1С (необязательный, по умолчанию DEFAULT)
mask_passwordboolean-Маскировать пароль (необязательный, по умолчанию false)

Примеры использования:
-- Получаем URL для получения метаданных
select pg1c.http_url();

-- Получаем URL для данных таблицы Справочник.Контрагенты сервера УТ
select pg1c.http_url('Catalog_Контрагенты', 'УТ');

-- Получаем URL для данных конкретной строки (определяется полем Ссылка типа UUID) в формате JSON 
select pg1c.http_url('Catalog_Товары')||'?$format=json&$filter=Ref_Key eq guid''bbb41b67-768d-11f0-ae5b-bcaec5b7b36a''';

Тип value_any


Тип данных для хранения значений составного типа 1С.
Для нормализации значений можно использовать функцию pg1c.value_any с аналогичными параметрами, для значений типа Ссылка указывается имя таблицы 1С

Столбцы:
valuetext-Значение
typevarchar-Тип

Примеры использования:
-- Получение значений составного поля различными способами
select СоставноеПоле,СоставноеПоле::text,(СоставноеПоле).Value,(СоставноеПоле).Type from Справочник.Товары;

-- Получение только ссылок на таблицу Справочник.Контрагенты
select (СоставноеПоле).value::uuid Ссылка from Справочник.Товары where (СоставноеПоле).Type='Справочник.Контрагенты';

-- Создаем значения преобразованием 
select 
  (123.45,'numeric')::pg1c.type_any,
  ('bbb41b6a-768d-11f0-ae5b-bcaec5b7b36a'::uuid,'Справочник.Контрагенты')::pg1c.type_any;

-- Создаем значения различных типов с помошью функции pg1c.value_any
select
  pg1c.value_any('123.45','Edm.Double'),                                                      -- Число
  pg1c.value_any('bbb41b6a-768d-11f0-ae5b-bcaec5b7b36a','StandardODATA.Catalog_Контрагенты'), -- (Ссылка,Справочник.Контрагенты)
  pg1c.value_any('Зеленый','StandardODATA.Цвет'),                                             -- Перечисление
  pg1c.value_any('','StandardODATA.Undefined')                                                -- Непределенное значение, (null,'null') 

pg1c.version


Функция возвращает версию расширения

Примеры использования:
-- Получаем версию расширения
select pg1c.version();

-- Получаем версию и другую информацию о расширении из системного предстваления
select extversion,* from pg_extension where extname='pg1c';

-- Получаем информацию о проверке обновлений (новой версии)
-- При включенной настройке проверка осуществляется при получении метаданных
select check_updates,check_updates_timestamp from pg1c.server_1c;

Журналы

pg1c.log_metadata_sql


Все SQL-выражения, изменяющие метаданные, записываются в журнал (лог-таблицу) pg1c.log_metadata_sql.
Для записи в журнал исключений необходимо установить SQL-скрипт pg1c_log_exception.sql (подробности в разделе Загрузка).
Права на изменение таблицы должен иметь только администратор базы данных (DBA)

Примеры использования:
-- Получаем изменения для таблицы 'Справочник.Контрагенты
select * from pg1c.log_metadata_sql where table_1c='Справочник.Контрагенты' order by 1;

-- Получаем изменения метаданных за последний час в обратном порядке
select * from pg1c.log_metadata_sql where timestamp>now()-interval '1 hour' order by 1 desc;

-- Удаляем из журнала все записи старше одного месяца
delete from pg1c.log_metadata_sql where timestamp<now()::date-interval '1 month';

-- Получаем ошибки (при настроенной записи исключений)
select * from pg1c.log_metadata_sql where exception is not null;

pg1c.log_http_request


HTTP-запросы по протоколу OData записываются в журнал (лог-таблицу) pg1c.log_http_request.
Для записи в журнал исключений необходимо установить SQL-скрипт pg1c_log_exception.sql (подробности в разделе Загрузка).
Права на изменение таблицы должен иметь только администратор базы данных (DBA)

Примеры использования:
-- Получаем запросов к серверу УТ
select * from pg1c.log_http_request where server_1c='УТ' order by 1;

-- Получаем ТОП-10 самый длительных запросов
select * from pg1c.log_http_request order by duration desc limit 10;

-- Удаляем из журнала все записи старше одной недели
delete from pg1c.log_http_request where timestamp<now()::date-interval '1 week';

-- Получаем ошибки (при настроенной записи исключений)
select * from pg1c.log_http_request where exception is not null;

Безопасность

Архитектура безопасновти: - метаданные находятся в схеме pg1c в фиксированных таблицах и меняются хранимыми процедурами с правами создателя-суперпользователя, права на данные процедуры выдаются разработчикам и аналитикам - при создании таблицы и отсутствии нужной схемы (например, Справочник), создается новая схема, ее владельцем назначается текущий пользовтель - таблицы с данными 1С создаются в отдельных схемах, первоначально владельцем таблицы назначается владелец схемы (обычно разработчик или аналитик) - владельцы таблицы (разработчики) выдают права на использование своих объектов конечным пользователям

Перед созданием таблиц рекомендуется предварительно создавать нужные схемы. По умолчанию это типы объектов конфигурации: Справочник, Константа, Перечисление, Документ и т.д. Владелец схем и таблиц назначается только при их первоначальном создании. В дальнейшем владельца можно переназначить.

Для изменения структуры таблицы (например, через процедуру refresh_metadata) пользователь должен быть её владельцем явно или через назначенную роль.

Функции обновления [Таблица]() и [Таблица](Ссылка) создаются с правами создателя в схеме таблицы, их владельцем назначается владелец таблицы. Для выполнения HTTP-запроса указанные функции обращаются к функции pg1c, которая выполняется с правами суперпользователя. Иными словами, владелец таблицы не может выполнять произвольные HTTP-запросы.

Редактирование таблиц pg1c.server_1c и pg1c.table может выполнять только администратор базы данных (DBA), исключение составляют поля статистики .