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

Публикация № 1545213 09.11.21

Администрирование БД - HighLoad оптимизация

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

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

Для чего?

Как всем давно известно, 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 сервере, к которому подключена эта база.

Скачать файлы

Наименование Файл Версия Размер
Блокировки SQL базы данных 1С 7.7. Конфигурация. Обработка.

.7z 1,20Mb
5
.7z 1,20Mb 5 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. quazare 2104 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 152 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 152 10.02.22 18:43 Сейчас в теме
(7) Плавующая тот же документ перезаходят исправляют еще раз и он сохраняется, запросы есть прямые но селекты и к таблице регистров а не строк документа. Больше похоже на какую-то не адекватную работу платформы при записи документа в БД. Даже не знаю или с уровнем изоляции что-то не то, хз как там сделана под капотом запись документа может селект делается на строки и на этот запрос SQL возвращает какой-то кешированный ответ.
11. ShoDm 11 10.02.22 19:00 Сейчас в теме
(9) Я завтра попробую найти свои изыскания на тему "что под капотом у платформы". Если я разбирал процесс перезаписи документа... Процесс записи нового точно разбирал.
dreamadv; +1 Ответить
12. dreamadv 152 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 152 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 тысяч новых элементов справочников в день.
Оставьте свое сообщение

См. также

Тест производительности 1С сервера/компьютера v.2014.1

HighLoad оптимизация v7.7 v77::ОУ v77::БУ v77::Расчет 1cv7.md Абонемент ($m)

1С сама проверит своё железо и скажет, чего ей не хватает!

1 стартмани

12.01.2014    21664    79    1v7    7    

Удаление нулевых значений в промежуточных регистрах

Чистка данных HighLoad оптимизация v7.7 1cv7.md Абонемент ($m)

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

1 стартмани

13.03.2013    21438    52    maxpiter    15    

Ускорение 1С 7.7 в 10 раз и более(на SQL) - Созданием Нестандартных ИНДЕКСОВ +Кэш SQL

HighLoad оптимизация v7.7 openconf 1cv7.md Россия Абонемент ($m)

После повторных тестов пришел к выводу: Доп.Индексы - да ускоряют получение данных, но эффект явно виден при закэшированной(в ОЗУ SQL-сервера) базе данных! ****************************************************** ******* Принудительное КЭШИРОВАНИЕ на SQL СЕРВЕРЕ****** (эффективно если на SQL сервере ОЗУ больше чем размер Базы) методики см. в описании ниже по тексту)) Идея взята путем переработки информации из следующих источников: http://softpoint.ru/article.php?id=18 http://www.softpoint.ru/article_id15.htm http://www.forum.mista.ru/topic.php?id=400197 ********************* Автор плагина для обмана 1с 7.7 насчет доп.Индексов http://itland.ru/forum//index.php?showtopic=2439&hl=DDX *********************** Запрос №1 (что то похожее порой шлет сама 1С) Select top 50 * from SC46(NOLOCK INDEX=VI4135) order by SP4135, ROW_ID Время выполнения: 10203 мс ----------------------------------------------------------------------------- Запрос №2 - видоизмененный запрос 1 без указания индекса Select top 50 * from SC46 order by SP4135, ROW_ID Время выполнения: 4105 мс ------------------------------------------------------------------------------------- Запрос №3 - Добавим Все Поля входящие в Индекс Select top 50 * from SC46(NOLOCK INDEX=VI4135) order by SP4135, Descr, ROW_ID Время выполнения:156 мс ******************** А чтобы ОдынЦэ не убивало ЛЕВЫЕ)) индексы берем разработку -скрипт-плагин для OpenConf -файл приложен + Обработка загрузки БД в память SQL)) .....BIN\config\scripts\ExtDD.vbs и ....Каталог_Инф_Базы\1cv7.ddx (Эти индексы в БД SQL создаст Конфигуратор при РЕСТРУКТОРИЗАЦИИ БД) пример куска содержания моего DDX X=RA405 %#Доп. индекс Регистр (Дв.) ОстаткиТМЦ X=RA405 %I=MY_IDDOC | |0 |IDDOC |0

1 стартмани

22.04.2011    35445    146    sanfoto    67    

Организация допроведения документа (простенький учебный пример)

Обработка документов HighLoad оптимизация v77::ОУ 1С7:ТиС Абонемент ($m)

Очень простенький учебный пример (минут за двадцать накидал), чисто для иллюстрации основной идеи допроведения документа, при котором можно сносно реализовать, если в документе изменяются, удаляются старые (уже проведенные) строки или меняется порядок строк, а не только добавляются новые. Можно еще оптимизировать. Пример несколько упрощенной задачи, в которой можно это применить: Документ "Расход товаров", который служит для отражения в системе учета фактов продажи товаров и списывает их со склада. Документ вводится один раз в начале смены и остается активным до конца смены. Ввод новой продажи в течении смены осуществляется добавлением новых строк в документ и отработки процедуры “Допровести” (одноименная кнопка в форме). Процедура “Допровести” должна сформировать движения по списанию выбранных товаров, контролируя наличие необходимого их количества на складе с учетом ранее проданных товаров, введенных в этом документе. Т.е. необходимо реализовать режим допроведения документа (уже проведенные строки не должны проводиться повторно) с поддержкой в актуальном состоянии временного расчета регистра с учетом уже записанных при предыдущих продажах в этом документе движений. Обновлено: 15:08 04.10.2008

1 стартмани

03.10.2008    17569    208    venger    20