Имя: Пароль:
1C
1С v8
Перенос проводок из копии SQL
0 Tateossian
 
10.10.14
20:26
Всем привет! Весь вечер пятницы ломаю голову... Надо перенести проводки по БУ из архивной копии по определенной организации и определенным счетам (60, 62, 76). Использую написанный ниже запрос:

DECLARE @Account60 AS VARBINARY(16)
DECLARE @Account76 AS VARBINARY(16)
DECLARE @Account7601 AS VARBINARY(16)
DECLARE @Account62 AS VARBINARY(16)

DECLARE @Org AS VARBINARY(16)
DECLARE P1 AS DATETIME2(3)
SET P1 = '4014-06-30 23:59:59'

-- Отбираем ссылки на счета
SET @Account60 = 0x94D552749ABA3E8F42443FC86DDB4928 --Родительский счет 60
SET @Account76 = 0x9C19CBDA3DD23CC5415A39EACD87EB5B --Родительский счет 76
SET @Account7601 = 0x8B3F6908096CBB1A480EA8787025079F --Родительский счет 7601
SET @Account62 = 0xA9BEE74259B8A6A9471EBD2347509862 -- Родительский счет 62

SET @Org = 0x911AEE3A33F0F6BE4AC5D0F44F4481F9 --Организация

IF EXISTS (select object_id('tempdb..#Acc'))
DROP TABLE #Acc

SELECT
    _IDRRef
    ,_Code
INTO #Acc
FROM [upp_07.10.2014].[dbo].[_Acc17] WITH (NOLOCK)
WHERE _ParentIDRRef IN (@Account60, @Account76, @Account7601, @Account62)
ORDER BY _Code

DELETE SUB
FROM upp_test.dbo._AccRgED22577 SUB
    INNER JOIN upp_test.dbo._AccRg22549 Provodki ON
        SUB._Period = Provodki._Period AND
        SUB._RecorderTRef = Provodki._RecorderTRef AND
        SUB._RecorderRRef = Provodki._RecorderRRef AND
        SUB._LineNo = Provodki._LineNo AND
        Provodki._Fld22550RRef = @Org AND (
        Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc) OR
        Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc))
WHERE (SUB._Period <= P1)

DELETE FROM upp_test.dbo._AccRg22549
    WHERE _AccRg22549._Period <= P1
    AND _AccRg22549._Fld22550RRef = @Org
    AND (_AccRg22549._AccountCtRRef IN (SELECT _IDRref FROM #Acc) OR
        _AccRg22549._AccountDtRRef IN (SELECT _IDRref FROM #Acc))
    
INSERT INTO upp_test.dbo._AccRgED22577
    (SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef)
SELECT     
    SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef
FROM [upp_07.10.2014].dbo._AccRgED22577 AS SUB
INNER JOIN [upp_07.10.2014].dbo._AccRg22549 AS Provodki
    ON SUB._Period = Provodki._Period AND
    SUB._RecorderTRef = Provodki._RecorderTRef AND
    SUB._RecorderRRef = Provodki._RecorderRRef AND
    SUB._LineNo = Provodki._LineNo AND
    Provodki._Period <= P1 AND
    (Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc)
        OR Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc)) AND
    Provodki._Fld22550RRef = @Org    
    

INSERT INTO upp_test.dbo._AccRg22549
SELECT *
FROM [upp_07.10.2014].dbo._AccRg22549 AS Provodki
WHERE Provodki._Period <= P1
    AND Provodki._Fld22550RRef = @Org
    AND (Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc)
    OR Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc))

При его выполнении выдается ошибка:

Сообщение 2601, уровень 14, состояние 1, строка 50
Не удается вставить повторяющуюся строку ключа в объект "dbo._AccRgED22577" с уникальным индексом "_AccRg22577_ByPeriod_TRNRN". Повторяющееся значение ключа: (мар 26 4013 10:57AM, 0x000001ee, 0x8d0e0050568699bc11e295d54e071161, 5, 0x93e0bc525fc3dbe048d4a86fac901067, 0).
Выполнение данной инструкции было прервано.


Сообщение 2601, уровень 14, состояние 1, строка 81
Не удается вставить повторяющуюся строку ключа в объект "dbo._AccRg22549" с уникальным индексом "_AccRg22549_ByPeriod_TRN". Повторяющееся значение ключа: (мар 26 4013 10:57AM, 0x000001ee, 0x8d0e0050568699bc11e295d54e071161, 5).
Выполнение данной инструкции было прервано.

Как может быть нарушена уникальность, если я делаю внутреннее соединение РегистрБухгалтерии.Хозрасчетный с Субконто по всем полям индекса?
Или у меня задвоение записей?

А движения по Хозрасчетный я так вообще просто переношу. Или вот тут ошибка?     
AND (Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc)
    OR Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc))
1 Ник второй
 
10.10.14
20:29
(0) Зачем? Чем тебе конвертация не устроила?
2 Ник второй
 
10.10.14
20:30
Писать прямые запросы на 1С8 это расписаться в своей некомпитентности..... просто ужас...
3 Tateossian
 
10.10.14
20:30
(1) Тем, что она не подходит для данной задачи. Нужно перенести несколько миллионов проводок. Нафиг мне тут конвертация.
4 Tateossian
 
10.10.14
20:31
(2) Не неси пургу, батенька.
5 Ник второй
 
10.10.14
20:32
(3) ну дык несколько миллионов записей это немного. Зачем огород городить? Темболее скорость будет та же.
6 Ник второй
 
10.10.14
20:32
(4) Это аксиома.
7 Tateossian
 
10.10.14
20:32
(6) Я тоже это слышал. Уже не первый раз так делаю и скорость знаю. Короче, не умничай. Есть совет по делу?
8 Ник второй
 
10.10.14
20:34
(7) В том то и прикол, что я тоже был юн и горяч, пока осознание не пришло.

Несколько миллионов строк это 30-50 минут типовыми средствами переноса.
9 Tateossian
 
10.10.14
20:35
(8) Долго. А результат не гарантирован.
10 Tateossian
 
10.10.14
20:36
Народ, почему делается инсерт с ошибкой, ведь, по сути, я просто накладываю условие на выборку, перед этим удалив все записи с таким же условием?
11 Ник второй
 
10.10.14
20:37
(9) Как раз в этом случае результат гарантирован.
12 Tateossian
 
10.10.14
20:37
Вот тут удалил:

DELETE FROM upp_test.dbo._AccRg22549
    WHERE _AccRg22549._Period <= P1
    AND _AccRg22549._Fld22550RRef = @Org
    AND (_AccRg22549._AccountCtRRef IN (SELECT _IDRref FROM #Acc) OR
        _AccRg22549._AccountDtRRef IN (SELECT _IDRref FROM #Acc))

А потом вставил:
13 Tateossian
 
10.10.14
20:37
INSERT INTO upp_test.dbo._AccRg22549
SELECT *
FROM [upp_07.10.2014].dbo._AccRg22549 AS Provodki
WHERE Provodki._Period <= P1
    AND Provodki._Fld22550RRef = @Org
    AND (Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc)
    OR Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc))
14 Ник второй
 
10.10.14
20:38
Так же

3. Незаконное распространение материалов, защищенных авторским правом, на форуме категорически запрещено! Не публикуйте материалы, нарушающие авторские права, а также ссылки на них. (к распространению приравниваются также просьбы "скинуть в почту" и подобные)
4. Не публикуйте алгоритмы взлома и ссылки на такие алгоритмы, а также всевозможные "патчи", "крэки", "эмуляторы", "серийные номера", "коды активации" и т.д.
15 Banned
 
10.10.14
20:41
а просто селект перед вставкой сделать и проверить?
16 Tateossian
 
10.10.14
20:45
(15) Прикол в том, что я сделал отбор прям по ошибке...
И строка такая одна.
https://yadi.sk/i/tBzGG8PKbvcWR
17 Tateossian
 
10.10.14
20:48
... Уже не первый раз так переношу данные, но ошибка, связанная с индексами - впервые.
18 ОчкарикСлава
 
10.10.14
20:50
Не пятничной как то...
19 Tateossian
 
10.10.14
20:51
(18) Да какая разница, я работаю в режиме 12/7 - сейчас отчетный период.
20 Banned
 
10.10.14
20:51
(16) не пойду я на яндекс за картинкой
21 Ник второй
 
10.10.14
20:53
(17) Бугага
22 Ник второй
 
10.10.14
20:54
(19) Вот именно поэтому , что не профессионал и работаешь 12/7. Я в 18-00 пошел домой , а мог и раньше, но скучно.
23 Tateossian
 
10.10.14
20:56
(22) Мне твое мнение очень ценно.
А что если я скажу, что у меня бухгалтерия работает до поздна и по выходным и еще есть Владивосток, у которого тоже сбои бывают?
24 Ник второй
 
10.10.14
20:59
(23) Я скажу что у меня 200 филиальных точек от македонии до владивостока и что то нет нужны сидеть ночью.
25 Ник второй
 
10.10.14
21:05
(24) И да обычно то что ты не успеваешь делать свою работу этим не хвастаются, а наоборот пытаются скрывать. Так что советую заняться работой а не велосипедостроительством.
26 Tateossian
 
10.10.14
21:08
(25) Ты такой флудильщик. Пусть второй раз забанят.
27 Ник второй
 
10.10.14
21:11
(26) Все слова по делу. А (0) противозаконно, да и просто бред.
28 ОчкарикСлава
 
10.10.14
21:38
(27) в целом да. Противозаконно точно. Да и нужды в таком подходе нету, если все правильно организовать.
29 Tateossian
 
11.10.14
00:50
INSERT INTO upp_test.dbo._AccRgED22577
    (SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef)
SELECT     
    SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef
FROM [upp_07.10.2014].dbo._AccRgED22577 AS SUB
INNER JOIN #IDX AS IDX
    ON SUB._Period = IDX._Period AND
    SUB._RecorderTRef = IDX._RecorderTRef AND
    SUB._RecorderRRef = IDX._RecorderRRef AND
    SUB._LineNo = IDX._LineNo    

INSERT INTO upp_test.dbo._AccRg22549
    (Provodki._Period
      ,Provodki._RecorderTRef
      ,Provodki._RecorderRRef
      ,Provodki._LineNo
      ,Provodki._Active
      ,Provodki._AccountDtRRef
      ,Provodki._AccountCtRRef
      ,Provodki._Fld22550RRef
      ,Provodki._Fld22551DtRRef
      ,Provodki._Fld22551CtRRef
      ,Provodki._Fld22552
      ,Provodki._Fld22553Dt
      ,Provodki._Fld22553Ct
      ,Provodki._Fld22554Dt
      ,Provodki._Fld22554Ct
      ,Provodki._Fld22555
      ,Provodki._Fld22556
      ,Provodki._Fld22557
      ,Provodki._Fld22558
      ,Provodki._Fld22559RRef
      ,Provodki._Fld22560)
SELECT
    Provodki._Period
      ,Provodki._RecorderTRef
      ,Provodki._RecorderRRef
      ,Provodki._LineNo
      ,Provodki._Active
      ,Provodki._AccountDtRRef
      ,Provodki._AccountCtRRef
      ,Provodki._Fld22550RRef
      ,Provodki._Fld22551DtRRef
      ,Provodki._Fld22551CtRRef
      ,Provodki._Fld22552
      ,Provodki._Fld22553Dt
      ,Provodki._Fld22553Ct
      ,Provodki._Fld22554Dt
      ,Provodki._Fld22554Ct
      ,Provodki._Fld22555
      ,Provodki._Fld22556
      ,Provodki._Fld22557
      ,Provodki._Fld22558
      ,Provodki._Fld22559RRef
      ,Provodki._Fld22560
FROM [upp_07.10.2014].dbo._AccRg22549 AS Provodki
INNER JOIN #IDX AS IDX
    ON Provodki._Period = IDX._Period AND
    Provodki._RecorderTRef = IDX._RecorderTRef AND
    Provodki._RecorderRRef = IDX._RecorderRRef AND
    Provodki._LineNo = IDX._LineNo

При использовании конструкции OR строка обрабатывалась дважды при команде INSERT.
30 Tateossian
 
11.10.14
00:51
(29) Первую половину не скопипастил...

Вот что получилось в итоге:

DECLARE @Account60 AS VARBINARY(16)
DECLARE @Account76 AS VARBINARY(16)
DECLARE @Account7601 AS VARBINARY(16)
DECLARE @Account62 AS VARBINARY(16)

DECLARE @Org AS VARBINARY(16)
DECLARE P1 AS DATETIME2(3)
SET P1 = '4014-06-30 23:59:59'

SET @Account60 = 0x94D552749ABA3E8F42443FC86DDB4928 --Родительский счет 60
SET @Account76 = 0x9C19CBDA3DD23CC5415A39EACD87EB5B --Родительский счет 76
SET @Account7601 = 0x8B3F6908096CBB1A480EA8787025079F --Родительский счет 7601
SET @Account62 = 0xA9BEE74259B8A6A9471EBD2347509862 -- Родительский счет 62

SET @Org = 0x911AEE3A33F0F6BE4AC5D0F44F4481F9 --Организация АА

IF EXISTS (select object_id('tempdb..#Acc'))
DROP TABLE #Acc
IF EXISTS (select object_id('tempdb..#IDX'))
DROP TABLE #IDX

SELECT
    _IDRRef
    ,_Code
INTO #Acc
FROM [upp_07.10.2014].[dbo].[_Acc17] WITH (NOLOCK)
WHERE _ParentIDRRef IN (@Account60, @Account76, @Account7601, @Account62)
ORDER BY _Code

SELECT
    Provodki._Period
    ,Provodki._RecorderTRef
    ,Provodki._RecorderRRef
    ,Provodki._LineNo
INTO #IDX
FROM
    [upp_07.10.2014].dbo._AccRg22549 Provodki
WHERE Provodki._Period <= P1
    AND Provodki._Fld22550RRef = @Org
    AND Provodki._AccountCtRRef IN (SELECT _IDRref FROM #Acc)
UNION
SELECT
    Provodki._Period
    ,Provodki._RecorderTRef
    ,Provodki._RecorderRRef
    ,Provodki._LineNo
FROM
    [upp_07.10.2014].dbo._AccRg22549 Provodki
WHERE Provodki._Period <= P1
    AND Provodki._Fld22550RRef = @Org
    AND Provodki._AccountDtRRef IN (SELECT _IDRref FROM #Acc)

DELETE SUB
FROM upp_test.dbo._AccRgED22577 SUB
    INNER JOIN #IDX IDX ON
        SUB._Period = IDX._Period AND
        SUB._RecorderTRef = IDX._RecorderTRef AND
        SUB._RecorderRRef = IDX._RecorderRRef AND
        SUB._LineNo = IDX._LineNo

DELETE Provodki
FROM upp_test.dbo._AccRg22549 Provodki
    INNER JOIN #IDX IDX ON
        Provodki._Period = IDX._Period AND
        Provodki._RecorderTRef = IDX._RecorderTRef AND
        Provodki._RecorderRRef = IDX._RecorderRRef AND
        Provodki._LineNo = IDX._LineNo
    
INSERT INTO upp_test.dbo._AccRgED22577
    (SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef)
SELECT     
    SUB._Period
    ,SUB._RecorderTRef
    ,SUB._RecorderRRef
    ,SUB._LineNo
    ,SUB._Correspond
    ,SUB._KindRref
    ,SUB._Value_TYPE
    ,SUB._Value_RTRef
    ,SUB._Value_RRRef
FROM [upp_07.10.2014].dbo._AccRgED22577 AS SUB
INNER JOIN #IDX AS IDX
    ON SUB._Period = IDX._Period AND
    SUB._RecorderTRef = IDX._RecorderTRef AND
    SUB._RecorderRRef = IDX._RecorderRRef AND
    SUB._LineNo = IDX._LineNo    

INSERT INTO upp_test.dbo._AccRg22549
    (Provodki._Period
      ,Provodki._RecorderTRef
      ,Provodki._RecorderRRef
      ,Provodki._LineNo
      ,Provodki._Active
      ,Provodki._AccountDtRRef
      ,Provodki._AccountCtRRef
      ,Provodki._Fld22550RRef
      ,Provodki._Fld22551DtRRef
      ,Provodki._Fld22551CtRRef
      ,Provodki._Fld22552
      ,Provodki._Fld22553Dt
      ,Provodki._Fld22553Ct
      ,Provodki._Fld22554Dt
      ,Provodki._Fld22554Ct
      ,Provodki._Fld22555
      ,Provodki._Fld22556
      ,Provodki._Fld22557
      ,Provodki._Fld22558
      ,Provodki._Fld22559RRef
      ,Provodki._Fld22560)
SELECT
    Provodki._Period
      ,Provodki._RecorderTRef
      ,Provodki._RecorderRRef
      ,Provodki._LineNo
      ,Provodki._Active
      ,Provodki._AccountDtRRef
      ,Provodki._AccountCtRRef
      ,Provodki._Fld22550RRef
      ,Provodki._Fld22551DtRRef
      ,Provodki._Fld22551CtRRef
      ,Provodki._Fld22552
      ,Provodki._Fld22553Dt
      ,Provodki._Fld22553Ct
      ,Provodki._Fld22554Dt
      ,Provodki._Fld22554Ct
      ,Provodki._Fld22555
      ,Provodki._Fld22556
      ,Provodki._Fld22557
      ,Provodki._Fld22558
      ,Provodki._Fld22559RRef
      ,Provodki._Fld22560
FROM [upp_07.10.2014].dbo._AccRg22549 AS Provodki
INNER JOIN #IDX AS IDX
    ON Provodki._Period = IDX._Period AND
    Provodki._RecorderTRef = IDX._RecorderTRef AND
    Provodki._RecorderRRef = IDX._RecorderRRef AND
    Provodki._LineNo = IDX._LineNo
31 Сияющий Асинхраль
 
11.10.14
00:58
(30) Так и хочется сказать "Героям слава" :-)... Ой, но это, кажется, из другой оперы :-)))