Имя: Пароль:
1C
1С v8
Как подружить 1С и PostgreSQL по типу данных uuid
,
0 dimqa
 
02.03.16
12:19
Здравствуйте. Мне потребовалось в 1с добавить внешний источник из PostgreSQL но в таблицах используется тип uuid, который в 1с я не могу ни прочитать ни записать. Если в 1с я указывают тип "Строка", то в форме списка он мне показывает значения как 53 67 A7 8 и зайти элементы не дает с ошибкой типа:

Ошибка преобразования данных XDTO:
НачалоСвойства: val    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
Значение: 53 67 A7 8    Тип: {http://v8.1c.ru/8.1/data/core}UUID
по причине:
Ошибка отображения типов:
Отображение лексического значения '53 67 A7 8' в значение типа 'УникальныйИдентификатор'

Если в 1с я указываю тип УникальныйИдентификатор, то в списке пусто, но новый элемент даст создать (выдаёт ошибку но в базе появляется)

Я подозреваю что он пытается преобразовать значение в ::bytea , хотя на самом деле надо ::uuid

Как быть? поиск ничего толком не дал
1 Necessitudo
 
02.03.16
12:20
(0) Используй ADO и в запросе используй какой-нить местный convert или cast.
2 dimqa
 
02.03.16
12:24
Смысл как раз во внешнем источнике, так как по таблицам нужны сложные отчеты и т.д., а не так, чтобы на каждую таблицу свою обработку рисовать.. хотя может до этого и дойдёт если не найдётся решение
3 Necessitudo
 
02.03.16
12:26
(2) Пускай тогда тебе вьювку нарисуют)
4 dimqa
 
02.03.16
12:40
Может и выход из положения но пока во вьюхе cast(... as varchar(36)) не даёт сделать... Хотя в обычном селекте нормально выбирает и показывает тип
5 dimqa
 
02.03.16
13:12
С помощью views у меня получилось, но план показывает что не используются индексы, что не есть хорошо((
6 НЕА123
 
02.03.16
13:52
(0)
если я правильно понял вопрос,
может 1С тип ДвоичныеДанные?
7 НЕА123
 
02.03.16
13:54
(6)+
или Число 38. как-то так мне помогло.
8 dimqa
 
02.03.16
13:55
В общем проблема решена следующими костылями:

Создание view

CREATE OR REPLACE VIEW public.wusers AS
SELECT manager_wusers.id::character varying(36) AS id,
    manager_wusers.login,
    manager_wusers.password,
    manager_wusers.full_name
   FROM main_wusers;

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

CREATE RULE _INSERT AS
    ON INSERT TO wusers DO INSTEAD  INSERT INTO main_wusers (id, login, password, full_name)
  VALUES (new.id::uuid, new.login, new.password, new.full_name)
  RETURNING main_wusers.id::character varying(36) AS id,
    manager_wusers.login,
    manager_wusers.password,
    manager_wusers.full_name;


Это самая простая таблица которую нужно было внедрить, а их еще штук 30 с немалым количеством полей, так что теперь работы у меня выше крыши)))

PS: На этой таблице почему-то не работают индексы. Может на нормальных таблицах больших объёмах всё будет норм, ну или добавлять индексы к вьюхам как-то вручную
PSS: Главное не забывать страдать.
9 dimqa
 
02.03.16
13:55
Жесть конечно как добавилось, извините если что)
10 rsv
 
02.03.16
13:57
(5) Есть еще вроде индексированные вьюхи.
11 rsv
 
02.03.16
13:59
+(10) Т.е. копнуть поглубже постгри   и сделать на физику витрины в виде вьюх , табличных функций или чего там еще .
12 dimqa
 
02.03.16
14:00
Ну я в принципе этот вариант и описал, осталось решить проблему с индексами, не используя материализованных вьюх, а как всё работает. Думаю первое время потерпят тормоза если что
13 bolero
 
02.03.16
20:41
(0) для обратной задачи (прочитать uuid, сохраненные 1с как bytea) у меня есть вот такой костыль

может, тебе сделать в обратную сторону, но на стороне 1с?

кмк, раз недоработка на стороне 1с - то и костыль туда вставлять, а не в нормально работающую систему. мало ли, когда-нибудь эту особенность починят, и тогда останется один костыль убрать, а не кучу вьюх



CREATE OR REPLACE FUNCTION bytea2guid (bytea) RETURNS UUID AS
$$
DECLARE
  bin ALIAS FOR $1;
  hex TEXT;
  guid UUID;
BEGIN
  SELECT SUBSTRING(bin::text, 3) INTO hex;
  guid := SUBSTRING(hex, 25, 8) || '-' ||
          SUBSTRING(hex, 21, 4) || '-' ||
          SUBSTRING(hex, 17, 4) || '-' ||
          SUBSTRING(hex, 1, 4) || '-' ||
          SUBSTRING(hex, 5, 12);
  RETURN guid;
END;

$$
LANGUAGE plpgsql;
AdBlock убивает бесплатный контент. 1Сергей