Книга знаний

1С:Предприятие / v8 / Приемы программирования

v8: Запись объекта в условиях блокировок SQL

Маленькая функция, позволяющая бороться с конфликтами при записи объекта в базу данных путем ожидания.Автор статьи:
Последняя редакция №1 от 19.04.06
URL: http://kb.mista.ru/article.php?id=164

Ключевые слова: SQL,транзакция,блокировка,документ


Суть - пытаемся записать объект. Если объект не записался, смотрим в чем дело - если это ошибка SQL, ждем некоторое время и пробуем записать опять.
Думаю, можно еще доработать, чтобы время ожидания увеличивалось на каждом проходе.

Параметры:
* Задержка - задержка в секундах
* Протяжек - 0, если пытаться записывать бесконечно, или количество протяжек.

[1c]

//Задержка на Секунд секунд
Функция п_Задержка(Секунд) Экспорт
   Перем Начало, Конец;
   Начало=ТекущаяДата();
   Конец=Начало+Секунд;
   Пока ТекущаяДата()<=Конец Цикл
       ОбработкаПрерыванияПользователя();
   КонецЦикла;
КонецФункции

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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика