Имя: Пароль:
1C
1С v8
Ошибка в базе. Ошибка в таблице Config.
0 FoXSkr
 
16.08.12
07:57
Доброго времени суток.
На одной базе выявилась ошибка, при открытии конфигурации в конфигураторе. Выходит ошибка «Нарушена целостность в структуре конфигурации» и две кнопки «Завершить работу, Перезапустить».
В остальном, база работает нормально – предприятие запускается, база работает, ошибок не выдает. Тестирование и исправление не помогает, chdbfl тоже ничего не находит. Выгрузка информационной базы тоже проходит без проблем, и дальнейшая ее загрузка, но это проблему не решает.
При попытки загрузить эту базу на SQL, SQL мне сообщает в чем проблема, что в таблице Config есть не уникальные индексируемые поля (уникальные идентификаторы), и даже указал какое именно значение не уникально.
Открыл базу с помощью Tool_1CD, и убедился что действительно в этой таблице есть два одинаковых значения.
А вот как исправить это поле я никак не могу найти инфы. А самое главное как правильно исправить что бы ничего не слетело . И неплохо было бы вообще знать что находится в этой таблицы.
1 shuhard
 
16.08.12
08:00
(0)[И неплохо было бы вообще знать что находится в этой таблицы]
тебя точно будет очень плохо,
в Config находится конфигурация
2 Живой Ископаемый
 
16.08.12
08:00
в этой таблицЫ находится конфигурация.. Можно сохранить ее где-то в сторонке и удалить одну из дублирующих записей средствами СКЛ
3 FoXSkr
 
16.08.12
08:03
(2) А как мне подгрузить ее в SQL, стандартными средствами она не загружается.
4 shuhard
 
16.08.12
08:12
(3) начни с простого
извлеки конфигурацию (cf) c помощью 1CD Tools и загрузи конфигурацию в пустую базу
после чего через xml перекинь в неё данные
5 Живой Ископаемый
 
16.08.12
08:14
2(3) а... так у тебя база файловая...
тогда наверное уже все
6 andrewks
 
16.08.12
08:17
а в ConfigSave всё пучком? так, может, обновить конфу БД на редактируемую?
7 shuhard
 
16.08.12
08:19
(6) + 1
может командную строку получиться
8 FoXSkr
 
16.08.12
08:32
(4) СПС. Да этот вариант я храню в запасе, если ничего не получится, то так и сделаю. Но проблема интересная, не часто с ней сталкиваюсь, хотелось бы добить другим способом.

(6) Точно не знаю. На эту таблицу SQL не ругался. Из доступных действий в конфигураторе у меня есть "Открыть конфигурацию" - приводит к ошибке. "Сохранить конфигурацию БД в файл", "Сравнить конфигурацию", тоже приводит к ошибке. Или как то еще можно?
9 FoXSkr
 
16.08.12
08:34
(4) А интересно я могу таблицы SQL заполнять через xml?
10 zva
 
16.08.12
08:44
(0) Конфигурация измененная?
Бэкап с живой конфой есть?
11 МихаилМ
 
16.08.12
08:47
v8: v8: Загрузка в SQL базу.

понять какой объект метаданных можно просмотрев запись через  Tool_1CD.

спасибо авторам Tool_1CD и DT:менеджер
12 FoXSkr
 
16.08.12
08:51
(10)Сейчас конфа уже стандартная. Бекап есть перед последним обновлением (от мая месяца)
13 Пеппи
 
16.08.12
08:53
(12) часто же вы бекапы делаете )
14 zva
 
16.08.12
08:54
(12) ну делайте чистую базу со стандартной конфой и перегружайте через xml
15 dmpl
 
16.08.12
08:59
(13) А тут частота не поможет. Если 3 месяца не замечали ошибку - то во всех бэкапах эта ошибка уже будет, и они, по сути, бесполезны.
16 FoXSkr
 
16.08.12
08:59
(13) Мне то все равно, база не моя, я перед тем как прикосаться к базе всегда делаю бекап, в последний раз это было в мае, как то давно предлагал Хранитель, они чето зажмотились, так что пускай пожимают свои плоды. Но смыл не в этом, даже бы если я бы бекап делал каждый день, их бы это все равно не спасло, потому что база то работает, проблема случилось при последнем обновлении (это было в мае), а вот следующее обновление я уже не могу сдделать (конфа не открывается).
17 dmpl
 
16.08.12
09:01
(0) Запуск с ключом /CheckConfig -ConfigLogIntegrity не помогает?
18 FoXSkr
 
16.08.12
09:30
(11) В теме, ссылку которой вы дали, вы предлогали отключить индекс в ddl тригере. Подскажите пожалуйста более подробнее как это сделать..
19 МихаилМ
 
16.08.12
10:04
(18)
код за Вас писать не буду.

пошагово расскажу.

для восстановления работоспособности
нужно
1) сделать возможным закрузить таблицу config
(с помощью отсключения(удаления) индекса при создании если версия скл >=2005) )

2) удалить запись с задвоенным PK или исправить PK на уникальный
3) восстановить индекс.

1) как создать триггер читайте на сайте MS

если создаетсяф таблица такая-то
то создать такуюже но без PK

те тупо вставить в текст триггера проверку +  текст создания таблицы без PK

2) понятно


3) создать индекс

скрипт создания таблицы и индекса можно сгенерировать в SSMS

из таблицы config, которую создаст 1с при загрузке из dt файла и прервется на ошибке.


потернируйтесь на пустой базе  создавая config исполнением скрипта, без загрузки из 1с.
20 FoXSkr
 
16.08.12
15:44
(19) Чето я походу сдулся с этими триггерами. Не могу понять какое событие мне надо отловить (так как вы написали, кажется будет очень сложно для человека каторый может писать только примитивные запросы SQL). Я думал отловить событие при добавление строки, проверить содержимое колонки и (для начала отказаться от добавления), но и это оказалась сложной задачей для меня :( .
В той же теме вы советовали использовать DtManager но она не хочет работать с 8.2 плаформой. А есть другая какая нибудь утилитка?
21 awa15
 
16.08.12
16:40
(0) Если записи в CONFIG задвоились, надо удалить лишнюю запись (одну из двух). Чтобы удалить запись, надо:
1. Сделать копию файла 1CD!
2. В Tool_1CD включить в настройках отображение смещений в файле.
3. Посмотреть адрес (смещение) лишней записи.
4. Шестнадцатиричным редактором изменить по этому адресу один байт с 00 на 01.
5. Открыть базу в конфигураторе. Открыть ТиИ.
6. Поставить галочку (только одну!) на "Реиндексация таблиц". Выполнить ТиИ.
7. Поставить галочку (только одну!) на "Сжатие таблиц". Выполнить ТиИ.

После этого можно пробовать открыть конфигурацию, выгружать в dt и т.д.
Если это ошибка единственная, должно помочь, только, как правило, ошибки в одиночку не ходят.
22 МихаилМ
 
16.08.12
17:43
(20)

-- создание ddl триггера
--- персоздания таблицы config без PK

USE <ВАША_БАЗА>;
GO
IF EXISTS (SELECT * FROM sys.triggers
   WHERE parent_class = 0 AND name = 'Config_no_PK')
DROP TRIGGER Config_no_PK
ON DATABASE ;
GO
CREATE TRIGGER Config_no_PK
ON DATABASE
FOR CREATE_TABLE
AS
DECLARE @tablename nvarchar(100)  
DECLARE @EventData XML
SET @EventData = EventData()
 
  --PRINT 'CREATE TABLE Issued.'
  SET  @tablename =  @EventData.value('data(/EVENT_INSTANCE/ObjectName) [1] ','VARCHAR(50)'  )
  PRINT  @tablename;
 
  IF @tablename = 'Config'
 
  BEGIN
 
  ROLLBACK

  CREATE TABLE [dbo].[Config](
   [FileName] [nvarchar](128) NOT NULL,
   [Creation] [datetime] NOT NULL,
   [Modified] [datetime] NOT NULL,
   [Attributes] [smallint] NOT NULL,
   [DataSize] [int] NOT NULL,
   [BinaryData] [image] NOT NULL )
   END


-- удаление триггера

/*

DROP TRIGGER Config_no_PK
ON DATABASE ;

*/
-- восстановление PK ( индекса )

/*
ALTER TABLE [dbo].[Config] ADD PRIMARY KEY CLUSTERED
(
   [FileName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

*/
23 FoXSkr
 
16.08.12
21:07
(22) Спасибо ограменное.
24 FoXSkr
 
18.08.12
10:23
(21), (22) К сожалению ничего не помогло. И в первом и во втором варианте результат один и тот же - "Конфигурация повреждена", только теперь дело не в уникальности строки.
25 МихаилМ
 
18.08.12
10:37
(24)
попробуйте удалить один из дублей или оба

перед удалением сохраните дубли в отдельную таблицу
26 МихаилМ
 
18.08.12
11:06
попробуйте с помощью ms sql profiler
отследить на какой записи в Config
происходит ошибка


и перенесите её в копию таблицы.
а в конфиг удалите
27 FoXSkr
 
20.08.12
15:41
(25), (26) Спасибо огромное, на досуге обязательно вернусь к этой проблеме. Но сейчас сроки уже поджимают, вопрос решил востановлением резервной копии и перенос данных до текущего дня с помощью обмена xml (P.S. Хорошо хоть она за эти 3 месяца не сильно много в прошлых годах ковырялась).