Второй способ как исправить ошибку MS SQL Server «Cannot insert duplicate key row in object with unique index» при проведении документов 1С:Предприятия 8.2.


Первый способ
решения этой ошибки удобен, если есть возможность выгрузить базу в файловый вариант.

При проведении и при удалении проведения документа «Поступление товаров и услуг» появлялись ошибки:


Попытка вставки неуникального значения в уникальный индекс:
Microsoft OLE DB Provider for SQL Server:
Cannot insert duplicate key row in object ‘dbo._AccRgAT15390’

и


Попытка вставки неуникального значения в уникальный индекс:
Microsoft OLE DB Provider for SQL Server:
Cannot insert duplicate key row in object ‘_AccRgAT25391’

Таблицы базы ‘dbo._AccRgAT15390’ и ‘_AccRgAT25391’ хранят сведения об остатках.

Ни проводить, ни снимать с проведения не давал, писал эти ошибки.
Пришлось зайти в среду «Microsoft SQL Server Management Studio» написать запрос
на удаление записей в таблицах:


DELETE FROM [base8.2].[dbo].[_AccRgAT15390]
DELETE FROM [base8.2].[dbo].[_AccRgAT25391]
GO

При отмене проведения первого документа всё прошло успешно.
Но следующие документы не давал проводить, та же ошибка.

Пришлось последовательно отменять проведение, затем выполнять запрос на удаление
и так каждый документ.

Надоело всё это, поэтому написал обработку:

Процедура КнопкаВыполнитьНажатие(Кнопка)

SQLConnection = Новый COMObject(«ADODB.Connection»);
SQLConnection.Open(«Provider=SQLOLEDB.1;Password=1234567;
Persist Security Info=True;User ID=sa;Initial Catalog=base8.2;
Data Source=SERVER1\SQLEXPRESS»
);
RS = Новый COMObject(«ADODB.Recordset»);

Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| Поступление.Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Поступление
|ГДЕ
| Поступление.Дата МЕЖДУ &НачДата И &КонДата
| И Поступление.ПометкаУдаления = &ПометкаУдаления»;

Запрос.УстановитьПараметр(«НачДата», НачалоДня(НачДата));
Запрос.УстановитьПараметр(«КонДата», КонецДня(КонДата));
Запрос.УстановитьПараметр(«ПометкаУдаления», Ложь);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
RS.Open(«DELETE from dbo._AccRgAT15390»,SQLConnection,2,3);
RS.Open(«DELETE from dbo._AccRgAT25391»,SQLConnection,2,3);
Попытка
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Сообщить(«Отмена проведения документа: »
+ Строка(Объект), СтатусСообщения.Обычное);
Исключение
Сообщить(«Отмена проведения документа: »
+ Строка(Объект) + » не прошла!»,
СтатусСообщения.Внимание)
КонецПопытки;
КонецЦикла;

SQLConnection.Close();

КонецПроцедуры

Затем пересчитал итоги по всем регистрам.

Этот блог читают уже более 3000 человек
- читай и ТЫ!
0 ответы

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *