Необходимо записывать данные во внешние таблицы 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.Parameters("@Account1CID").Value = "16700000-0001-0000-0000-000000000000";
типа так
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
cmd.Commandtext ="INSERT INTO tbl_Account (Account1CID) VALUES (CAST('"+СокрЛП(Гуид1С)+"' as UNIQUEIDENTIFIER))";
sava1, как я понял таким образом будет создано и записано в таблицу новое уникальное значение. Используя свой уникальный код потом можно определить какому элементу принадлежит запись. Потом нужно будет по этому значению находить эту строку и вносить изменения в данные. Контрагент записан со всеми своими данными и при изменении их в 1с нужно вносить изменения и в БД.
Vofka, попробовал так:
ГУИДКонтрагента = ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID);
cmd.Commandtext ="INSERT INTO tbl_Account (Account1CID) VALUES (CAST('"+ГУИДКонтрагента+"' as UNIQUEIDENTIFIER))";
А что находится в переменной ГУИДКонтрагента ?
...СокрЛП(Гуид1С)...
Функция ПолучимГУИДSQL() возвращает строковое значение вида: "16700000-0001-0000-0000-000000000000"
Это строка. Пробелов там нет. Функция формирует из 12-ти значного числа УИДа элемента справочника
может поможет ? http://pro1c.org.ua/redirect.php?http://www.1cpp.ru/forum/YaBB.pl?num=1192605250/0#0
sava1, попробовал. Такая же ошибка
А зачем в таблице ГУИД? Как получаете ГУИДКонтрагента?
sava1, из этой таблицы БД другая программа забирает данные. УИД изначально получен с помощью функции:
Функция ПолучимГУИД77(Объект)
Стр=ЗначениеВСтрокуВнутр(Объект);
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2));
ГУИД=формат(СЗ.ПолучитьЗначение(4),"Ч(0)5")+Формат(сокрлп(СЗ.ПолучитьЗначение(СЗ.РазмерСписка())),"Ч(0)9");
Возврат ГУИД;
КонецФункции // ПолучимГУИД77
А непосредственно на SQL-е такой запрос выполняется:
Vofka, дело в том, что база уже есть и нужно писать в нее.
Попробую на SQL-е непосредственно. Пока нет возможности.
А зачем изобретать УИД? Ведь ссылка 1C содержит в себе УИД под которым она и хранится в своей базе.
logist, а как извлекается такой УИД в 7-ке?
Удалось записать. Всю цепочку действий не восстановлю. Думаю, что ключевым моментом было то, что в таблице есть поле обязательное для заполнения -уникальный идентификатор строки таблицы. Без его заполнения строка не записывалась. Буду разбираться дальше. Спасибо всем за участие!
А как быть, если элемент, УИД которого надо писать, не выбран?
Заполнить по дефолту, хотя ключевое поле не пропустит - если это ГУИД - прописать NewID()
Наверное было бы правильно в таком случае писать Null, если это допускается.
Но как это предусмотреть в конструкции:
cmd.Commandtext="INSERT INTO tbl_Account (ID, Account1CID, Owner1CID)
|VALUES (NEWID(),
|CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID)+"' as UNIQUEIDENTIFIER),
|CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Owner1CID)+"' as UNIQUEIDENTIFIER)
|)";
Пока на ум пришло записывать в УИД "00000000-0000-0000-0000-000000000000", а потом , при необходимости обрабатывать такие значения.
logist, но тогда мы получим
logist, не записывать конечно правильно. Но как реализовать? Можно записывать обязательные поля, а потом по ним искать и дописывать остальные данные. Может есть способ оптимальней?
Разобрался. Спасибо всем за помощь!
Vava, и?
Vofka, как я и писал, строка не записывалась из-за того, что я не заносил значение в поле, обязательное для заполнения "ID".
Приведенный ниже код позволил записывать данные в таблицу БД, с учетом неполных данных. Если данные отсутствуют - запись в БД не происходит.
Соединение.BeginTrans();
Пока ТЗКонтрагенты.ПолучитьСтроку() = 1 Цикл
Команда="INSERT INTO tbl_Account (ID, Account1CID, Owner1CID, Name, UNP, OKPO, InThePersonOf, FIO, Base, Status, CreatedOn)
|VALUES (NEWID(),
|CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Account1CID) +"' as UNIQUEIDENTIFIER), ";
Если ПустоеЗначение(ТЗКонтрагенты.Owner1CID)=0 Тогда
Команда = Команда + "CAST('"+ПолучимГУИДSQL(ТЗКонтрагенты.Owner1CID) +"' as UNIQUEIDENTIFIER), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.Name)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.Name +"' as CHAR(120)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.UNP)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.UNP +"' as CHAR(13)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.OKPO)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.OKPO +"' as CHAR(12)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.InThePersonOf)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.InThePersonOf +"' as CHAR(8)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.FIO)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.FIO +"' as CHAR(40)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Если ПустоеЗначение(ТЗКонтрагенты.Base)=0 Тогда
Команда = Команда + "CAST('"+ТЗКонтрагенты.Base +"' as CHAR(5)), ";
Иначе
Команда = Команда + "Null, ";
КонецЕсли;
Команда = Команда + "CAST('"+ТЗКонтрагенты.Status +"' as SMALLINT), CAST('"+СокрЛП(РабочаяДата())+"' as DATETIME))";
cmd.Commandtext = Команда;
cmd.Execute();
КонецЦикла;
Соединение.CommitTrans();
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua