8.х Почему срабатывают транзакционные блокировки?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем skv_79, 3 апр 2017.

  1. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Видимо я что-то не понимаю, почему срабатывают транзакционные блокировки если я установил режим блокировок управляемые и нигде не описывал блокировки вообще. По идее в этом случае блокировки не накладываются? А по факту они существуют.
    Блокировки.jpg
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.592
    Симпатии:
    876
    Баллы:
    204
    Кто вам сказал, что блокировки не накладываются? :)
    Они очень даже накладываются.....
  3. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    912
    Симпатии:
    152
    Баллы:
    104
    А для объекта установлен управляемый режим?
    Обычно перед записью задачи пытаются блокировать её.
    Код:
    Попытка
    ЗаблокироватьДанныеДляРедактирования(ЗадачаОбъект);
    Исключение
    //...
    КонецПопытки
    А вообще, странная задача - выполнять интерактивное завершение задачи пользователя.
  4. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Хорошо, буду читать про блокировки... мне почему-то казалось, что если управляемый установить, то они не накладываются в клиент-серверном варианте. Вот только после того, как опишу пространства имен блокировки, и только после того как напишу Заблокировать() все должно блокироваться... и тогда уже такие сообщения появляться...
    Да, для всех объектов конфигурации отдельно тоже установил управляемый режим. Насколько я понимаю, сейчас интерактивно выполнить задачу можно только программно, когда выполняется задача пользователем то такой обработчик не вызывается.
  5. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    912
    Симпатии:
    152
    Баллы:
    104
    Понятно...ничего не понятно :)
    Может задача стоит в другом? При выполнении задачи бизнес процесса "Согласование разрешения на оплату произвольного" нужно что-то выполнить? Зачем имитировать интерактивное выполнение задачи?
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.592
    Симпатии:
    876
    Баллы:
    204
    Транзакционные блокировки работают ВСЕГДА, иначе в БД случилась бы "каша" из данных.
    Управляемые блокировки нужны, чтобы управлять количеством одновременно заблокированных данных.
    skv_79 нравится это.
  7. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Написано что там ссылочные данные указываются для блокировки... Если укажу, то при ошибке блокировки можно эту ошибку обработать, правильно?
  8. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    912
    Симпатии:
    152
    Баллы:
    104
    Вроде да, вот пример:
    2017-04-04_11-01-24.png
    Код:
    Процедура ОбработкаРезультатовСогласованияОбработка(ТочкаМаршрутаБизнесПроцесса)
       
        УстановитьПривилегированныйРежим(Истина);
       
        ЗаявкаОбъект = Заявка.ПолучитьОбъект();
       
        Если ЗаявкаОбъект.Состояние <> Перечисления.СостоянияЗаявокНаРазмещение.Согласована Тогда
            Попытка
                ЗаблокироватьДанныеДляРедактирования(Заявка);
            Исключение
                ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                    НСтр("ru = 'В ходе обработки результатов согласования не удалось заблокировать %1. %2'"),
                    Строка(Заявка),
                    КраткоеПредставлениеОшибки(ИнформацияОбОшибке())
                );
                ВызватьИсключение ТекстСообщения;
            КонецПопытки;
           
            ЗаявкаОбъект.Состояние = Перечисления.СостоянияЗаявокНаРазмещение.Согласована;
           
            Попытка
                ЗаявкаОбъект.Записать();
                РазблокироватьДанныеДляРедактирования(Заявка);
            Исключение
                РазблокироватьДанныеДляРедактирования(Заявка);
               
                ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                    НСтр("ru = 'Не удалось записать %1. %2'"),
                    Строка(Заявка),
                    КраткоеПредставлениеОшибки(ИнформацияОбОшибке())
                );
                ВызватьИсключение ТекстСообщения;
            КонецПопытки
        КонецЕсли;
       
        УстановитьПривилегированныйРежим(Ложь);
       
    КонецПроцедуры // ОбработкаРезультатовСогласованияОбработка()
    
    skv_79 нравится это.
  9. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Спасибо большое! А в %1 и %2 содержится информация об ошибках при исключительной ситуации?
  10. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    912
    Симпатии:
    152
    Баллы:
    104
    Код:
    // Подставляет параметры в строку. Максимально возможное число параметров - 9.
    // Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
    //
    // Параметры:
    //  СтрокаПодстановки  - Строка - шаблон строки с параметрами (вхождениями вида "%ИмяПараметра");
    //  Параметр<n>        - Строка - подставляемый параметр.
    //
    // Возвращаемое значение:
    //  Строка   - текстовая строка с подставленными параметрами.
    //
    // Пример:
    //  ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк".
    //
    // Примечание:
    //  В случаях, когда число используемых параметров в строке совпадает с числом переданных для подстановки параметров,
    //  рекомендуется использовать функцию платформы СтрШаблон.
    Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
        Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
        Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
        Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
       
        ИспользоватьАльтернативныйАлгоритм =
            СтрНайти(Параметр1, "%")
            Или СтрНайти(Параметр2, "%")
            Или СтрНайти(Параметр3, "%")
            Или СтрНайти(Параметр4, "%")
            Или СтрНайти(Параметр5, "%")
            Или СтрНайти(Параметр6, "%")
            Или СтрНайти(Параметр7, "%")
            Или СтрНайти(Параметр8, "%")
            Или СтрНайти(Параметр9, "%");
           
        Если ИспользоватьАльтернативныйАлгоритм Тогда
            СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1,
                Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
        Иначе
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8);
            СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9);
        КонецЕсли;
       
        Возврат СтрокаПодстановки;
    КонецФункции
    skv_79 нравится это.
  11. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Спасибо, красиво придумано.
  12. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.374
    Симпатии:
    150
    Баллы:
    104
    Код:
    ЗаблокироватьДанныеДляРедактирования(ЗадачаОбъект);
    Мягко говоря это совсем не то, что вам нужно :)
    Эта штука не даст редактировать эту задачу в форме в других пользовательских сеансах, а если она уже где-то редактируется, то вывалит исключение.
    При этом она вообще не будет устанавливать управляемую блокировку и любой другой сеанс сможет записать все что нужно.

    Выполнение задачи бизнес-процесса происходит в транзакции. Соответственно любая запись даст исключительную блокировку на те данные, которые записаны, а также на некоторое количество связанных данных, даже если вы не устанавливали управляемую блокировку руками.
  13. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    В моем случае блокировка появилась во время записи в регистр сведений через МенеджерЗаписи во время транзакции. При чем это новая запись, ранее ее в регистре не было с таким ключом.
  14. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.374
    Симпатии:
    150
    Баллы:
    104
    С какой транзакцией происходит конфликт можно посмотреть в технологическом журнале. Настройте его на TLOCK и TTIMEOUT и увидите кто еще лезет и по каким измерениям блокирует регистр.
    skv_79 нравится это.
  15. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Спасибо. Получается у меня в транзакции есть запись в регистре сведений, т.к. блокировки управляемые и не описано пространство блокировки по каким полям блокировать, то накладывается блокировка на всю таблицу.
  16. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.374
    Симпатии:
    150
    Баллы:
    104
    нет, блокировка при записи менеджером записи ставится только на значения измерений записи. если там набор записей без отборов, тогда да - на весь регистр.
  17. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Там менеджер, при чем по одному измерению с одним значением в РС исключена запись параллельно у двух пользователей. Буду смотреть ТЖ, просто ошибка плавающая.
  18. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Недавно отловил блокировку:
    Код:
    03:33.576000-0,TTIMEOUT,5,process=rphost,p:processName=SO_DB,t:clientID=255,t:applicationName=1CV8C,t:computerName=1C-APP,t:connectID=79,SessionID=25,Usr=Пользователь,AppID=1CV8C,WaitConnections=90,Context='Форма.Вызов : Документ.РазрешениеНаОплатуПроизвольное.Форма.ФормаЭлемента.Модуль.СогласенНаСервере
    Документ.РазрешениеНаОплатуПроизвольное.Форма.ФормаЭлемента.Форма : 40 : ЗадачаОбъект.ВыполнитьЗадачуИнтерактивно();
    
    Тут написано все то же что платформа показывает при ошибке, все та же ошибка в ЗадачеОбъекте при методе ВыполнитьЗадачуИнтерактивно(). Даже знаю по какой причине возникает ошибка: у меня в транзакции этого метода пишется запись только в один РС через МенеджерЗаписи. Но мне по любому нужно туда писать инфу в этот служебный РС. Поэтому наложу ограничение в пространство блокировки, сейчас у меня просто не описываются блокировки по этой таблице РС, поэтому блокируется она вся, и параллельно другие пользователи тоже пишут туда, наверно из-за этого и ошибка...
    --- Объединение сообщений, 19 май 2017 ---
    если так, то тогда вообще нету в коде ничего что может повлиять на выполнение транзакции...
  19. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.374
    Симпатии:
    150
    Баллы:
    104
    В этой записи ТЖ есть одна штука, которую не показывает ошибка
    WaitConnections=90
    Это номер сеанса, который заблокировал запись

    Дальше по ТЖ смотрите что это за сеанс и что он в это время делал
    skv_79 нравится это.
  20. TopicStarter Overlay
    skv_79
    Offline

    skv_79 Опытный в 1С

    Регистрация:
    10 июл 2013
    Сообщения:
    336
    Симпатии:
    4
    Баллы:
    29
    Понятно, спасибо.

Поделиться этой страницей