Имя: Пароль:
1C
1C 7.7
v7: Дублирование записей в таблице _1SCRDOC на SQL
, ,
0 Sam1C
 
17.01.20
13:11
При ТиС в режиме пересчет служебных записей по одной графе отбора и только по одному виду документа входящий в эту графу, дублирует записи. Удалял графу, потом опять ее добавлял все равно после пересчета дублирует записи и соответственно вылет с ошибкой не уникальности индекса.

ROW_ID     MDID    PARENTVAL    CHILD_DATE_TIME_IDDOC           CHILDID          FLAGS
2058429    48780    B1  IA  1CDZ     20190930EAEAY8 SL0T            SL0T                1
2078352    48780    B1  IA  1CDZ     20190930EAGG40 SL0T            SL0T               8

Индекс по полям MDID,PARENTVAL,CHILDID. Отличается значения в полях CHILD_DATE_TIME_IDDOC и FLAGS. для чего эти поля и почему она может дублировать эти записи?
1 trad
 
17.01.20
13:15
найди в _1sjourn запись iddoc = '  SL0T   '
посмотри у нее date_time_iddoc
из _1scrdoc удали __другую__
2 VladZ
 
17.01.20
13:15
Забанили в Яндексе?
3 dk
 
17.01.20
13:24
1с++ установлен?
4 Sam1C
 
17.01.20
13:24
(1) Так удалял полностью графу отбора, все дубли очищались и пробовал удалять средствами SQL все равно их при пересчете восстанавливает 1с
5 Sam1C
 
17.01.20
13:25
(3) да
6 dk
 
17.01.20
13:28

Функция ВылечитьСтруктуру(прмДанные, прмЗапрос)
    Перем Результат, ТекстЗапроса, Док;    
    
    Результат = Нет;
    
    // нет документа еще
    Если ПустоеЗначение(прмДанные.Документ) = 1 Тогда
        Возврат Результат;
    КонецЕсли;
    
    // Попробуем заблочить и полечить?
    Док = СоздатьОбъект("Документ");
    Если Док.НайтиДокумент(прмДанные.Документ) = 1 Тогда
        Если Док.Блокировка(1) = 1 Тогда
            ТекстЗапроса = "
            |UPDATE _1SCRDOC
            |    SET CHILD_DATE_TIME_IDDOC = Журнал.DATE_TIME_IDDOC
            |FROM _1SCRDOC Отбор
            |INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON (Журнал.IDDOC = Отбор.CHILDID) AND (Журнал.IDDOC = :Документ_подч)
            // [*] ((( dk, 15.02.2019
            //|WHERE (Отбор.MDID = 0)
            //|    AND (Отбор.ROW_ID = :НомерСтроки)
            //  -------------
            |WHERE
            |    (Отбор.ROW_ID = :НомерСтроки)
            //[*] dk, 15.02.2019 )))
            |    AND (Отбор.PARENTVAL = :Родитель)
            |    AND (Отбор.CHILD_DATE_TIME_IDDOC <> Журнал.DATE_TIME_IDDOC)
            |    AND (Отбор.CHILDID = :Документ_подч)
            |";

            прмЗапрос.УстановитьТекстовыйПараметр("НомерСтроки",    прмДанные.ROW_ID);
            прмЗапрос.УстановитьТекстовыйПараметр("Родитель",        прмДанные.ЗначениеОтбора);
            прмЗапрос.УстановитьТекстовыйПараметр("Документ_подч",    прмДанные.Документ_подч);
            
            Попытка
                прмЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
                Результат = Да;
                Сообщить("Починили документ: " + Док.ТекущийДокумент());
                ЗаписьЖурналаРегистрации("Чиним структуру подчиненности: " + прмДанные.ROW_ID + " было: " + прмДанные.ПодчДатаВремяИдДок, "Документ", "Записан", Док.ТекущийДокумент(), 2);
            Исключение
                Сообщить("Ошибка при лечении структуры: " + Лев(ОписаниеОшибки(), 200));
            КонецПопытки;
            Док.Блокировка(0);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

//****************************************************************

        _Нач = _GetPerformanceCounter();
        
        Состояние("Графы Отбора");
        
        ТекстЗапроса = "
        |SELECT
        |    Отбор.MDID                                ВидОтбора
        |    , Отбор.PARENTVAL                        ЗначениеОтбора
        |    , Отбор.CHILD_DATE_TIME_IDDOC            ПодчДатаВремяИдДок
        |    , Журнал.DATE_TIME_IDDOC                 DATE_TIME_IDDOC
        |    , CASE WHEN Журнал.DATE_TIME_IDDOC = Отбор.CHILD_DATE_TIME_IDDOC THEN '' ELSE '******' END Признак
        |    , Отбор.CHILDID                            Документ_подч
        |    , NullIf(Cast(Left(Отбор.CHILD_DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
        |    , Журнал.IDDOC                            [Документ $Документ]
        |    , Журнал.IDDOCDEF                        [Документ_вид $ВидДокументаПредставление]
        |    , Отбор.ROW_ID                            ROW_ID
        |FROM _1SCRDOC AS Отбор With (NOLOCK)
        |LEFT JOIN _1SJOURN AS Журнал With (NOLOCK) ON Журнал.IDDOC = Отбор.CHILDID
        |WHERE (Отбор.MDID <> 0) AND ((Журнал.IDDOC IS NULL) OR (Журнал.DATE_TIME_IDDOC <> Отбор.CHILD_DATE_TIME_IDDOC))
        |";
        
        ВремТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
        
        Таб.ВывестиСекцию("ШапкаГрафы");
        
        ВремТЗ.ВыбратьСтроки();
        Пока ВремТЗ.ПолучитьСтроку() > 0  Цикл
            // [+] ((( dk, 14.02.2019 OPT-1309
            ТипаВылечили = Нет;
            Если флЛечитьГрафы <> 0 Тогда
                ТипаВылечили = ВылечитьСтруктуру(ВремТЗ, Запрос);
            КонецЕсли;
            //[+] dk, 14.02.2019 )))
            Таб.ВывестиСекцию("СтрокаГрафы");
            // [+] ((( dk, 29.07.2019 есть проблемы
            Если ТипаВылечили = Нет Тогда
                флВсеХорошо = 0;
            КонецЕсли;
            //[+] dk, 29.07.2019 )))            
        КонецЦикла;
7 Sam1C
 
17.01.20
13:36
(6) спс, попробую
8 toypaul
 
гуру
17.01.20
14:32
(7) не поможет. дубли надо искать в исходных документах на основании, которых получается дубль. в (6) лечится только результат, что не совсем правильно
9 Sam1C
 
17.01.20
15:29
(8) понять бы откуда берется этот дубль, откуда она берет другую позицию документа в поле CHILD_DATE_TIME_IDDOC и для чего поле FLAGS
10 Sam1C
 
17.01.20
15:36
(9) В журнале по этому документу DATE_TIME_IDDOC =  20190930EAEAY8  SL0T, т.е. первая строка верная, откуда может брать значение 20190930EAGG40 SL0T ! И все неверные строки с   FLAGS = 8
11 Sam1C
 
19.01.20
19:51
(10) дублирует записи из-за того, что в таблицах _1SENTRY и _1SJOURN разные DATE_TIME_IDDOC, вот она и пишет две записи в таблицу _1SCRDOC, одна из журнала документов, другая из журнала проводок. При перепроведении восстанавливает правильный DATE_TIME_IDDOC в _1SENTRY из _1SJOURN. Решение нахождения документов которые дублируются в _1SCRDOC и их перепроведение, потом ТиС пересчет служебных данных!
12 Злопчинский
 
19.01.20
22:26
(11) спсб, что отписался
13 Провинциальный 1сник
 
20.01.20
06:36
(11) Есть способ проще - просто sql-запросом. Тема давно раскрыта.
http://catalog.mista.ru/public/325847/
14 Sam1C
 
21.01.20
11:17
(13) спасибо, да этот вариант намного проще, не надо перепроводить доки.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан