Просмотр заблокированных строк в 1С






Ввиду своей деятельности, мне часто приходится рассказывать про различные аспекты оптимизации и в том числе про блокировки.
Очень часто слушатели задают следующие вопросы:
Как посмотреть в реальном времени, какие именно данные сейчас заблокированы?
Как понять, что сейчас заблокировано в терминах 1С?
Если гранулярность блокировки страница, как увидеть, какие данные в ней находятся?

Раньше приходилось отвечать, что инструмента, который показывает все вышеописанное, сейчас просто нет. Но потом мне это надоело, и я решил сделать собственный инструмент, который позволяет ответить на все вышеописанные вопросы.

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

Инструмент не является конкурентом для ЦУП или облачного сервиса анализа блокировок, он предназначен в первую очередь для обучения и ознакомления с работой блокировок, а не для анализа ожиданий на блокировках.

Все инструменты на текущий момент показывают только информацию постфактум, когда ожидание уже случилось. Данный инструмент показывает ситуацию на текущий момент.

В некоторых случаях обработка может использоваться и для задач по оптимизации. Например, при переводе конфигурации на упр. режим, можно будет легко и быстро посмотреть, на какие именно записи была наложена управляемая блокировка. 

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

Сразу скажу что обработка работает не быстро, но такая цель и не ставилась. При этом следует учитывать, что работа возможна только с СУБД MS SQL Server и только в управляемом приложении.

Если ожидание идет на сервере СУБД, тогда можно увидеть, на каком именно ресурсе идет ожидание, в колонке статус будет значение «Ожидание». Для блокировок 1С посмотреть, на чем идет ожидание, не получится, т.к. сервер 1С просто не пишет эту информацию в логи в момент ожидания, она туда попадает только после того, как ожидание завершится.

Для использования обработки необходимо сначала заполнить настройки.

Обработку надо обязательно открывать в той же базе, блокировки которой вы хотите посмотреть.

Если вы хотите видеть информацию по управляемым блокировкам, тогда необходимо включить флаг «Отображать блокировки 1С». Следует учитывать, что этот функционал является тестовым, возможны ошибки при отображении, когда пользователей несколько, к тому же блокировки будут отображаться только если в кластере один сервер. 

Через 60 сек. будет включен технологический журнал, и данные об установленных управляемых блокировках начнут собираться. 

Для отображения данных необходимо нажать «Обновить».

В данном случае видно, что администратором наложены как блокировки СУБД, так и блокировки 1С (выделены жирным). 

Если блокировка СУБД наложена на кластерный индекс, тогда можно посмотреть, какие именно записи заблокированы, сделав двойной клик. При этом в таблице ниже будут отображены все заблокированные записи в терминах 1С. Например, здесь видно, что в таблице итогов регистра ТоварныеЗапасы заблокирована одна строка с итогом за октябрь и одна строка с текущими итогами.

Если блокировка СУБД наложена на некластреный индекс, тогда, к сожалению, заблокированные записи посмотреть не получится.

Если это блокировка 1С, тогда независимо от пространства блокировок можно будет всегда посмотреть, что именно заблокировано.

При желании можно включить отображение служебных блокировок СУБД (флаг «Отображать блокировки намерения и стабильности схемы»). Мне сложно представить, кому и зачем на практике может понадобиться этот флаг, разве что таким же маньякам, как я 🙂

Хотя, возможно, кто-то будет к 1С:Эксперт готовиться и захочет «потрогать руками» служебные блокировки СУБД, а то про них говорят и спрашивают, но никто не показывает.

На данном рисунке ясно видно блокировку намерения на страницу и таблицу.

Если в момент нажатия кнопки Обновить в базе было ожидание на блокировке, то это будет отображено в верхней таблице.

Данный рисунок показывает, что продавец ждет администратора, при этом можно поглядеть установленные блокировки обоих пользователей.

Если вы используете управляемый режим блокировок, то не удивляйтесь, что на уровне СУБД обработка почти всегда будет показывать только X блокировки. Просто S блокировки будут сниматься сразу после чтения, не дожидаясь конца транзакции, поэтому верятность их поймать крайне низка. 

В автоматическом режиме блокировок работать с обработкой интереснее, например, можно поставить точку останова после Запрос.Выполнить() в транзакции и посмотреть, какие именно записи заблокировал этот запрос. Если запрос заблокировал лишнее (то что не подходит под его условия), вы сразу это увидите.

Надеюсь, что данная обработка поможет вам лучше понять работу блокировок на практике и сподвигнет на самостоятельные эксперименты в этой области. Особенно это будет полезно при подготовке к экзамену 1С:Эксперт.

54 Comments

  1. WellMaster

    Просто пытаюсь открыть обработку:

    {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1033,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтрокеSQL)
    Возврат <<?>>ПолучитьТаблицуДанныхПоСтрокеSQL(СтруктураПараметров);
    {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1035,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтраницеSQL)
    Возврат <<?>>ПолучитьТаблицуДанныхПоСтраницеSQL(СтруктураПараметров);
    {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1603,17)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуЛоговТЖ)
    ТаблицаЛогов = <<?>>ПолучитьТаблицуЛоговТЖ();
    
    Reply
  2. DenisCh

    Обратись к автору обработки

    Reply
  3. Andreynikus

    (1) WellMaster, обработка написана только под управляемое приложение. При запуске в обычном приложении будет описанная вами ошибка.

    Reply
  4. starik-2005

    Как я понял, обработка показывает текущие блокировки СУБД (MS SQL) и уже завершившиеся блокировки 1С? Для первого, в принципе, можно в менеджмент студио правой кнопкой на базе и в отчетах найти соответствующий отчет по блокировкам. Я так понимаю, что основной плюс — это получение имени объекта в 1С?

    Reply
  5. Andreynikus

    (4) starik-2005,

    > Как я понял, обработка показывает текущие блокировки СУБД (MS SQL)

    Да, именно так.

    > уже завершившиеся блокировки 1С

    Нет, показываются установленные но не завершившиеся блокировки 1С

    > Для первого, в принципе, можно в менеджмент студио правой кнопкой на базе и в отчетах найти соответствующий отчет по блокировкам.

    Если имеется ввиду отчет «Все блокирующие транзакции» то это не так. В отчете вы увидите только то, что одна транзакция блокирует другую. На какие строки наложена блокировка там не указано, на какой ресурс тоже не указано, даже тип блокировки не указан. На практике этот отчет почти бесполезен.

    Reply
  6. ture

    (0) 1С держит все блокировки на сервере СУБД?

    Заблокировать() и если пользователь форму открывает и начинает редактировать туда же?

    Reply
  7. ture

    Выбор эксперта на инфостарте стал не объективным.

    Reply
  8. Andreynikus

    (6)

    Нет конечно, блокировки 1С находятся на сервере приложений, именно их обработка и показывает если включить флаг.

    Reply
  9. Andreynikus

    (6)

    Блокировки 1С на сервере приложений, блокировки СУБД на сервере СУБД. Обработка может показывать и то и другое.

    Reply
  10. Andreynikus

    (7)

    Напишите поподробнее, что вы имеете ввиду?

    Reply
  11. it@medipal-onko.ru

    Можно ли здесь увидеть блокировки Регламентных заданий сервера 1С?

    Reply
  12. Andreynikus

    (11)

    Обработка показывает транзакционные блокировки 1С и СУБД, при этом не важно кто их наложил, пользователь или регламентное задание.

    Reply
  13. it@medipal-onko.ru

    жаль, что нельзя увидеть какой пользователь заблокировал объекты…

    Reply
  14. Andreynikus

    (13)

    Обработка показывает пользователей которые блокируют объекты, посмотрите на скрин.

    Reply
  15. it@medipal-onko.ru

    (14) именно так. я вижу список практически всех своих пользователей (около 150) и все заблокированные объекты. Но понять, кто и что заблокировал невозможно.

    Reply
  16. Andreynikus

    (15)

    Эта обработка в первую очередь для тестовых баз, для анализа что именно и в каких случаях блокируется, а не для расследования проблем в боевых базах.

    Вы выделяете пользователя, внизу должны отразится данные о тех объектах которые он заблокировал.

    Если пользователь Б отображается вложенным в пользователя А, это значит что пользователь А заблокировал пользователя Б. На крайнем скриншоте видно что Администратор заблокировал пользователя Продовец.

    Reply
  17. rossoxa

    Добрый день.Подскажите пожалуйста. При попытке включить блокировки 1С получаю ошибку

    Reply
  18. Andreynikus

    (17)

    Как бы глупо это не звучало, но проверьте что у пользователя под которым запущена служба 1С есть доступ в этот каталог conf на чтение и запись. Если у вас rphost запускается под своим пользователем, то проверьте под ним.

    Reply
  19. EmpireSer

    Ошибка в обработке:

    Логина и пароля от SQL может не быть, так как MS SQL может работать по доменной авторизации.

    Из-за этого вот тут тест проходит успешно

     // тестируем подключение sql
    СоединениеSQL = ОбработкаОбъект.СоздатьВнешнееПодключение(ПараметрыПодключения,10);
    Если СоединениеSQL <> Неопределено Тогда
    Сообщить(«Подключение к серверу СУБД прошло успешно», СтатусСообщения.Информация);
    КонецЕсли;

    А тут получаем проблему

     Если НЕ НастройкиЗаполнены() Тогда
    ОткрытьФормуМодально(«ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.Форма.ФормаНастроек»);
    Возврат;
    КонецЕсли;
    Reply
  20. Andreynikus

    (19)

    Сейчас доменная авторизация в обработке не предусмотрена. Пока можно специально завести на сервере СУБД учетную запись и подключаться под ней.

    Reply
  21. nvv1970

    (5) информация по блокировкам 1с получается из ТЖ или с сервера приложения?

    Меня самого часто просят посмотреть «что и кто прямо сейчас блокирует»… Мне представляется более удобным и качественным расследовать инциденты по истории блокировок в ТЖ, т.е. с некоторой статистикой по блокировкам за интервал времени. А сию секундный срез информации обладает лишь частичной пользой. Скорее это инструмент для выявления и «ликвидации» виновника (завершения сеанса)

    Reply
  22. Andreynikus

    (21)

    Информация об управляемых транзакционных блокировках 1С берется из ТЖ т.к. сейчас это единственный источник такой информации.

    Это инструмент скорее для изучения блокировок, чем для реального анализа проблем, я об этом писал в статье.

    Reply
  23. user665952_a.karuna

    хорошая обработка, а под оракл когда-нибудь такая появится? или может уже есть?

    Reply
  24. Andreynikus

    (23)

    Может и есть, я не в курсе, хотя там СУБД версионник и как там получать список текущих блокировок не очень понятно.

    В любом случае можно доработать обработку таким образом, что бы она фиксировала только управляемые блокировки, они не зависят от СУБД.

    Reply
  25. Novicad

    настройки кластера 1С, не проходит авторизация. Имя и пароль верные, админа 1С конфигурации?

    Reply
  26. Novicad

    Всё понял, изивинте

    Reply
  27. harisov_r

    (25) эх, Александр догадался, а сюда не написал — у меня тоже не проходило соединение с Кластером, пока не наткнулся на фразу к описанию в другой обработке: если кластер без ограничения доступа, то следует писать так: Агент.Authenticate(Кластер, , );

    и я понял, что на моем ноутбуке при установке я не делал пароль и логин для администратора кластера, поэтому имя и пароль администратора кластера надо оставить пустыми :о)

    Reply
  28. Xershi

    При тестировании подключения пишет, что нужно проделать настройку по статье: https://infostart.ru/public/197627/

    Сервер 1С 64-битный.

    Выполнил настройку, но сервер не перезапускал.

    Есть методы без этих манипуляций?

    Reply
  29. Andreynikus

    (28)

    Тут дело не в обработке, а в COM — конекторе, если он не работает, то и остальное работать не будет.

    Reply
  30. Xershi

    (29) это понятно что не в обработке. Может нашли способ без создания обертки или без перезагрузки сервера хотя бы.

    Reply
  31. kar911

    Подскажите что не так делаю, ввел настройки, проверил подключение, подключился успешно. Поставил все галочки, нажал обновить но данных так никакие и не отобразило кроме списка пользователей.

    Reply
  32. Andreynikus

    (31)

    Возможно имя базы данных отличается от имени информационной базы.

    Reply
  33. kar911

    (32)ну да отличается, но ведь подключение проходит успешно

    Reply
  34. Andreynikus

    (33)

    Я имею ввиду, что в настройках обработки нужно указывать именно ту базу данных, которая указана в свойствах информационной базы 1С.

    И еще следует учитывать тот факт, что обработка показывает только заблокированные строки на момент нажатия кнопки. Если ничего не заблокировано, то обработка ничего не покажет.

    Reply
  35. Xershi

    Переписал вашу обработку на обычные формы, чтобы не нужно было создавать обертку для 64-битного сервера.

    Кстати для таких случаев стоит предусмотреть использование названия через реквизит. Плюс таблицу «Пользователи» переименовал в «ТаблицаПользователи», т.к. в типовых есть одноименный общий модуль!

    Reply
  36. Andreynikus

    (35)

    Отлично, я как раз за то что бы обработка развивалась! Буду рад если выложите свою версию в комментариях, возможно это поможет кому-то еще.

    Reply
  37. Terve!R

    (35) как раз не получилось на конфигурации с обычными формами и 64 битным сервером запустить. Поделитесь?

    Reply
  38. Xershi

    (37) планирую сделать публикацию, как только будет протестирована обработка. Сообщу как будет готова!

    Reply
  39. Pawlick

    Добрый день.

    Скачал обработку, настроил, обертку создал, все ок.

    Но при попытке обновить данные ошибка:

    «Ошибка при выполнении запроса SQL. {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(106)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Контекст базы данных изменен на «ca_mss_second».»

    Не подскажите в чем может быть проблема?

    Reply
  40. Andreynikus

    (39)

    Проверьте что у пользователя СУБД которого вы указали есть необходимые права для подключения к вашей базе. Это первое что приходит на ум.

    Reply
  41. WellMaster

    Долго бился с ошибкой подключения к кластеру 1с, пока не зарегистрировал длл-ку следующим методом (во вложении на картинке). Запуск командной строки от имени администратора.

    Обертку в COM+ как в статье https://infostart.ru/public/197627/ не использовал.

    Reply
  42. lemilk

    К серверу 1С на Ubuntu + PostgreSQL эту обработку можно приспособить?

    Reply
  43. Andreynikus

    (42)

    Если смотреть только управляемые блокировки тогда можно.

    Если сервер 1С на Ubuntu то возможно потребуются танцы с бубном, но код открыт, так что все в ваших руках.

    Reply
  44. Xershi

    (41) спасибо!

    Дублирую текстом:

    c:WindowsSysWOW64
    egsvr32 «c:Program Files1cv88.3.13.1644incomcntr.dll»

    Останется только версию платформы подменить!

    Reply
  45. Xershi

    (44) увы, что в 32-битной клиенте, что в 64-битном на УФ:

    Не зарегистрирована компонента comcntr.dll: {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(408)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса

    В моей доработке для ОФ конечно код выполняется на 32-битном режиме и обработка запускается…

    Reply
  46. vova196

    В описании указано что для 8.х, но под 8.2 — не запускается.

    Текст ошибки
    Reply
  47. Kinestetik

    (46), в 8.2 ещё не было таких инструкций препроцессора как «#Область», она появилась только в 8.3

    Пройдитесь глобальной заменой по всей обработке и сделайте:

    #Область заменить на //#Область

    #КонецОбласти заменить на //#КонецОбласти

    После этого ошибок быть не должно

    Reply
  48. Franchiser

    При активизации пользователя в верхней таблице можно увидеть в нижней блокировки выделенного пользователя?

    если нет, то как сопоставить блокировки с их инициаторами?

    Reply
  49. Andreynikus

    (48)

    Да, все верно. При выборе пользователя отображаются только те блокировки которые наложил именно он.

    Reply
  50. Franchiser

    (49) у меня не отображаются блокировки конкретного пользователя, всегда видны все блокировки без фильтра

    Reply
  51. Franchiser

    После нажатия на кнопку обновить активизируется строка «Все пользователи».

    Reply
  52. Andreynikus

    (50)

    А у других пользователей точно есть наложенные в этот момент блокировки?

    Обработка отображает только те блокировки, которые существовали в момент нажатия кнопки.

    Reply
  53. Franchiser

    (52) да, блокировки показывает по выделенному пользователю, но после нажатия кнопки активизируется всегда первая строка «все пользователи». Т.о. не понятно по кому смотрим блокировки.

    Reply
  54. Andreynikus

    (53)

    При нажатии кнопки, список всех блокировок для всех пользователей получается заново так и было задумано т.к. для моих целей этого достаточно.

    Если вы хотите по нажатию на кнопку получать блокировки только выделенного пользователя, тогда можете просто дописать обработку, код полностью открыт.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *