Блокировки SQL базы данных 1С 7.7

09.11.21

База данных - HighLoad оптимизация

Конфигурация на 1С 7.7, показывающая блокировки на MS SQL сервере и доменных пользователей по SPID. Используется 1С++ и классы.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Блокировки SQL базы данных 1С 7.7. Конфигурация. Обработка.
.7z 1,20Mb
9
9 Скачать (1 SM) Купить за 1 850 руб.

Для чего?

Как всем давно известно, 1С 7.7 - тот еще подарок в части параллельности работы пользователей в базе. Для высоконагруженных систем это является большой проблемой. Чтобы понять, кто и кого блокирует и при выполнении какого запроса.

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

Где работает?

Умеет работать только в базах 1C 7.7 SQL формата.

Проверялась на: 1С 7.7 v. 7.70.027, MS SQL Server 2005 и MS SQL Server 2012

Что умеет?

  1. Определять "корень зла" - серверный процесс (SPID) вызвавший ожидание на блокировках.
  2. Формировать иерархическое дерево заблокированных серверных процессов.
  3. Определять доменных пользователей  на терминальных серверах (используя WMI) для каждого из серверных процессов.
  4. Принудительно завершать найденные процессы (по PID) на терминальных серверах.
  5. Определять имя хоста соответствующего серверному процессу (SPID-у) (определяет всегда, в независимости от того на каком компьютере запущена 1С). 
  6. Получать текст запроса для любого серверного процесса из полученного списка (полезно для анализа узких мест в конфигурации).
  7. Определять время выполнения последнего запроса серверного процесса.
  8. Есть режим, показывающий все блокировки на SQL сервере (не только текущей базы)

Состав конфигурации.

В состав конфигурации входит:

  • обработка "КтоБлокируетБазу".
  • глобальный модуль.
  • Вспомогательные классы.

Как установить?

  1. Распаковать в какую-либо папку файл Blocks.7z. Убедиться что в папке есть файл DefCls.prm и подпапки Classes, Icons. Без этих файлов работать не будет.
  2. В конфигураторе "Конфигурация -> Загрузить измененную конфигурацию..." указать файл 1Cv7.MD из папки п. 1.
  3. В конфигураторе "Администрирование -> Параметры базы данных SQL...". настроить сервер, базу данных, и пользователя.
  4. Сохранить конфигурацию и согласиться с созданием словаря данных.

Необходимые настройки при работе в режиме предприятия.

  1. Группа "Доменный администратор" - Имя и пароль доменного администратора для получения имен доменных пользователей и завершения процессов по PID.
  2. Группа "Настройки обновления таблицы процессов" - группа флажков, описывающих поведение таблица процессов.
  3. Группа "Фильтрация" - содержит одно поле "Имя базы данных на SQL сервере". Если поле заполнено, будет искать серверные процессы только в этой базе, если нет, будет искать по всем базам, расположенным на SQL сервере, к которому подключена эта база.

Блокировки 1С++ 1Cpp SPID PID запрос пользователь

См. также

Чистка данных HighLoad оптимизация Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

По статье "Зачем в 1С нужно периодически пересчитывать итоги по регистрам?" http://infostart.ru/public/177171/ Обработка для 7.7, чтобы посмотреть что же творится в БД для SQL

1 стартмани

13.03.2013    23446    54    maxpiter    15    

8

HighLoad оптимизация Системный администратор Программист Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Обратились ко мне с вопросом по теме форума: http://forum.mista.ru/topic.php?id=558772 Автор темы: "DennizzM". Название: "v7: 1c v7.7 ошибки транзакции - как отловить виновника?" Текст с сокращениями: "Вопрос наверняка не новый... Итак - есть база 1c v7.7 (самописная конфа). Периодически у пользователей возникает ошибка при проведении транзакции. База работает под терминалом. Нагрузка на дисковую подсистему небольшая, CPU на нуле, RAM до черта свободного. Вопрос вот в чем - как отловить инициатора первой транзакции которая всех держит? Итак - как мне выкрутиться? ;) ...я не имею права и не могу лезть внутрь конфы и модифицировать ее.".

13.07.2011    26604    hogik    16    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. quazare 3800 09.11.21 11:15 Сейчас в теме
за поддержку семерки в конце 21 года однозначно плюс!
Созинов; serpent; +2 Ответить
2. ShoDm 11 10.11.21 09:53 Сейчас в теме
(1)
за поддержку семерки в конце 21 года однозначно плюс!

Так получается :-). На КА контора никак перейти не может. Вот и приходится заниматься некрокодингом. :-)
4. isnail 13.01.22 16:00 Сейчас в теме
(2) Та же фигня, коллега :) И чем дальше смотрю на КА, тем больше хочется остаться на семерке :)
А за обработку спасибо!
5. dreamadv 156 10.02.22 15:08 Сейчас в теме
(4) раз уж тут перепись некрофилов :) подскажите ловлю переодически проблему с невозможностью перезаписи(редакции) документа и вылетом 1С, как бы насколько я понимаю это таблица со строками документа. Не понимаю куда копнуть.
Прикрепленные файлы:
3. zvp111 03.12.21 10:50 Сейчас в теме
А слабо такое сделать для 8-ки?
15. mshi 24.03.22 10:53 Сейчас в теме
(3) Особой необходимости в этом нет. Есть программа с похожим функционалом, но там еще и история блокировок ведется, что очень удобно.
Поищите MSSQL Blocks
6. ShoDm 11 10.02.22 18:29 Сейчас в теме
(5)
У вас нарисовался дублирующийся первичный ключ [IDDOC, LINENO_] в таблице строк документа. Вероятно что-то некорректно считает номер строки (у вас на скрине - это 20).
Вы ничего прямыми запросами в ПриЗаписи() не UPDATE-ите?
7. ShoDm 11 10.02.22 18:31 Сейчас в теме
(5)
Ошибка можете воспроизвести или она плавающая? Если можете, ищите место падения отладчиком, а потом профайлером смотрим что происходит на скуле.
9. dreamadv 156 10.02.22 18:43 Сейчас в теме
(7) Плавующая тот же документ перезаходят исправляют еще раз и он сохраняется, запросы есть прямые но селекты и к таблице регистров а не строк документа. Больше похоже на какую-то не адекватную работу платформы при записи документа в БД. Даже не знаю или с уровнем изоляции что-то не то, хз как там сделана под капотом запись документа может селект делается на строки и на этот запрос SQL возвращает какой-то кешированный ответ.
11. ShoDm 11 10.02.22 19:00 Сейчас в теме
(9) Я завтра попробую найти свои изыскания на тему "что под капотом у платформы". Если я разбирал процесс перезаписи документа... Процесс записи нового точно разбирал.
dreamadv; +1 Ответить
12. dreamadv 156 10.02.22 19:01 Сейчас в теме
(11) спасибо было бы здорово
13. ShoDm 11 11.02.22 10:23 Сейчас в теме
(12) В общем, посмотрел в ночи.
Картина при записи существующего документа такая:
1. Событие 1С ПриЗаписи() Обрабатывается вне транзакции.
2. После завершения ПриЗаписи(). Платформа считывает какие-то данные, видимо необходимые ей для записи. В разных базах - разные наборы данных. В моей тестовой, в которой документ состоит из Одного реквизита шапки и 2-х в МнЧ, был один вызов:
exec _1sp__1SJOURN_ByIDDOC '     D   '
Однако в боевой базе какие-то горы запросов к _1SCONST и хранимые процедуры, читающие данные справочников.
3. Дальше идет установка режима неявной транзакции:
set implicit_transactions on 

4. Блокировка _1SJOURN:
exec _1sp__1SJOURN_TLockX 
.
4.1. Тут открывается транзакция.
5. UPDATE-ит _1SJOURN на случай изменения состояния документа или изменения общих реквизитов документов:
Update _1SJOURN...

6. Добавляются новые строки в таблицу DT:
exec sp_executesql N'Ins ert in to DT111 values( @P1,@P2,@P3,@P4)',N'@P1 varchar(9),@P2 smallint,@P3 varchar(9),@P4 numeric(10,0)','     D   ',2,'     1   ',3
.
Здесь уже известен номер добавляемой строки (это параметр @P2, равный 2), т.е. платформа уже сама расчитала номер строки.
7. Снова перечитываются данные документа из журнала:
exec _1sp__1SJOURN_ByIDDOC '     D   '

8. Завершается транзакция:
COMMIT TRAN

9. И, собственно, все.

Обращаю внимание, что в процессе записи ни разу не было запроса к DT на получение последнего номера номера строки (столбец LINENO_), значит (вероятнее всего) это было сделано при открытии документа.

Возвращаясь к нашим баранам можно сделать вывод, что что-то и где-то до начала SQL-транзакции "ломает" номер добавляемой строки.
10. dreamadv 156 10.02.22 18:44 Сейчас в теме
(7) и думаю отладчиком искать не получится скорее всего это происходит просто при записи документа платформой
8. ShoDm 11 10.02.22 18:33 Сейчас в теме
(3)
Теоретически - да! Через ADODB Connection.
14. mshi 22.03.22 18:19 Сейчас в теме
Еще можно добавить функционал автоматического разруливания дедлоков. На больших базах с большим количеством пользователей неоценимо. У меня каждые 10 секунд проверяется условие на блокировку. Если за две последовательные проверки блокирует один и тот же пользователь, то запускается счетчик. Если за, например, 40 секунд блокировка пользователем не снялась, то программа его автоматически снимает. На базах, которые работают нон-стоп, это очень полезная фишка. У меня на 300 пользователях (+ 500 внешних обращений напрямую через SQL-базу) такая ситуация бывает в среднем раз в день. Иногда ни разу, иногда несколько раз в день. Нагрузка в районе 10-16 тысяч документов + 200-300 тысяч новых элементов справочников в день.
16. SnakePlisskin 3 25.10.22 10:23 Сейчас в теме
А не имея домена, обработка будет работать ? Сеть обычная одноранговая, к SQL базе подключаются пользователи через сетевую шару.
17. ShoDm 11 18.11.22 13:26 Сейчас в теме
(16) Боюсь, не могу ответить. В администрировании не силен, и в подобных ситуациях не тестировал.
Оставьте свое сообщение