Имя: Пароль:
1C
 
Выгрузить УникальныйИдентификатор 1С в UUID PostgreSQL.
0 tatoshka0403
 
14.08.26
08:49
Всем доброго дня, подскажите пожалуйста как правильно выгружать УникальногоИдентификатора 1С в UUID PosgreSQL.
В SQL тип данных - UUID
В Поле внешнего источника данных - уникальный идентификатор, пробовал менять на строку но это тоже не работает.

Если тип данных "уникальный идентификатор", то ошибка вот такая:
Ошибка ODBC. SQLSTATE: 22P02
Номер ошибки: 1
Описание: ОШИБКА: неверный синтаксис для типа uuid: "\xB0F3627878424FC048B8BE10D058F90D";

Если тип данных "строка", то ошибка вот такая:
Описание: ОШИБКА: неверный синтаксис для типа json
DETAIL: Неожиданный конец входной строки.;

Подскажите как правильно делать такую выгрузку.
1 tatoshka0403
 
14.08.26
08:55
Забыл написать, запись происходит вот так:

НоваяЗаписьSQL = ВнешниеИсточникиДанных.PostgreSQL.Таблицы.Test.СоздатьОбъект();
НоваяЗаписьSQL.name = Товар.Наименование;  
НоваяЗаписьSQL.ID = Товар.УникальныйИдентификатор();
НоваяЗаписьSQL.Записать();
2 DrZombi
 
гуру
14.08.26
08:57
(0)

https://postgrespro.ru/docs/postgresql/current/datatype-uuid

Тип bytea в таблицах 1С на PostgreSQL содержит 16-байтовую бинарную строку. Это двоичное представление уникального идентификатора объекта (GUID / UUID).Внутри этих 16 байт закодирована вся информация, которая позволяет платформе 1С однозначно найти конкретный элемент (например, конкретный товар, документ или контрагента).
3 DrZombi
 
гуру
14.08.26
09:00
+(1) Странно вы пишите :)

ВнешнийИсточникДанныхТаблицаОбъект.<Имя внешнего источника>.<Имя таблицы внешнего источника данных> (ExternalDataSourceTableObject.<External source name>.<External data source table name>)
УстановитьСсылкуНового (SetNewObjectRef)
Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Параметры:
<Ссылка> (обязательный)
Тип: ВнешнийИсточникДанныхТаблицаСсылка.<Имя внешнего источника>.<Имя таблицы внешнего источника данных>.
Ссылка, которая будет назначена при записи нового объекта.
Описание:
Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
4 tatoshka0403
 
14.08.26
09:23
(3) Не понимаю. Мне нужно из 1С в SQL передать ИД уже созданного товара.

ГУИД = Товар.УникальныйИдентификатор();
ТекущаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
    
НоваяЗаписьSQL = ВнешниеИсточникиДанных.PostgreSQL.Таблицы.Test.СоздатьОбъект();
НоваяЗаписьSQL.УстановитьСсылкуНового(ТекущаяСсылка);
НоваяЗаписьSQL.name = Строка(Товар);
НоваяЗаписьSQL.Записать();
5 Кирпич
 
14.08.26
10:18
может запихнуть гуид 1с в буфер двоичных данных и этот буфер уже в PostgreSQL
6 tatoshka0403
 
14.08.26
10:24
(5) Ошибка ODBC. SQLSTATE: 22P02
Номер ошибки: 1
Описание: ОШИБКА: неверный синтаксис для типа uuid: "\x66613662386230332D393461372D313166312D616439612D373435363363376232333265";


Похоже надо искать решение на стороне SQL. Пробовал сгенерировать uuid средствами sql и передать его при записи.
ВнешниеИсточникиДанных.PostgreSQL.pg_catalog_gen_random_uuid();
ошибка аналогичная (0)
7 DrZombi
 
гуру
14.08.26
11:33
(6) Оно у 1С разное, т.е. у 1С оно в одном формате. У SQL в другом :)

Если так приспичило прямыми запросами всё делать

Набери у ИИ запрос: Как прямым запросом PostgreSQL записать ИД из 1С?

Он тебе разжуёт :)

Ссылка:

https://www.google.com/search?q=&rlz=1C1GCEU_ruRU892RU893&sourceid=chrome&ie=UTF-8&amc=1&udm=50&aep=42&cud=0&source=chrome.crn.rb&atvm=2
8 DrZombi
 
гуру
14.08.26
11:41
(6) Гугл - ГПТ-чат вам в подмогу :)

Он предложил два варианта вашего сюриализма.

Вариант 1. Если в PostgreSQL поле ID имеет тип UUIDВам нужно передать идентификатор строго в виде текстовой строки. Для этого оберните его в функцию Строка() и приведите к нижнему регистру:



НоваяЗаписьSQL = ВнешниеИсточникиДанных.PostgreSQL.Таблицы.Test.СоздатьОбъект();
НоваяЗаписьSQL.name = Товар.Наименование;  

// Преобразуем UUID в строку нижнего регистра
НоваяЗаписьSQL.ID = НРег(Строка(Товар.УникальныйИдентификатор()));

НоваяЗаписьSQL.Записать();




Вариант 2. Если в PostgreSQL поле ID имеет тип INTEGER / BIGINTУникальный идентификатор 1С (GUID) нельзя записать в числовое поле, так как он содержит буквы.Если вам нужен числовой код товара, используйте Товар.Код.Если код текстовый, его придется преобразовать в число (если там только цифры).



НоваяЗаписьSQL = ВнешниеИсточникиДанных.PostgreSQL.Таблицы.Test.СоздатьОбъект();
НоваяЗаписьSQL.name = Товар.Наименование;  

// Используем числовой код вместо GUID
НоваяЗаписьSQL.ID = Число(Товар.Код);

НоваяЗаписьSQL.Записать();

9 Ненавижу 1С
 
гуру
14.08.26
11:41
Какой тип указан у поля на строне 1С во внешнем источнике данных?
10 DrZombi
 
гуру
14.08.26
11:44
(4) Вот вы не понимаете.

А я не понимаю, зачем это всё вам?
Если по сути ИД, код, переданный из другой базы, в какую-то базу. И явно не от 1С. Можно просто использовать поле, для идентификации связки с другой базой.


И я не понимаю Гугла, когда он кодит код на 1С...
Почему оно чаще не работает, чем работает :)
(но в этом вы сами убедитесь)
11 tatoshka0403
 
14.08.26
11:55
(9) Пробовал УникальныйИдентификатор, Строку, ДвоичныеДанные.
12 DrZombi
 
гуру
14.08.26
12:01
(11) Да добавьте в другую базу просто текстовое поле.
И пишите ваш ИД из базы источника.

Вы же автор, вам будет виднее, как это "новое" поле "ИД" использовать.

А то, что вы пытаетесь писать ИД такой же, как в другой базе, работает только пока другая база одна :)

Когда появится вторая "Другая" база, либо другой дубль из базы, у вас начнутся дублироваться записи :)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан