8.х Пример из конфы axelot 3.1 по работе с блокировками обсуждение

Тема в разделе "Другие решения", создана пользователем Tverd, 20 июн 2019.

  1. TopicStarter Overlay
    Tverd
    Offline

    Tverd Опытный в 1С

    Регистрация:
    24 окт 2007
    Сообщения:
    58
    Симпатии:
    1
    Баллы:
    29
    Всем добрый день.
    Занимаюсь определенным проектом в 1С axelot 3.1, Платформа 8.3, блокировки управляемые.

    В процессе работы наткнулся на любопытный для меня кусок кода.

    1) Есть функция которая выполняет "проведение строки" регистра сведений, по сути просто запись строки в РС, при этом может выполняться запись и в другие регистры сведений.

    2) В функцию передаются параметры, по которым делаются проверки запросом и затем если все ОК открывается транзакция, накладываются блокировки и производится запись в РС.

    3) Перед началом явно объявленной транзакции написан код:
    Код:
    Пока Истина Цикл
    4)В теле цикла никакие переданные в функцию или полученные из запроса параметры не меняются, после открытия транзацкции в попытке делаются проверки и запись рс

    5)В конце если не произошло ошибок, транзакция фиксируется и цикл останавливается оператором Прервать.

    6)В случае Исключения, идет проверка на то является ли эта ошибка, ошибкой блокировки, если НЕТ то цикл прерывается и выводится ОписаниеОшибки, Если ДА, то цикл не прерывается.


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

    Внимание вопрос, зачем так сделали? Есть ли в этом потаенный смысл который я не догоняю?
    Всем спасибо за внимание и высказанные мнения!
    Последнее редактирование: 20 июн 2019
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204
    Каким образом проверяется, что это именно конфликт блокировок? :)
    Ка по мне, люди не понимали, что делают, в процессе написания кода.
  3. TopicStarter Overlay
    Tverd
    Offline

    Tverd Опытный в 1С

    Регистрация:
    24 окт 2007
    Сообщения:
    58
    Симпатии:
    1
    Баллы:
    29
    Думаю никакого супер-секретного проприетарного кода я не открою этим листингом :)
    Код:
    Если Найти(стрОписаниеОшибки, "HRESULT=80004005") Или Найти(стрОписаниеОшибки, "HRESULT=80040E31") // MS SQL Server
         Или Найти(стрОписаниеОшибки, "Превышено максимальное время ожидания предоставления блокировки") Или Найти(стрОписаниеОшибки, "Неустранимый конфликт блокировок") // Управляемые блокировки
         Тогда
         Задержка = СлучайноеЧисло(1000);
         
         // Пустой Цикл для задержки.
         Для Индекс = 0 По Задержка Цикл
           
         КонецЦикла;
         
         Возврат Истина;
       Иначе
         Возврат Ложь;
       КонецЕсли;