Имя: Пароль:
1C
1С v8
Как писать напрямую в SQL таблицы
0 sergdi
 
26.04.12
14:43
Большинство полей в таблицах 1C V82 на SQL сервере типа бинари. Как в них записывать напрямую данные.
1 Джинн
 
26.04.12
14:44
Зачем?
2 UnknownNick
 
26.04.12
14:45
напрямую бы не советовал, попробуйте через АДО.
3 Serginio1
 
26.04.12
14:46
4 Стальная Крыса
 
26.04.12
14:46
От куда ?
5 Kreont
 
26.04.12
14:46
я б вообще не писал вручную...
Да и по лиц.условиях запрещено :(
6 UnknownNick
 
26.04.12
14:48
да кто его читает?
7 sergdi
 
26.04.12
14:48
(5) очень нужно, как подготовить поле для бинари
8 Fish
 
26.04.12
14:50
(7) Читаем лицензионные условия 1С. долго думаем. :))
9 UnknownNick
 
26.04.12
14:50
вы главное не останавливайтесь, вы добавите много удовольствия для пользователей 1С.
10 Джинн
 
26.04.12
14:50
(7) Есть масса более безболезненных способов лишится премии.
11 sergdi
 
26.04.12
14:50
(4) например VB
12 Kreont
 
26.04.12
14:51
Дай ответ на (4), и может тогда проще соединиться из 1С "Туда" и аккуратно вставлять уже из 1С.
13 sergdi
 
26.04.12
14:52
(8) Сформилирую по-другому. Просто хочется узнать много нового и интересного
Нарушать ничего не будем
14 sergdi
 
26.04.12
14:52
(12) данный вариант не подходит
15 UnknownNick
 
26.04.12
14:53
узнавайте сразу на рабочей базе, к черту сомнения и условности!
16 Fish
 
26.04.12
14:53
(13) Сотри бухгалтерскую базу перед сдачей отчётности. Сразу узнаешь много нового и интересного.
17 ОчкарикСлава
 
26.04.12
14:54
(13) , Вам надо в Х-Ветку....
сюда: OFF: Х-Ветка
18 Стальная Крыса
 
26.04.12
14:56
Если прямо в тексте запроса:
Insert into MyTable (BinaryField)
Value('{00000000-0000-0000-000000000000}')
19 andrey153
 
26.04.12
14:56
(7) Например, селектом из других таблиц базы. Что именно нужно записывать в базу?
20 rsv
 
26.04.12
14:58
(0) Скорее речь идет о апдейте ?
21 sergdi
 
26.04.12
14:59
(19) Для начала хочу создавать элементы справочника контрагенты.
22 sergdi
 
26.04.12
14:59
Там даже поле пометка удаления бинари
23 sergdi
 
26.04.12
15:00
(20) нужно создавать новые
24 Kreont
 
26.04.12
15:00
зачем тогда 1С покупали?
25 rsv
 
26.04.12
15:00
+(21)Не взлетит.
26 sergdi
 
26.04.12
15:01
(25) Почему.
27 UnknownNick
 
26.04.12
15:02
да все взлетит, используй insert. если поле не читаемое, это не значит, что нужно останавливаться!
28 andrey153
 
26.04.12
15:02
(21) О! С пометкой-то как раз все просто целое отлично преобразуется к нулю или единице в формате бинари. А вот как угадать очередной id справочника не в курсе. Но можно попробовать вычислить эмпирическим путем :)
29 Ахиллес
 
26.04.12
15:02
(26) Потому, что кто знает, тот не скажет.
30 UnknownNick
 
26.04.12
15:04
стаж 7 лет и 7 месяцев ТС меня вводит в ступор, аккаунт краденный?
31 rsv
 
26.04.12
15:04
(26) Патамушта как минимум неизветсно как генерится значение поля FIDRRef.
32 sergdi
 
26.04.12
15:05
(28) id - это уникальный идентификатор который читается в 1С его думаю можно сформировать
33 UnknownNick
 
26.04.12
15:06
за 8 лет сложно было понять, что справочник Клиенты в 1С это куча взаимосвязанных таблиц?
34 Serginio1
 
26.04.12
15:07
35 sergdi
 
26.04.12
15:08
(31) Это где такое поле я его не увидел
36 sergdi
 
26.04.12
15:09
(33) и что из того. Кучи будем разгребать
37 Serginio1
 
26.04.12
15:09
34+
Функция ПолучитьGUIDПоУникальномуИдентификатору(UUID1)
   UUID=ВРЕГ(UUID1);
   ч1 = Сред(UUID,20,4);
   ч2 = Сред(UUID,25,12);
   ч3 = Сред(UUID,15,4);
   ч4 = Сред(UUID,10,4);
   ч5 = Сред(UUID,1,8);
   Возврат "0x" + ч1 + ч2 + ч3 + ч4 + ч5;
КонецФункции
38 rsv
 
26.04.12
15:13
+(35) В скуле - _IDRRef
39 sergdi
 
26.04.12
15:14
(38)это уникальный идентификатор (37)
40 rsv
 
26.04.12
15:16
(39) А что такое в (37) за параметр  UUID1 в Функции ?
41 sergdi
 
26.04.12
15:20
(40) кто как генерит ГУИД поделитесь секретом
42 Serginio1
 
26.04.12
15:23
(40) УникальныйИдентификатор()
43 rsv
 
26.04.12
15:24
(42) В Бейсике ??? или T-SQL ??? :)
44 Serginio1
 
26.04.12
15:25
45 Serginio1
 
26.04.12
15:26
(43) А разве функция 37 написана на  Бейсике ??? или T-SQL ???
46 rsv
 
26.04.12
15:27
(45) А разве эта функция не может быть написана на Бейсике ??? Так что с параметром UUID1 ? :)
47 Serginio1
 
26.04.12
15:29
Ну уж точно не на T-SQL. Давно я в руках Бейсик не держал там есть Функция  и КонецФункции?
48 rsv
 
26.04.12
15:31
(47) Так что с параметром ? :)
49 Serginio1
 
26.04.12
15:44
(48) так устроит? "e7e05c5d-31ae-464b-9488-c7bdc97c3473"
50 rsv
 
26.04.12
15:49
(49) Увы. Не устроит.
51 sergdi
 
26.04.12
15:52
это не подойдет ?
http://www.vbnet.ru/forum/show.aspx?id=37975
52 Aprobator
 
26.04.12
15:54
(0) правильно, а в конце разобраться как все это побитово прописывать.
53 rsv
 
26.04.12
15:57
(51) Неа.
54 Serginio1
 
26.04.12
16:17
(53) А что тебя не устраивает? Если из 1С нужно найти ID по её уникальному идентификатору то
Declare @Прайс as binary(16) = "+ПолучитьGUIDПоУникальномуИдентификатору(ТипЦен.УникальныйИдентификатор())

если новый то
Convert(binary(16),NEWID()))
55 sergdi
 
10.05.12
17:51
Одна и та же конфигурация, две разные базы данных на сервере. В одной документ реализации товаров и услуг называется как Document203, в другой Document205
Получается что названия на сервере меняются. Как идентифицировать ?
56 shuhard
 
10.05.12
17:56
(55) неужели ещё не предлагали:
ПолучитьСтруктуруХраненияБазыДанных
57 sergdi
 
10.05.12
17:57
(56) предлагали по ней и видно.
58 sergdi
 
10.05.12
17:59
(56) где на сервере хранится ссылка что реализация в одном случае 203, а в другом 205
59 Serginio1
 
10.05.12
17:59
Смотри ПолучитьСтруктуруХраненияБазыДанных
60 Serginio1
 
10.05.12
18:00
(58) Вообще то запрос нужно формировать динамически и брать имена полей из текущей базы
61 shuhard
 
10.05.12
18:01
(58) я бы включил профайлер и запустил ПолучитьСтруктуруХраненияБазыДанных
62 sergdi
 
10.05.12
18:01
(59) Я смотрю. Конфигурация одна и та же а, в разных базах получились разные названия таблиц.
63 Serginio1
 
10.05.12
18:01
Процедура ПолучитьSqlИмяСервераИБазы(Сервер,Порт,ИмяБазы,SqlServer,SqlBaseName)
Соединитель = Новый COMОбъект("V82.COMConnector");
СоединениеСАгентом = Соединитель.ConnectAgent(Сервер);

Кластеры = СоединениеСАгентом.GetClusters();
Кластер = Кластеры.GetValue(Кластеры.GetLowerBound()); // первый кластер
СоединениеСАгентом.Authenticate(Кластер, "", "");
РабочиеПроцессы = СоединениеСАгентом.GetWorkingProcesses(Кластер);
РабочийПроцесс = РабочиеПроцессы.GetValue(РабочиеПроцессы.GetLowerBound()); // первый рабочий процесс
АдресРабочегоПроцесса =
"tcp://" +
РабочийПроцесс.HostName +
":" +
XMLСтрока(РабочийПроцесс.MainPort);
СоединениеСРабочимПроцессом = Соединитель.ConnectWorkingProcess(АдресРабочегоПроцесса);
СоединениеСРабочимПроцессом.AddAuthentication("ADM","3403178");
ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();

Для каждого База из ИнформационныеБазы Цикл
   Если Врег(База.Name)=Врег(ИмяБазы) Тогда
       Сообщить(База.DBServerName);
       Сообщить(База.DBName);
       SqlServer=База.DBServerName;
       SqlBaseName=База.DBName;
   КонецЕсли;
   
КонецЦикла;


   КонецПроцедуры
   Функция ПолучитьТекущийСерверИБазу()
       Перем SqlServer,SqlBaseName;
   //  Сообщить(СтрокаСоединенияИнформационнойБазы());
     Массив=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(СтрокаСоединенияИнформационнойБазы(),"""",""),";");
     Резулт=Новый Структура;
     Для Каждого стр из Массив Цикл
         Если ЗначениеЗаполнено(Стр) Тогда
       КейВалуе=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(стр,"=");
       Резулт.Вставить(КейВалуе[0],КейВалуе[1])
       КонецЕсли;
   КонецЦикла;
   
   ПолучитьSqlИмяСервераИБазы(Резулт.Srvr,1540,Резулт.Ref,SqlServer,SqlBaseName);
   Резулт.Srvr=SqlServer;
   Резулт.Ref=SqlBaseName;
   возврат Резулт;
КонецФункции

Функция ВыполнитьКомандуSQL(ТекстЗапроса) Экспорт
   ДанныеСервера=ПолучитьТекущийСерверИБазу();

   
ConnectionString ="DRIVER=SQL Server;
|UID=администратор;
|Network=DBMSSOCN;
|LANGUAGE=русский;
|DATABASE="+ДанныеСервера.Ref+";
|WSID="+ДанныеСервера.Srvr+";
|APP=Microsoft® Windows® Operating System;
|Trusted_Connection=Yes;
|SERVER="+ДанныеСервера.Srvr;

//Сообщить(СтрокаСоединенияИнформационнойБазы());
    Connection = Новый COMОбъект("ADODB.Connection");
   //ADO_Recordset = Новый COMОбъект("ADODB.Recordset");
   //ADO_Command = Новый COMОбъект("ADODB.Command");
    // ADO_Connection.
//    Соединение.ConnectionString = "DSN=" + ДСН + ";UID=" + УИД + ";PWD=" + ПВД;  
   Connection.ConnectionString = ConnectionString;
   Connection.CommandTimeOut=0;
   Connection.ConnectionTimeout = 0;
   Connection. CursorLocation= 3;
   Сообщить(Connection.ConnectionString);
   Connection.Open();

Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection=Connection;
Command.CommandType = 1;
Command.CommandTimeout=0;

Command.CommandText=ТекстЗапроса;
//RecordSet = Новый COMОбъект("ADODB.RecordSet");
РекордСет=Command.Execute();

Резулт="";
Пока РекордСет<>неопределено Цикл
   Если РекордСет.Fields.Count>0 Тогда
       Поле=РекордСет.Fields(0);
       Стр=Поле.Name+" "+Поле.Value;
       Если ЗначениеЗаполнено(Резулт) тогда
           Резулт=Резулт+"
           |"+Стр
       иначе
           Резулт=Стр;
       КонецЕсли;
   КонецЕсли;
   РекордСет=РекордСет.NextRecordSet();
КонецЦикла;
Сообщить(Резулт);
Возврат  Резулт
КонецФункции
64 sergdi
 
10.05.12
18:11
(63) Хотел из VB создавать новые документы и чтобы не надо было корректировать названия таблиц, если база поменялась.
65 Serginio1
 
10.05.12
18:16
(64) Подключись к 1С через COM и узнавай поля. Вообще то если файл конфигурации один и тотже то все поля одинаковы, просто у тебя из-за обновлений разошлись имена. У меня две базы одна тестовая другая рабочая и все поля одинаковы хотя я и обновляю через слияние.
66 sergdi
 
10.05.12
18:23
(65) Подключаться к 1С можно, но наверное сами имена таблиц должны тоже храниться в таблице, но я не нашел где.
67 Serginio1
 
10.05.12
18:42
Воспользуйся советом    shuhard (61) и сообщи нам
68 NcSteel
 
10.05.12
18:47
(31)
69 NcSteel
 
10.05.12
18:47
(68) + известно как
70 NcSteel
 
10.05.12
18:48
(61) это лишнее, достаточно открыть проф разработку
71 Serginio1
 
10.05.12
19:00
67. По уму вся информация хранится в конфигурационном файле хранящееся в поле Config BinaryData [jnz vjue b jib,fnmcz. Скорее всего из него и надо вытаскивать информацию.
72 0xFFFFFF
 
10.05.12
21:07
(21) "Для начала хочу создавать элементы справочника контрагенты."
Страшно подумать о последующих желаниях, но тем не менее спрошу - а накуа?

У тя каждый день появляется мильен контрагентов, которых нужно напихать в базу? Откуда возникло такое страстное желание сэкономить несколько секунд и приобрести геморроя на несколько месяцев?
73 Ненавижу 1С
 
гуру
10.05.12
21:11
ну в 7.7 же писали и проводили так даже документы
не пробовал: мне на собеседовнаии года 4 назад рассказывали
74 sergdi
 
11.05.12
09:21
(72) 1C 8.2 не поддерживает распределенные транзакции при обмене данными  с другой программой
75 nicxxx
 
11.05.12
09:57
(73) в 7.7 и структура базы попроще