Ввиду своей деятельности, мне часто приходится рассказывать про различные аспекты оптимизации и в том числе про блокировки.
Очень часто слушатели задают следующие вопросы:
Как посмотреть в реальном времени, какие именно данные сейчас заблокированы?
Как понять, что сейчас заблокировано в терминах 1С?
Если гранулярность блокировки страница, как увидеть, какие данные в ней находятся?
Раньше приходилось отвечать, что инструмента, который показывает все вышеописанное, сейчас просто нет. Но потом мне это надоело, и я решил сделать собственный инструмент, который позволяет ответить на все вышеописанные вопросы.
{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1033,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтрокеSQL)
Возврат <<?>>ПолучитьТаблицуДанныхПоСтрокеSQL(СтруктураПараметров);
{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1035,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтраницеSQL)
Возврат <<?>>ПолучитьТаблицуДанныхПоСтраницеSQL(СтруктураПараметров);
{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1603,17)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуЛоговТЖ)
ТаблицаЛогов = <<?>>ПолучитьТаблицуЛоговТЖ();
Как я понял, обработка показывает текущие блокировки СУБД (MS SQL) и уже завершившиеся блокировки 1С? Для первого, в принципе, можно в менеджмент студио правой кнопкой на базе и в отчетах найти соответствующий отчет по блокировкам. Я так понимаю, что основной плюс - это получение имени объекта в 1С?
(4) starik-2005,
> Как я понял, обработка показывает текущие блокировки СУБД (MS SQL)
Да, именно так.
> уже завершившиеся блокировки 1С
Нет, показываются установленные но не завершившиеся блокировки 1С
> Для первого, в принципе, можно в менеджмент студио правой кнопкой на базе и в отчетах найти соответствующий отчет по блокировкам.
Если имеется ввиду отчет «Все блокирующие транзакции» то это не так. В отчете вы увидите только то, что одна транзакция блокирует другую. На какие строки наложена блокировка там не указано, на какой ресурс тоже не указано, даже тип блокировки не указан. На практике этот отчет почти бесполезен.
(5) информация по блокировкам 1с получается из ТЖ или с сервера приложения?
Меня самого часто просят посмотреть "что и кто прямо сейчас блокирует"... Мне представляется более удобным и качественным расследовать инциденты по истории блокировок в ТЖ, т.е. с некоторой статистикой по блокировкам за интервал времени. А сию секундный срез информации обладает лишь частичной пользой. Скорее это инструмент для выявления и "ликвидации" виновника (завершения сеанса)
(21)
Информация об управляемых транзакционных блокировках 1С берется из ТЖ т.к. сейчас это единственный источник такой информации.
Это инструмент скорее для изучения блокировок, чем для реального анализа проблем, я об этом писал в статье.
15.
it@medipal-onko.ru
31.01.17 09:04 Сейчас в теме
(14) именно так. я вижу список практически всех своих пользователей (около 150) и все заблокированные объекты. Но понять, кто и что заблокировал невозможно.
(15)
Эта обработка в первую очередь для тестовых баз, для анализа что именно и в каких случаях блокируется, а не для расследования проблем в боевых базах.
Вы выделяете пользователя, внизу должны отразится данные о тех объектах которые он заблокировал.
Если пользователь Б отображается вложенным в пользователя А, это значит что пользователь А заблокировал пользователя Б. На крайнем скриншоте видно что Администратор заблокировал пользователя Продовец.
(17)
Как бы глупо это не звучало, но проверьте что у пользователя под которым запущена служба 1С есть доступ в этот каталог conf на чтение и запись. Если у вас rphost запускается под своим пользователем, то проверьте под ним.
Ошибка в обработке:
Логина и пароля от SQL может не быть, так как MS SQL может работать по доменной авторизации.
Из-за этого вот тут тест проходит успешно
// тестируем подключение sql
СоединениеSQL = ОбработкаОбъект.СоздатьВнешнееПодключение(ПараметрыПодключения,10);
Если СоединениеSQL <> Неопределено Тогда
Сообщить("Подключение к серверу СУБД прошло успешно", СтатусСообщения.Информация);
КонецЕсли;
А тут получаем проблему
Если НЕ НастройкиЗаполнены() Тогда
ОткрытьФормуМодально("ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.Форма.ФормаНастроек");
Возврат;
КонецЕсли;
(23)
Может и есть, я не в курсе, хотя там СУБД версионник и как там получать список текущих блокировок не очень понятно.
В любом случае можно доработать обработку таким образом, что бы она фиксировала только управляемые блокировки, они не зависят от СУБД.
(25) эх, Александр догадался, а сюда не написал - у меня тоже не проходило соединение с Кластером, пока не наткнулся на фразу к описанию в другой обработке: если кластер без ограничения доступа, то следует писать так: Агент.Authenticate(Кластер, , );
и я понял, что на моем ноутбуке при установке я не делал пароль и логин для администратора кластера, поэтому имя и пароль администратора кластера надо оставить пустыми :о)
При тестировании подключения пишет, что нужно проделать настройку по статье: https://infostart.ru/public/197627/ Сервер 1С 64-битный.
Выполнил настройку, но сервер не перезапускал.
Есть методы без этих манипуляций?
Подскажите что не так делаю, ввел настройки, проверил подключение, подключился успешно. Поставил все галочки, нажал обновить но данных так никакие и не отобразило кроме списка пользователей.
(33)
Я имею ввиду, что в настройках обработки нужно указывать именно ту базу данных, которая указана в свойствах информационной базы 1С.
И еще следует учитывать тот факт, что обработка показывает только заблокированные строки на момент нажатия кнопки. Если ничего не заблокировано, то обработка ничего не покажет.
Переписал вашу обработку на обычные формы, чтобы не нужно было создавать обертку для 64-битного сервера.
Кстати для таких случаев стоит предусмотреть использование названия через реквизит. Плюс таблицу "Пользователи" переименовал в "ТаблицаПользователи", т.к. в типовых есть одноименный общий модуль!
Добрый день.
Скачал обработку, настроил, обертку создал, все ок.
Но при попытке обновить данные ошибка:
"Ошибка при выполнении запроса SQL. {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(106)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Контекст базы данных изменен на "ca_mss_second"."
Долго бился с ошибкой подключения к кластеру 1с, пока не зарегистрировал длл-ку следующим методом (во вложении на картинке). Запуск командной строки от имени администратора.
Обертку в COM+ как в статье https://infostart.ru/public/197627/ не использовал.
(44) увы, что в 32-битной клиенте, что в 64-битном на УФ:
Не зарегистрирована компонента comcntr.dll: {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(408)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса
В моей доработке для ОФ конечно код выполняется на 32-битном режиме и обработка запускается...
(42)
Если смотреть только управляемые блокировки тогда можно.
Если сервер 1С на Ubuntu то возможно потребуются танцы с бубном, но код открыт, так что все в ваших руках.
При активизации пользователя в верхней таблице можно увидеть в нижней блокировки выделенного пользователя?
если нет, то как сопоставить блокировки с их инициаторами?
(50)
А у других пользователей точно есть наложенные в этот момент блокировки?
Обработка отображает только те блокировки, которые существовали в момент нажатия кнопки.
(52) да, блокировки показывает по выделенному пользователю, но после нажатия кнопки активизируется всегда первая строка "все пользователи". Т.о. не понятно по кому смотрим блокировки.
(53)
При нажатии кнопки, список всех блокировок для всех пользователей получается заново так и было задумано т.к. для моих целей этого достаточно.
Если вы хотите по нажатию на кнопку получать блокировки только выделенного пользователя, тогда можете просто дописать обработку, код полностью открыт.
Андрей, добрый день. А подскажите, пожалуйста, нет ли версии этой обработки, которая выполняет запрос SQL не на стороне сервера, а на стороне клиента (функцию ВыполнитьЗапросSQL() в случае этой обработки)? У меня нет доступа на сервер SQL (по правилам СБ), но при windows аутентификации со стороны клиента я могу выполнять запросы SQL. Я пытался доработать вашу обработку, но понял, что это достаточно сложная задача.
(55) не очень понял что именно вы имеете ввиду под клиентом, сервер 1С?
В параметрах есть возможность Win аутентификации.
Прямой запрос выполняется только на СУБД через подключение для которого нужны логин и пароль. У вас же сервер 1С как то цепляется к СУБД, в свойствах ИБ на сервере прописан логин.
(56) Я прикрепил картинку с настройками: произошло подключение и к SQL серверу и к 1С. Так как у нас Win аутентификация, логин и пароль я не вводил, пришлось в коде закомментить проверку на обязательное заполнение логина и пароля.
Но теперь при нажатии на кнопку "Обновить" возникает следующая ошибка:
"Ошибка при выполнении запроса SQL. {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(106)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Changed database context to 'Besschetnov_Kursy1C'."
В приложенном файле видно где возникает ошибка и сам запрос, который выполняется (см. рис.)
Так вот я писал, что если этот запрос выполнить не в модуле объекта (на сервере), а в модуле формы (&НаКлиенте), то запрос выполняется и ошибка не возникает. Админы написали, цитирую: "В обработке запрос выполняется на сервере под учеткой службы, права у этой службы ограничены. Если же послать этот запрос с клиента под своей учеткой, то права будут".
(57)
А причем ту права доступа? Ошибка о которой вы написали с этим не связана.
Попробуйте другой способ соединения с БД например через Provider=SQLOLEDB
Там он уже есть просто в комментарии.
При нажатии на флаг "Отображать блокировки 1C" сначала ошибка модальности, но если это обойти, то ошибка доступа
При включении регистрации блокировок 1С произошла ошибка: {ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.Форма.Форма.Форма(439)}: Ошибка при вызове метода контекста (Записать): Ошибка доступа к файлу 'C:\Program Files\1cv8\8.3.18.1208\bin\conf\logcfg.xml'. Запускал под администратором - не помогло.
Неужели нельзя отладить, так чтобы хотя бы работало без ошибок.
(61)
У меня работает, у многих других тоже. Код открыт, можете отладить, сделать и переделать все что вашей душе угодно.
Если нет доступа, то проверьте права на этот каталог у того пользователя под которым запущен rphost.
Единственное чего не хватает так это номера сеанса, ну и скорость конечно не шибко быстрая.
Но в целом удобно, нашел подвисший сеанс, убил его и живи дальше.
(63)
Честно говоря обработка писалась вообще не для этого. Она не для расследования блокировок на рабочих базах.
Обработка писалась для изучения и исследования того, какая блокировка в каком случае накладывается, т.е. для обучения. Так же она будет полезна при переходе с автоматического на упр. режим, если вы хотите понять что именно заблокировано вашей управляемой блокировкой.
Для получения заблокированных строк по таблице приходится ее сканировать, поэтому обработка будет работать медленно на больших базах.
Если нужны просто номера сеансов кто кого заблокировал, то можно написать свою небольшую обработку, ну или посмотреть в консоли кластера.
(64) просто кто кого маловато, нужно понимать кто конкретную таблицу сейчас блокирует. Бывает что после наложения блокировок от клиента получаем "Программа выполнила недопустимую операцию", а сервер крайне редко понимает что клиента уже нет и держит блокировку или до убийства сеанса или до перезапуска. Пользователь то же перезапустил программу и сидит ровно, пока сам на свою блокировку не нарвётся.
Надо будет посмотреть обработку, вытащить номер сеанса и может быть упростить представление данных. В крайнем случае просто посмотрю как работать с кластером серверов. Мануал это хорошо, но работающий примерчик в чём то даже лучше.