Как решить конфликт блокировок при удалении или изменении записей в регистре сведений 1С:CRM 3 + 1С:КА?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

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

Основные причины возникновения конфликтов блокировок

Прежде чем перейти к решениям, давайте разберем возможные причины возникновения таких блокировок:

  1. Зависшие блокировки: Это одна из наиболее частых причин. Ошибка «Превышено максимальное время ожидания предоставления блокировки» может указывать на наличие так называемых «зависших» или «зомби» блокировок. Такие блокировки не были корректно сняты после завершения транзакции или в результате аварийного завершения работы системы. Они могут удерживаться СУБД, даже если в базе данных нет активных пользователей или все регламентные задания отключены, что создает ложное ощущение «чистой» среды.
  2. Неоптимальная работа запросов или логики: Даже при выполнении простых операций, таких как удаление записей, платформа 1С может инициировать внутренние запросы. Если эти запросы неоптимальны, затрагивают большой объем данных или выполняются в рамках сложных транзакций, это может привести к избыточным блокировкам.
  3. Методологические ошибки в структуре метаданных: Иногда проблемы могут быть заложены на этапе проектирования. Ошибки при выборе типов данных, индексации или общая структура объектов метаданных могут способствовать возникновению избыточных блокировок.
  4. Проблемы с данными: В редких, но критичных случаях, когда только определенные «плохие» записи вызывают конфликт, это может указывать на логическую или даже физическую порчу данных в этих конкретных записях регистра сведений или связанных с ними объектах. Повреждение данных может препятствовать корректной обработке операции платформой 1С или СУБД, что приводит к таймаутам.

Шаг 1: Первичные попытки и диагностика в 1С

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

Попытка программной очистки всего регистра

Если проблема возникает с независимым регистром сведений, и мы готовы полностью очистить его содержимое (например, если данные можно восстановить или они не критичны), мы можем попробовать программно сбросить все записи. Для этого используем метод СоздатьНаборЗаписей().Записать(). Этот метод создает пустой набор записей и записывает его в регистр, по сути, удаляя все существующие записи.

Рассмотрим пример кода:


РегистрыСведений.СостоянияКонтактовВзаимодействий.СоздатьНаборЗаписей().Записать();

После выполнения этого кода мы ожидаем, что регистр сведений СостоянияКонтактовВзаимодействий будет полностью очищен. Если эта операция также завершается с ошибкой «Конфликт блокировок», это является серьезным индикатором того, что проблема находится на более низком уровне – скорее всего, на уровне СУБД, и указывает на глубокие проблемы с целостностью данных или зависшие блокировки, которые мешают даже такому базовому действию.

Анализ типа измерения "КонтактВзаимодействия"

В нашем случае измерение «Контакт» регистра сведений имеет определяемый тип «КонтактВзаимодействия». Мы выяснили, что даже если мы найдем соответствующую ссылку в справочнике «Строковые контакты взаимодействий» и изменим его наименование, отображение в проблемной записи регистра сведений обновится. Это говорит о том, что сам элемент справочника, на который ссылается проблемная запись, в порядке. Тем не менее, теоретически, если для «плохих» записей существуют какие-либо логические несоответствия или особенности в связанных с этим типом данных, это может влиять на механизмы платформы при попытке удаления. Однако, чаще всего, проблемы с блокировками указывают на более низкоуровневые причины.

Использование Технологического журнала 1С

Для глубокого анализа причин возникновения таймаутов блокировок рекомендуется использовать Технологический журнал 1С. Он позволяет выявить, какая именно транзакция или процесс удерживает блокировку, какие ресурсы заблокированы, и контекст выполнения операции, приведшей к конфликту. Настроив запись событий, связанных с блокировками (например, `DBMSSQL`, `TLOCK`, `TDEADLOCK`), мы получим детальную картину происходящего.

Шаг 2: Проверка целостности базы данных на уровне СУБД

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

Использование команды DBCC CHECKDB

Важным шагом является проверка целостности базы данных с помощью команды DBCC CHECKDB. Это критически важный инструмент для выявления и, возможно, исправления ошибок на уровне СУБД, которые могут быть причиной аномального поведения 1С, включая проблемы с блокировками.

Мы выполняем эту команду для нашей базы данных. Синтаксис команды выглядит так:

DBCC CHECKDB ('НазваниеВашейБазыДанных') WITH NO_INFOMSGS, ALL_ERRORMSGS;

Эта команда проверит все таблицы и индексы на наличие повреждений. Если будут обнаружены ошибки, мы увидим подробный отчет. В зависимости от типа ошибок, мы можем использовать следующие опции:

  1. REPAIR_REBUILD: Эта опция позволяет исправить многие ошибки без потери данных, например, перестроить индексы. Мы можем попробовать ее в первую очередь.
  2. REPAIR_ALLOW_DATA_LOSS: Эту опцию следует использовать только в крайнем случае и только после создания полной резервной копии базы данных. Она может привести к потере данных, но может спасти базу, если другие методы бессильны.

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

Инструменты СУБД для диагностики

Если наша база данных работает под управлением MS SQL Server, мы можем использовать специализированные инструменты, такие как SQL Server Profiler или расширенные события (Extended Events), для получения более детальной информации о блокировках на уровне СУБД. Эти инструменты позволяют в реальном времени отслеживать активные блокировки, их длительность, а также процессы, которые их удерживают. Это дает нам возможность определить источник проблемы с точностью до конкретного SQL-запроса.

Шаг 3: Прямое воздействие на СУБД (Радикальные методы очистки)

Если DBCC CHECKDB не выявил критических ошибок, или если мы приняли решение о полном сбросе данных в регистре, мы можем использовать прямой SQL-запрос.

Использование команды TRUNCATE TABLE

Для серверных баз данных (MS SQL Server) мы можем использовать команду TRUNCATE TABLE. Эта команда является более быстрой и эффективной для удаления всех записей из таблицы по сравнению с DELETE FROM, так как она не протоколирует каждую удаляемую строку, а просто деаллоцирует страницы данных, занятые таблицей.

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

Для того чтобы использовать TRUNCATE TABLE, нам нужно сначала узнать физическое имя таблицы, соответствующей регистру сведений СостоянияКонтактовВзаимодействий в нашей базе данных SQL Server. Это можно сделать через консоль 1С, получив информацию об объекте метаданных, или напрямую в SQL Server Management Studio (SSMS), изучив список таблиц.

Пример команды:

TRUNCATE TABLE [ИмяФизическойТаблицыРегистраСведений];

Например, если физическое имя таблицы регистра СостоянияКонтактовВзаимодействий в SQL Server выглядит как _InfoRg4567, команда будет такой:

TRUNCATE TABLE _InfoRg4567;

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

Шаг 4: Пересоздание регистра в Конфигураторе (Наиболее радикальный метод)

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

Возможность и риски пересоздания

Нам важно понимать, что на регистры сведений (особенно независимые, как в нашем случае) не может быть прямых ссылок из других объектов конфигурации (таких как справочники или документы). Это означает, что удаление и повторное создание регистра сведений не нарушит ссылочную целостность других объектов нашей конфигурации. Это ключевое отличие от удаления, например, справочника или документа.

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

Пошаговая процедура (с учетом "Конфигурации на замке")

  1. Создание резервной копии: Прежде всего, мы делаем полную и актуальную резервную копию нашей информационной базы. Это наш "спасательный круг" на случай непредвиденных проблем.
  2. Снятие с поддержки (если необходимо): Если конфигурация находится на поддержке с невозможностью изменения (на "замке"), нам придется временно снять конфигурацию с поддержки или разрешить изменение объекта. Это радикальный шаг, который требует тщательного планирования и понимания последствий для дальнейших обновлений. Мы выбираем регистр сведений СостоянияКонтактовВзаимодействий и разрешаем его изменение, либо снимаем конфигурацию с поддержки полностью.
  3. Удаление регистра сведений: Мы открываем конфигуратор, находим регистр сведений СостоянияКонтактовВзаимодействий и удаляем его.
  4. Обновление конфигурации базы данных: После удаления регистра мы сохраняем конфигурацию (F7) и обновляем конфигурацию базы данных (Ctrl+Alt+S). Это физически удалит таблицу регистра из СУБД.
  5. Восстановление регистра из типовой конфигурации:
    1. Если у нас есть файл поставки типовой конфигурации (`.cf`), мы можем "накатить" его. Мы используем команду "Конфигурация" -> "Сравнить, объединить с конфигурацией из файла..." и выбираем наш файл типового CF. В окне сравнения и объединения мы находим удаленный нами регистр сведений СостоянияКонтактовВзаимодействий и устанавливаем флажок на его создание, убедившись, что никакие другие критичные изменения не будут применены.
    2. Если файла поставки нет, мы можем создать новый регистр сведений с тем же именем и структурой, как в типовой конфигурации. Для этого нам потребуется точно знать все измерения, ресурсы и реквизиты, их типы и свойства. Это более трудоемкий и потенциально ошибочный путь, поэтому предпочтительнее использовать типовой CF.
  6. Обновление конфигурации базы данных: После восстановления/создания регистра мы снова сохраняем конфигурацию и обновляем конфигурацию базы данных. Это создаст новую физическую таблицу для регистра в СУБД.
  7. Восстановление поддержки: Если мы снимали конфигурацию с поддержки, нам нужно будет восстановить ее, сравнив с типовой конфигурацией поставщика.
  8. Заполнение регистра данными (если необходимо): Если данные из регистра были критичны, и у нас есть способ их восстановить (например, из резервной копии другого регистра или файла выгрузки), мы должны будем повторно заполнить регистр.

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

Дополнительные подходы к решению

Увеличение времени ожидания блокировки

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

В заключение, решение проблемы конфликтов блокировок при работе с регистрами сведений требует систематического подхода. Мы начинаем с диагностики внутри 1С, переходим к проверке целостности базы данных на уровне СУБД, и при необходимости применяем более радикальные методы, такие как прямое воздействие на СУБД или пересоздание объекта конфигурации. Каждый шаг требует тщательного анализа и, в идеале, предварительного тестирования на копии базы данных.

← На главную