Имя: Пароль:
1C
 
Таблицы 1с и SQL
0 kamysh
 
29.02.08
09:58
Подскажите, как можно узнать какая таблица в SQL 2005 соответсвует данным в 1с 8.0?
нашел V8Viewer, но там демка.
1 kamysh
 
29.02.08
11:11
up
2 Salvador Limones
 
29.02.08
11:12
Enterprise Integrator, ищи на инфостарте.
3 Mich
 
29.02.08
11:53
на сколько я помню в 8.1 реализована возможность смотреть соответствие объектов и их реквизитов таблицам скуля.....на курсах говорили...но не проверял
4 Salvador Limones
 
29.02.08
12:23
(3) Наверное ты про ПолучитьСтруктуруХраненияБазыДанных.
5 Elementarno
 
29.02.08
14:37
По Уникальному идентификатору (УИ).
1.Получаешь УИ
2.Получаешь его в виде строки:
 Функция GUID(Ссылка) Экспорт
   Стр = Строка(Ссылка.УникальныйИдентификатор());
   Return Сред(Стр,27,2)+Сред(Стр,25,2)+Сред(Стр,22,2)+Сред(Стр,20,2)+
   "-"+Сред(Стр,31,2)+Сред(Стр,29,2)+
   "-"+Сред(Стр,35,2)+Сред(Стр,33,2)+
   "-"+Сред(Стр,15,4)+
   "-"+Сред(Стр,10,4)+Сред(Стр,1,8);
 КонецФункции
3.Через СОМ
 Cnn = Новый COMОбъект("ADODB.Connection");
 запускаешь SQL (а уж там можно сделатьвсЁ в отличие от 1С)


4.Например:
CREATE PROCEDURE dbo.kkk_Find_Table
-- Ищем таблицы по ссылке в документе и пишем соответствие в таблицу KirSYSOBJECTS
@Link as char(36), -- Это УИ
@cName as varchar(255),  -- Это название объекта в 1С
@Tip as char(1)='C'  -- Это чтоб побыстрее
--    "5050edbf-5054-3030-11da-e7009eb351f0"
AS
declare @C int, @name sysname,  @sqlstmt varchar(255),  @nameL sysname
--CLOSE crs1
--DEALLOCATE crs1
if @Tip='C'  -- Справочники
begin
DECLARE crs1 CURSOR FAST_FORWARD READ_ONLY FOR
--select NAME
--from SYSOBJECTS where xtype='U' order by name
SELECT      name
FROM         [1c_EX].dbo.sysobjects -- 1c_EX База 1С
WHERE     (type = 'U') AND (LEFT(name, 10) = '_Reference') AND (CHARINDEX('VT', name) = 0) AND (CHARINDEX('Change', name) = 0)
ORDER BY name
end
if @Tip='D'   -- Документы
begin
DECLARE crs1 CURSOR FAST_FORWARD READ_ONLY FOR
SELECT     TOP 100 PERCENT name
FROM          [1c_EX].dbo.sysobjects
WHERE     (type = 'U') AND (CHARINDEX('VT', name) = 0) AND (LEFT(name, 2) = '_D') AND (CHARINDEX('Change', name) = 0)  AND (CHARINDEX('jour', name) = 0)--Change
ORDER BY name
end
OPEN crs1
FETCH NEXT FROM crs1 INTO @name
WHILE  (@@FETCH_STATUS=0)  BEGIN
Set  @nameL='[1c_EX].dbo.' + @name
SET @sqlstmt='INSERT KirSYSOBJECTS    SELECT '+char(39)+@cName+char(39)+'  , '+char(39)+@name+char(39)+' ,  (SELECT COUNT(*) FROM '+@nameL+' where _IDRRef = CONVERT(uniqueidentifier,'+char(39)+@Link+char(39)+') ) '

--select @sqlstmt
EXECUTE (@sqlstmt)
FETCH NEXT FROM crs1 INTO @name
END
CLOSE crs1
DEALLOCATE crs1
delete from  KirSYSOBJECTS where C=0
if @C>0
RETURN 0
else
RETURN -1
GO

5.Табличные части проще по количеству полей в них
WHERE   CHARINDEX('_VT', name)>1 and CHARINDEX(@name, name)>0 and  (type = 'U') AND LEN(name)>LEN(@name)

6.Потом находим соответствие полей:
INSERT into KIRSYSCOLUMNS
SELECT  @ColName, ColName,ID,  Tip, length, c_Name, sql_Name
FROM         dbo.C_Columns(@Tname, @J)

7.Регистры (а если база не пустая, то и для всего) проще по количеству записей в них.(К счастью в SQL оно совпадает с 1С :-)))

CREATE PROCEDURE SizT
--    Test_1C.[].SizT
AS
declare @D as datetime, @N as int , @nameT as  sysname    --, MN as int
select @N=max(N) FROM KirSz

--DELETE [].KirSz
INSERT INTO KirSz(Nt) SELECT NAME FROM  [1C_EX].dbo.SYSOBJECTS where xtype='U' order by name


DECLARE crs1 CURSOR FAST_FORWARD READ_ONLY FOR
select NAME
from [1C_EX].dbo.SYSOBJECTS where xtype='U' order by name

DECLARE @name sysname,@s varchar(128), @sqlstmt varchar(255), @cnt int

OPEN crs1
FETCH NEXT FROM crs1 INTO @name
WHILE  (@@FETCH_STATUS=0)  BEGIN

--SET @sqlstmt='SELECT max('+@cnt+'), COUNT(*) FROM '+@name
select @nameT    =     '[1C_EX].dbo.['    + @name    + ']'                                    --Test_1C.[].KirSz.   Test_1C.[].KirSz.
--select @nameT    
SET @sqlstmt='UPDATE KirSz SET  Sz= (SELECT COUNT(*) FROM '+@nameT+')  FROM KirSz  WHERE Nt = '+char(39)+@name+char(39) +' and N = 0'
--select @sqlstmt
EXECUTE (@sqlstmt)

SET @sqlstmt='UPDATE KirSz SET  N='+cast(@N+1 as char(6))+' FROM KirSz  WHERE Nt = '+char(39)+@name+char(39) +' and N = 0'
EXECUTE (@sqlstmt)


FETCH NEXT FROM crs1 INTO @name
END
       SELECT @N+1 as Lastt
       SELECT * from KirSz where N=@N+1
CLOSE crs1
DEALLOCATE crs1
GO
Ошибка? Это не ошибка, это системная функция.