Книга знаний

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

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

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

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


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

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

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

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

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

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