Второй способ как исправить ошибку 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 не будет опубликован. Обязательные поля помечены *