Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Прямая запись данных в SQL-таблицы: УИД 1С в uniqueidentifier SQL 2 страниц V   1 2 >          
Vava Подменю пользователя
сообщение 05.05.14, 21:46
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Необходимо записывать данные во внешние таблицы MS SQL 2005. В таблице тип данных поля, в которое необходимо записывать данные - уникальный идентификатор. В 7-ке я формирую идентификатор функцией ПолучимГУИДSQL(), в результате работы которой получаю строковое значение вида: "16700000-0001-0000-0000-000000000000"


    cmd=СоздатьОбъект("ADODB.Command");
    cmd.ActiveConnection=Соединение;
    cmd.CommandTimeOut=600;
    cmd.CommandType=1;
    cmd.Prepared = "True";
    cmd.NamedParameters = "True";
    cmd.Commandtext ="INSERT INTO tbl_Account (Account1CID)     VALUES (Convert(uniqueidentifier, ?))";
    
    cmd.Parameters.Append(cmd.CreateParameter("@Account1CID"    , 202,1,36));

    ТЗКонтрагенты.ВыбратьСтроки();

    Соединение.BeginTrans();
    пСтрока = ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID);
    Пока ТЗКонтрагенты.ПолучитьСтроку() = 1 Цикл
        cmd.Parameters("@Account1CID").Value     = ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID);
        cmd.Execute();
    КонецЦикла;


При выполнении кода возникает ошибка:
cmd.Execute();
{D:\WORK\EXTFORMS\SQL.ERT(291)}: Microsoft OLE DB Provider for SQL Server: Conversion failed when converting from a character string to uniqueidentifier.


Такая же возникает при попытке присвоить в лоб:
cmd.Parameters("@Account1CID").Value     =  "16700000-0001-0000-0000-000000000000";


Каким образом правильно записывать значения подобного типа. Может кто сталкивался с подобными задачами?
Спасибо

sava1 Подменю пользователя
сообщение 06.05.14, 6:55
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

типа так
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')

Vofka Подменю пользователя
сообщение 06.05.14, 8:01
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

cmd.Commandtext ="INSERT INTO tbl_Account (Account1CID) VALUES (CAST('"+СокрЛП(Гуид1С)+"' as UNIQUEIDENTIFIER))";

Vava Подменю пользователя
сообщение 06.05.14, 8:38
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

sava1, как я понял таким образом будет создано и записано в таблицу новое уникальное значение. Используя свой уникальный код потом можно определить какому элементу принадлежит запись. Потом нужно будет по этому значению находить эту строку и вносить изменения в данные. Контрагент записан со всеми своими данными и при изменении их в 1с нужно вносить изменения и в БД.

Vofka, попробовал так:

ГУИДКонтрагента = ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID);
cmd.Commandtext ="INSERT INTO tbl_Account (Account1CID)     VALUES (CAST('"+ГУИДКонтрагента+"' as UNIQUEIDENTIFIER))";


Получил:

cmd.Execute();
{D:\WORK\ИНТЕРСТАЛЬ\EXTFORMS\SQL.ERT(294)}: Microsoft OLE DB Provider for SQL Server: Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.


Может есть мысли какие?

Сообщение отредактировал Vofka - 06.05.14, 8:44

Vofka Подменю пользователя
сообщение 06.05.14, 8:47
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

А что находится в переменной ГУИДКонтрагента ?

Цитата(Vofka @ 06.05.14, 9:01) *
...СокрЛП(Гуид1С)...


Сообщение отредактировал Vofka - 06.05.14, 8:50

Vava Подменю пользователя
сообщение 06.05.14, 8:51
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Функция ПолучимГУИДSQL() возвращает строковое значение вида: "16700000-0001-0000-0000-000000000000"

Это строка. Пробелов там нет. Функция формирует из 12-ти значного числа УИДа элемента справочника

sava1 Подменю пользователя
сообщение 06.05.14, 8:58
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

может поможет ? [необходимо зарегистрироваться для просмотра ссылки]

Vava Подменю пользователя
сообщение 06.05.14, 9:24
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

sava1, попробовал. Такая же ошибка

sava1 Подменю пользователя
сообщение 06.05.14, 10:10
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

А зачем в таблице ГУИД? Как получаете ГУИДКонтрагента?

Vava Подменю пользователя
сообщение 06.05.14, 10:23
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

sava1, из этой таблицы БД другая программа забирает данные. УИД изначально получен с помощью функции:

Функция ПолучимГУИД77(Объект)
    Стр=ЗначениеВСтрокуВнутр(Объект);
    СЗ=СоздатьОбъект("СписокЗначений");
    СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2));  
    ГУИД=формат(СЗ.ПолучитьЗначение(4),"Ч(0)5")+Формат(сокрлп(СЗ.ПолучитьЗначение(СЗ.РазмерСписка())),"Ч(0)9");
    Возврат ГУИД;
КонецФункции    // ПолучимГУИД77


Полученное 12-тизначное число приводится к виду: "16700000-0001-0000-0000-000000000000". Первые 12 знаков значащие. Остальные забиваю нолями.

Vofka Подменю пользователя
сообщение 06.05.14, 10:36
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

А непосредственно на SQL-е такой запрос выполняется:
SQL
INSERT INTO tbl_Account (Account1CID) VALUES (CAST('16700000-0001-0000-0000-000000000000' as UNIQUEIDENTIFIER))

?

И, собственно, учитывая это:
Цитата(Vava @ 06.05.14, 11:23) *
Полученное 12-тизначное число приводится к виду: "16700000-0001-0000-0000-000000000000". Первые 12 знаков значащие. Остальные забиваю нолями.

почему не использовать на SQL-е тип данных "число" или "строка"?

Спасибо сказали: Vava,

Vava Подменю пользователя
сообщение 06.05.14, 10:46
Сообщение #12

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka, дело в том, что база уже есть и нужно писать в нее.
Попробую на SQL-е непосредственно. Пока нет возможности.

logist Подменю пользователя
сообщение 06.05.14, 11:26
Сообщение #13

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

А зачем изобретать УИД? Ведь ссылка 1C содержит в себе УИД под которым она и хранится в своей базе.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Спасибо сказали: Vava,

Vava Подменю пользователя
сообщение 06.05.14, 11:45
Сообщение #14

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

logist, а как извлекается такой УИД в 7-ке?

sava1 Подменю пользователя
сообщение 06.05.14, 12:55
Сообщение #15

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Цитата(logist @ 06.05.14, 12:26) *
А зачем изобретать УИД?

Как я понял - таблица уже есть и она внешняя и на нее уже что-то завязано - и не ясно вообще-то где получится велосипед.
Склоняюсь к проблеме с драйвером Адо.
ТС - проверьте запрос из #11

Спасибо сказали: Vava,

Vava Подменю пользователя
сообщение 06.05.14, 13:58
Сообщение #16

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Удалось записать. Всю цепочку действий не восстановлю. Думаю, что ключевым моментом было то, что в таблице есть поле обязательное для заполнения -уникальный идентификатор строки таблицы. Без его заполнения строка не записывалась. Буду разбираться дальше. Спасибо всем за участие!

А как быть, если элемент, УИД которого надо писать, не выбран?

sava1 Подменю пользователя
сообщение 06.05.14, 14:07
Сообщение #17

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Заполнить по дефолту, хотя ключевое поле не пропустит - если это ГУИД - прописать NewID()

Vava Подменю пользователя
сообщение 06.05.14, 14:15
Сообщение #18

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Наверное было бы правильно в таком случае писать Null, если это допускается.
Но как это предусмотреть в конструкции:
    cmd.Commandtext="INSERT INTO tbl_Account (ID, Account1CID, Owner1CID)     
    |VALUES (NEWID(),
    |CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID)+"' as UNIQUEIDENTIFIER),
    |CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Owner1CID)+"' as UNIQUEIDENTIFIER)
    |)";

если значение ТЗКонтрагенты.Owner1CID = 0?

Или не писать вообще ничего...

logist Подменю пользователя
сообщение 06.05.14, 14:20
Сообщение #19

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(Vava @ 06.05.14, 14:15) *
если значение ТЗКонтрагенты.Owner1CID = 0?

перед выходом из функции проверьте значение, если оно не подходящее то возвращайте NULL, иначе значение


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Vava Подменю пользователя
сообщение 06.05.14, 14:24
Сообщение #20

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Пока на ум пришло записывать в УИД "00000000-0000-0000-0000-000000000000", а потом , при необходимости обрабатывать такие значения.

logist, но тогда мы получим
SQL
CAST('Null' as UNIQUEIDENTIFIER)

И возникнет ошибка преобразования типа. Уже пробовал )

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 25.04.24, 9:07
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!