Имя: Пароль:
1C
1С v8
Помогите с SQL-запросом
, ,
0 napagokc
 
06.03.17
15:05
Добрый день.
При обмене между идентичными базами (основная - управленка) выскакивает ошибка:
Microsoft SQL Server Native Client 11.0: Не удается вставить повторяющуюся строку ключа в объект "dbo._Reference73" с уникальным индексом "_Reference73HPK". Повторяющееся значение ключа: (0, 0xa8d2ac220bdb6ffb11e6b0a395a508a1).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1

Я нашел, что такое _Reference73 - это справочник ("Виды использования рабочего времени") с предопределенными элементами. Ошибка возникала на предопределенном элементе, который в управленческой базе почему-то не был отмечен, как предопределенный. Тестирование и исправление в базе делал - ошибок нет. При пересчете итогов база в большинстве случаев крашится, но с какой-то попытки проходит. Ошибку это не исправляет.

Признак предопределенности я элементу присвоил, программно привязав элемент к установленному в конфигураторе:

Процедура СделатьПредопределеннымНаСервере()
    Об = Объект.ВидыИспользованияРабочегоВремени.ПолучитьОбъект();
    Об.ИмяПредопределенныхДанных = "ПраздникиБезПовышеннойОплаты";
    Попытка
        Об.Записать();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Но при ошибка при обмене не ушла.
Полез в SQL Server Management Studio, нашел там нужную таблицу:
http://prntscr.com/egn5x7
Что с ней делать дальше? Я вывел все поля, но не вижу там ключа из ошибки:
select count(*), _IDRRef, _Version, _Marked, _PredefinedID, _Description, _Fld2999, _Fld3000, _Fld3001, _Fld3002, _Fld3003, _Fld3004, _Fld3005, _Fld3006RRef, _Fld3007, _Fld3008, _Fld1626
from _Reference73
group by _IDRRef, _Version, _Marked, _PredefinedID, _Description, _Fld2999, _Fld3000, _Fld3001, _Fld3002, _Fld3003, _Fld3004, _Fld3005, _Fld3006RRef, _Fld3007, _Fld3008, _Fld1626

Как посмотреть значения индексов, чтобы увидеть дублирование, и как их выправить?
1 omgwtf
 
06.03.17
15:09
тестирование и исправление базы не находит ошибок?
2 napagokc
 
06.03.17
15:10
и да, я статью с сайта Гилева прочитал (http://www.gilev.ru/nonunique/), но там на примере документов всё рассматривается и либо мне не подходит, либо я что-то не понимаю...
3 napagokc
 
06.03.17
15:11
(1) ТиИ отрабатывает без замечаний вообще. Тестирование начато - Тестирование закончено.
4 MrStomak
 
06.03.17
15:22
0xa8d2ac220bdb6ffb11e6b0a395a508a1 - это значение поля _IDRRef, на котором происходит ошибка.
Происходит попытка записи неуникального гуида.

Точно не видно этого номера в запросе студии?
5 napagokc
 
06.03.17
15:25
(4) Точно. И глазами проверил, и поиском через Ctrl+F
http://prntscr.com/egnfy0
6 napagokc
 
06.03.17
15:28
(4) безбожно вру. Есть такой ключ, только в другом регистре, а поиск его не находит почему-то. Ок, и что с этим делать?
http://prntscr.com/egnhc6
7 youalex
 
06.03.17
15:28
профайлером еще можно посмотреть. какие запросы выполняются
8 MrStomak
 
06.03.17
15:30
(7) Да я тебе и так скажу - выполняется insert в dbo._Reference73
9 napagokc
 
06.03.17
15:35
так и что делать-то? Почему возникает ошибка, если элемент вставляется сам в себя?
Обмен проходит по правилам КД 2.1, поиск элементов идет по идентификатору, и если не находит идентификатор, то по наименованию. Наименования совпадают. Что не так?
http://prntscr.com/egnkad
10 youalex
 
06.03.17
15:38
(8) ну, вот это  и можно будет увидеть, со всеми параметрами и предыдущими командами

зы. Тут недавно тема была, тоже по уникальности, там оказалось, что индекс порушился.
11 mexanik_96
 
06.03.17
15:40
(0)индексы таким запросом не увидишь. нпк кластерный уникальный индекс. сходи на итс прсмотри как индексы строятся для справочников.вообще ребилд средствами скл по таблице сделай.
12 Ёпрст
 
06.03.17
15:40
(0) давно бы сделал truncate table _Reference73

и далее либо isert into select либо просто имортом, либо обычной xml выгрузкой заполнения справочника с другой базы.
13 napagokc
 
06.03.17
15:41
может быть можно как-то изменить текущий индекс в базе-приемнике, изменить наименование элемента, провести обмен (чтобы создался элемент из базы-источника), а потом поиском дублей объединить эти элементы?
14 napagokc
 
06.03.17
15:42
(12) я в этом не понимаю от слова совсем, поэтому и прошу помощи. Можете подробнее рассказать?
15 napagokc
 
06.03.17
15:44
(12) загуглил, truncate - полностью очищает все строки в таблице. База рабочая, что с ней станет, если я удалю все строки? Ссылки на <Объект не найден>?
16 mexanik_96
 
06.03.17
15:45
(13)ребилд индексов по таблице сделать можешь в студии?
17 Ёпрст
 
06.03.17
15:47
(15) далее, перенесешь с другой базы целиком этот справочник. Усё.
18 napagokc
 
06.03.17
15:47
(16) Как это сделать?

Вот у Гилева есть пример с заменой индекса:
===========
Замените значение _KeyField в одной из повторяющихся записей на правильное:

update _Document140_VT1385
set _KeyField = keymax + 1
where _Document140_IDRRef = id1 and _LineNo1386 = lineno1
===========

Можно это как-то адаптировать для моей ситуации?
19 napagokc
 
06.03.17
15:48
(17) А не возникнет проблем из-за того, что это предопределенные элементы?
20 Ёпрст
 
06.03.17
15:50
(19) нет
21 Ёпрст
 
06.03.17
15:50
у тебя же базы на рибе ?
22 napagokc
 
06.03.17
16:11
пока удалил строчку из базы через

delete from _Reference73
where _Description = 'Праздники без повышенной оплаты'

Попробую сейчас провести обмен. Копию базы, разумеется, предварительно сделал.