v8: Запись объекта в условиях блокировок SQL Ключевые слова: SQL,транзакция,блокировка,документ
Суть - пытаемся записать объект. Если объект не записался, смотрим в чем дело - если это ошибка SQL, ждем некоторое время и пробуем записать опять.
Думаю, можно еще доработать, чтобы время ожидания увеличивалось на каждом проходе.
Параметры:
* Задержка - задержка в секундах
* Протяжек - 0, если пытаться записывать бесконечно, или количество протяжек.
//Задержка на Секунд секунд
Функция п_Задержка(Секунд) Экспорт
Перем Начало, Конец;
Начало=ТекущаяДата();
Конец=Начало+Секунд;
Пока ТекущаяДата()<=Конец Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
КонецФункции
Функция п_ЗаписатьОбъектSQL(Объект, РежимЗаписи=Неопределено, РежимПроведения=Неопределено, Задержка=10, Протяжек=0)
Перем Протяжка, ОписаниеОшибки;
Протяжка=1;
Пока (истина) Цикл
Попытка
Если РежимЗаписи=Неопределено И РежимПроведения=Неопределено Тогда
Объект.Записать();
ИначеЕсли РежимПроведения=Неопределено Тогда
Объект.Записать(РежимЗаписи);
Иначе
Объект.Записать(РежимЗаписи, РежимПроведения);
КонецЕсли;
Возврат Истина;
Исключение
ОписаниеОшибки=ОписаниеОшибки();
ОшибкаПрефикс="Microsoft OLE DB Provider for SQL Server:";
Если Найти(ОписаниеОшибки,ОшибкаПрефикс)=0 Тогда
Сообщить(ОписаниеОшибки);
Возврат ложь;
Иначе
п_Задержка(Задержка); //Задержимся и продолжим запись...
Если Протяжек<>0 И Протяжка>=Протяжек Тогда
Сообщить("Запись объекта при блокировках SQL не удалась ("+Протяжка+") :"+Объект+" "+СтрЗаменить(ОписаниеОшибки, ОшибкаПрефикс,""));
Возврат ложь;
КонецЕсли;
Протяжка=Протяжка+1;
Состояние(Лев("Блокировки SQL ("+Протяжка+") :"+Объект+" "+СтрЗаменить(ОписаниеОшибки, ОшибкаПрефикс,""),180)); //Состояние обрезается, чтоб помещаться на экран
КонецЕсли;
КонецПопытки;
КонецЦикла;
КонецФункции |