Как исправить ошибку 'Конфликт блокировок' при загрузке .dt файла в серверную базу 1С на MS SQL Server?

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

При переходе на новые версии платформы 1С:Предприятие 8.3 (начиная с 8.3.18) пользователи и администраторы часто сталкиваются с ошибкой «Ошибка загрузки информационной базы. Конфликт блокировок при выполнении транзакции: Microsoft SQL Native Client: Lock request time out period exceeded» при попытке загрузить файл .dt в серверную информационную базу на MS SQL Server. Эта проблема возникает из-за изменений в механизме загрузки, который теперь использует многопоточность для ускорения процесса. Мы рассмотрим подробнее причины возникновения этой ошибки и предложим несколько проверенных решений.

Причина возникновения конфликта блокировок

Основная причина ошибки кроется в многопоточной загрузке данных из .dt файла, которая была внедрена в платформе 1С:Предприятие версии 8.3.18 и выше. При такой загрузке 1С создает несколько параллельных потоков, каждый из которых пытается одновременно записывать данные в различные таблицы или выполнять транзакции на MS SQL Server. В результате, различные потоки могут попытаться получить доступ к одному и тому же ресурсу (например, таблице или индексу) одновременно, вызывая взаимные блокировки.

MS SQL Server, обнаружив такую ситуацию, может не сразу решить, какой поток должен ждать, а какой — продолжить работу. Если время ожидания блокировки (lock timeout) для одного из потоков истекает, SQL Server прерывает операцию и возвращает ошибку Lock request time out period exceeded (код ошибки native=1222), что приводит к остановке загрузки всей информационной базы.

Старые версии MS SQL Server, такие как SQL Server 2005, могут быть особенно чувствительны к таким нагрузкам из-за менее совершенных механизмов управления параллелизмом и блокировками по сравнению с более новыми версиями.

Решение 1: Отключение многопоточной загрузки с помощью параметра -JobsCount 1

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

  1. Создание новой информационной базы на SQL Server:

    Для начала, если вы еще не сделали это, создайте новую пустую базу данных на вашем MS SQL Server. Затем добавьте эту базу данных в список информационных базов сервера 1С:Предприятия (если у вас кластер серверов) и в стартер 1С:Предприятия на клиентской машине. Присвойте ей уникальное и понятное имя, например, "1s-temp" или "TestRestore".

  2. Запуск загрузки в однопоточном режиме:

    Откройте командную строку (cmd) от имени администратора. Перейдите в каталог исполняемых файлов вашей платформы 1С. Например:

    
    cd "C:\Program Files\1cv8\8.3.19.1723\bin"
    

    Затем выполните следующую команду для загрузки .dt файла, указав имя вашей информационной базы и путь к файлу:

    
    1cv8.exe DESIGNER /IBName "TestRestore" /RestoreIB "D:\temp\dump.dt" -JobsCount 1
    

    Давайте разберем параметры этой команды:

    • 1cv8.exe: Исполняемый файл платформы 1С:Предприятие.
    • DESIGNER: Указывает на запуск 1С в режиме конфигуратора, так как операция загрузки базы (.dt) является функцией конфигуратора.
    • /IBName "TestRestore": Определяет имя информационной базы, в которую мы хотим загрузить данные. Важно: это имя должно точно соответствовать тому, как база зарегистрирована в стартере 1С (или в кластере серверов 1С), а не имени самой базы данных на SQL Server, если они отличаются. Если имя базы содержит пробелы, мы обязательно заключаем его в кавычки. Если в имени есть кавычки, их нужно удвоить (например, База ""СтройТоргВсе"").
    • /RestoreIB "D:\temp\dump.dt": Указывает путь к .dt файлу, который мы хотим загрузить. Убедитесь, что путь указан корректно и файл доступен.
    • -JobsCount 1: Критически важный параметр. Он принудительно устанавливает количество потоков загрузки в один, отключая многопоточность и тем самым предотвращая большинство конфликтов блокировок.

    Если ваша информационная база требует авторизации, вы можете также добавить параметры /N "ИмяПользователя" и /P "Пароль", но для новой, только что созданной базы это обычно не требуется.

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

Решение 2: Настройка MS SQL Server

Настройки самого MS SQL Server также могут влиять на возникновение и разрешение конфликтов блокировок. Мы рассмотрим несколько ключевых параметров.

  1. Параметр MAXDOP (Max Degree of Parallelism)

    Параметр MAXDOP определяет максимальное количество процессоров (ядер), которые SQL Server может использовать для выполнения одного параллельного запроса. Хотя этот параметр напрямую не управляет количеством потоков, исходящих от 1С, его значение может влиять на то, как SQL Server обрабатывает параллельные запросы от 1С и распределяет ресурсы. В некоторых случаях, особенно на старых версиях SQL Server или при специфической конфигурации оборудования, установка MAXDOP = 1 может помочь уменьшить количество внутренних параллельных операций SQL Server, которые могут усугублять конфликты.

    Мы можем изменить этот параметр следующими способами:

    • Через SQL Server Management Studio (SSMS):

      Подключитесь к вашему SQL Server, щелкните правой кнопкой мыши на экземпляре сервера, выберите "Properties" (Свойства), затем перейдите на вкладку "Advanced" (Дополнительно) и найдите параметр "Max Degree of Parallelism". Установите его значение в 1.

    • Через T-SQL скрипт:

      Выполните следующие команды в SSMS:

      
      EXEC sp_configure 'show advanced options', 1;
      GO
      RECONFIGURE WITH OVERRIDE;
      GO
      EXEC sp_configure 'max degree of parallelism', 1;
      GO
      RECONFIGURE WITH OVERRIDE;
      GO
      

      После изменения параметра мы обязательно перезапускаем SQL Server или хотя бы службу SQL Server, чтобы изменения вступили в силу.

    Внимание: Установка MAXDOP = 1 может негативно сказаться на производительности SQL Server в других сценариях, где параллелизм запросов полезен. Поэтому этот параметр следует менять с осторожностью и после консультации с опытным администратором баз данных.

  2. Уровень изоляции транзакций READ COMMITTED SNAPSHOT

    Уровень изоляции транзакций определяет, как транзакции взаимодействуют друг с другом и как они видят изменения, сделанные другими транзакциями. Для баз данных 1С на MS SQL Server рекомендуемым уровнем изоляции является READ COMMITTED SNAPSHOT. Этот уровень изоляции значительно снижает вероятность возникновения блокировок, так как читающие транзакции видят "срез" данных на момент начала своей работы и не блокируют пишущие транзакции (и наоборот).

    Мы можем включить READ COMMITTED SNAPSHOT для вашей базы данных 1С следующими командами T-SQL:

    
    ALTER DATABASE [ИмяВашейБазы1С] SET ALLOW_SNAPSHOT_ISOLATION ON;
    ALTER DATABASE [ИмяВашейБазы1С] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
    

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

  3. Версия MS SQL Server

    Использование устаревших версий MS SQL Server, таких как MS SQL Server 2005, упомянутой в исходной теме, может быть одной из причин проблем с блокировками. Более новые версии SQL Server (например, 2017, 2019, 2022) имеют значительно усовершенствованные механизмы управления транзакциями, оптимизаторы запросов и более эффективное управление блокировками. Мы всегда рекомендуем использовать версии MS SQL Server, которые официально поддерживаются вашей версией платформы 1С:Предприятие. Обновление SQL Server может решить множество проблем, связанных с производительностью и стабильностью.

Решение 3: Альтернативные методы переноса данных

Если загрузка .dt файла с параметром -JobsCount 1 или настройка SQL Server не приносят желаемого результата, существуют альтернативные, более надежные способы переноса данных.

  1. Выгрузка конфигурации и последующий перенос данных через XML

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

    1. Создание пустой базы данных: Мы создаем новую пустую базу данных на MS SQL Server и регистрируем ее в 1С. Важно, чтобы это была действительно пустая база, без данных.

    2. Загрузка конфигурации: Мы выгружаем конфигурацию из исходной файловой базы (или из другого источника) в файл .cf. Затем загружаем этот .cf файл в только что созданную пустую серверную базу через конфигуратор (меню "Конфигурация" -> "Загрузить конфигурацию из файла...").

    3. Перенос данных: После загрузки конфигурации в пустую серверную базу, мы используем штатную обработку 1С "Выгрузка и загрузка данных XML". Эту обработку можно найти в Интернете (например, на ИТС или Инфостарт) или она может быть встроена в вашу конфигурацию. С её помощью мы выгружаем необходимые данные из файловой базы в XML-файл(ы), а затем загружаем их в новую серверную базу. Этот процесс может занять значительное время и потребует внимательной настройки правил обмена, но он является очень надежным.

    4. Перепроведение документов и закрытие месяцев: После переноса данных через XML часто требуется выполнить перепроведение документов и закрытие периодов (например, закрытие месяцев) в новой базе, чтобы убедиться в корректности всех остатков и проводок.

  2. Перенос через резервное копирование средствами SQL Server (.bak)

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

    1. Конвертация файловой базы в SQL: Если исходная база у вас исключительно файловая, нам потребуется сначала конвертировать её во временную базу на MS SQL Server. Это можно сделать, создав новую пустую SQL базу, а затем загрузив в нее .dt из вашей файловой базы (возможно, с использованием -JobsCount 1, если временная загрузка тоже вызывает ошибки).

    2. Создание резервной копии: После того как исходная база будет находиться на SQL Server (будь то изначально или после конвертации), мы создаем её резервную копию (файл .bak) средствами MS SQL Server. Это делается через SQL Server Management Studio: щелкните правой кнопкой мыши на базе данных, выберите "Tasks" (Задачи) -> "Back Up..." (Создать резервную копию...).

    3. Восстановление резервной копии: Затем мы восстанавливаем этот .bak файл на целевом MS SQL Server, где должна быть размещена новая база. Это также делается через SSMS: щелкните правой кнопкой мыши на "Databases" (Базы данных), выберите "Restore Database..." (Восстановить базу данных...), укажите источник (ваш .bak файл) и целевое имя новой базы данных.

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

  3. Перенос с использованием сервисного режима 1С (создание архива на уровне предприятия)

    Некоторые конфигурации 1С поддерживают так называемый "сервисный режим" или "работу в модели сервиса". Если ваша конфигурация поддерживает этот режим, вы можете использовать его для создания архива данных на уровне предприятия. Затем этот архив можно развернуть на новой, пустой SQL базе с той же конфигурацией. Этот метод также является одним из вариантов для крупных систем, но его применимость зависит от конкретной конфигурации 1С.

Дополнительные практические рекомендации

Чтобы минимизировать проблемы при переносе данных и работе с 1С на SQL Server, мы также рекомендуем следующее:

  1. Очистка списка пользователей в файловой базе: Иногда перед выгрузкой .dt из файловой базы помогает удаление всех пользователей, кроме администратора (или даже всех, если база будет создаваться с нуля). Конфликты при создании системных таблиц и пользователей в новой базе на SQL Server могут быть предотвращены таким образом. После загрузки базы вы сможете создать пользователей штатными средствами 1С.

  2. Анализ журнала транзакций SQL Server: В случае повторения ошибок или возникновения других проблем с производительностью, администратору баз данных следует использовать такие инструменты, как SQL Server Profiler или Extended Events, для анализа журналов SQL Server. Это позволит точно определить, какие именно запросы, таблицы или ресурсы вызывают конфликты блокировок, и глубже понять природу проблемы.

  3. Актуальность ПО: Мы постоянно следим за актуальностью версий платформы 1С:Предприятие и MS SQL Server. Многие ошибки, связанные с блокировками, производительностью и совместимостью, исправляются в новых релизах программного обеспечения. Регулярные обновления помогают избежать множества проблем.

  4. Параметры запуска 1С: Убедитесь, что параметры запуска 1С (например, кэш, память) оптимально настроены для работы с серверной базой данных. Иногда некорректные настройки клиента могут косвенно влиять на поведение при работе с сервером.

Следуя этим рекомендациям, мы значительно повысим шансы на успешную загрузку информационной базы и обеспечим стабильную работу системы 1С:Предприятие на MS SQL Server.

← На главную