Как исправить ошибку "Ошибка разделенного доступа к базе данных" в 1С с PostgreSQL при использовании модуля синхронизации Битрикс24?

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

При работе с информационной базой 1С:Предприятия в клиент-серверном варианте, особенно с использованием СУБД PostgreSQL и дополнительных модулей интеграции, таких как синхронизация с Битрикс24, пользователи могут столкнуться с ошибкой "Ошибка разделенного доступа к базе данных". Эта проблема проявляется, когда система 1С или СУБД не может получить необходимый доступ к данным из-за блокировок, установленных другими процессами. Давайте подробно разберем эту ситуацию, проанализируем возможные причины и предложим комплексные подходы к ее устранению.

Анализ исходной проблемы

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

Описание сценария:

  1. Платформа и конфигурация: Используется 1С:Предприятие 8.3 (в примере - 8.3.13.1690) с конфигурацией "Управление торговым предприятием для Казахстана, редакция 2.0". В качестве СУБД выступает PostgreSQL 10.5-24.1C(x64).
  2. Вариант работы: Ошибка проявляется исключительно в клиент-серверном варианте работы информационной базы. В файловом варианте та же база данных работает, хоть и медленно, но без данной ошибки.
  3. Триггер ошибки: Проблема возникает при выполнении ресурсоемких операций, таких как Восстановление последовательности документов или перепроведение документов.
  4. Сообщение об ошибке: Система выдает сообщение "{ОбщийМодуль.ДлительныеОперации.Модуль(166)}: Ошибка разделенного доступа к базе данных База данных заблокирована: компьютер: Lenovo-PC, пользователь: Администратор". Это сообщение явно указывает на проблему с блокировкой данных.
  5. Ключевой фактор: Ошибка появилась только после установки модуля 1С:Синхронизация Битрикс24. Это критически важное наблюдение, сужающее круг поиска причин.
  6. Проведенные диагностики:
    • Выполнение тестирования и исправления базы данных через Конфигуратор в клиент-серверном варианте не выявило никаких ошибок.
    • Отключение фоновых регламентных заданий, включая задание по обмену с сайтом в реальном времени, не решило проблему. Более того, само регламентное задание по обмену с сайтом также завершалось с ошибкой разделенного доступа.
    • Разработчик модуля Битрикс24, после удаленного подключения и анализа базы, порекомендовал "поработать с настройками сервера, PostgreSQL", что переводит акцент на системные аспекты.

Из этого анализа становится очевидно, что мы имеем дело с комплексной проблемой, связанной с взаимодействием платформы 1С, СУБД PostgreSQL и специфического модуля обмена, который, по всей видимости, создает дополнительные нагрузки или конфликты блокировок.

Понимание ошибки разделенного доступа и блокировок в 1С и PostgreSQL

Для эффективного устранения проблемы нам необходимо глубоко понимать, что такое ошибка разделенного доступа в контексте 1С и как работают механизмы блокировок в связке 1С и PostgreSQL.

Блокировки в 1С:Предприятии:

В системе 1С:Предприятие существуют два основных механизма блокировок:

  1. Объектные (управляемые) блокировки: Эти блокировки полностью управляются платформой 1С. Они устанавливаются, например, при открытии объекта на редактирование в форме или при явном использовании программного кода для установки управляемых блокировок. В режиме управляемых блокировок 1С берет на себя ответственность за параллельность, что позволяет блокировать не всю таблицу, а конкретные записи по значениям измерений, уменьшая вероятность конфликтов.
  2. Транзакционные (автоматические) блокировки: Эти блокировки управляются непосредственно СУБД. 1С может работать с ними в двух режимах:
    • В автоматическом режиме блокировок 1С полностью полагается на СУБД для управления параллельным доступом. В случае с PostgreSQL в этом режиме часто используются табличные блокировки, что может приводить к конфликтам при высокой конкуренции за данные.
    • В режиме управляемых блокировок (который обычно предпочтителен для производительных систем) 1С снижает уровень изоляции транзакций на СУБД до Read Committed для PostgreSQL и самостоятельно управляет более точечными блокировками.

Особенности PostgreSQL и 1С:

1С:Предприятие 8 использует модифицированную версию PostgreSQL, которая входит в комплект поставки и оптимизирована для работы с платформой. Ключевые аспекты взаимодействия:

Ошибка "База данных заблокирована" обычно указывает на транзакционные блокировки на уровне СУБД, которые либо устанавливаются платформой 1С, либо являются следствием конкурентного доступа со стороны различных процессов, включая регламентные задания или операции, инициированные модулем синхронизации.

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

Исходя из анализа, мы можем выделить несколько ключевых направлений для диагностики и поиска источников блокировок.

Основной подозреваемый – модуль 1С:Синхронизация Битрикс24:

Поскольку проблема возникает только после установки модуля, логично предположить, что именно он является инициатором или катализатором блокировок. Модуль обмена с Битрикс24 может создавать значительную нагрузку на базу данных, особенно при массовой синхронизации данных, частых циклах обмена или некорректной обработке транзакций.

Что могло вызывать блокировки:

  1. Одновременное изменение данных: При перепроведении документов или восстановлении последовательности 1С активно работает со множеством таблиц и записей. Если в этот же момент модуль Битрикс24 пытается изменить те же данные (например, обновить информацию о товарах, заказах, клиентах), может возникнуть конфликт блокировок.
  2. Фоновые и регламентные задания: В исходной теме упоминается, что отключение регламентных заданий не помогло, и само задание по обмену завершается с ошибкой. Это подтверждает, что регламентные операции (как модуля, так и самой 1С) являются источником проблемы. Большая очередь фоновых заданий, инициированных модулем, может замедлять интерактивную работу и приводить к конфликтам.
  3. "Зависшие" блокировки: Иногда блокировки могут оставаться активными из-за некорректно завершенных сеансов 1С или процессов СУБД. Эти "зависшие" блокировки могут препятствовать доступу к данным, даже если активных пользователей нет.
  4. Неправильные настройки PostgreSQL: СУБД может быть настроена неоптимально для высоконагруженных операций 1С, что усугубляет проблемы с блокировками. Это может касаться как общих параметров производительности, так и настроек, влияющих на обработку соединений и транзакций.
  5. Недостаточные права доступа: Хотя тестирование и исправление БД не выявило ошибок, проблемы с правами на уровне файловой системы или специфических объектов СУБД для пользователя 1С или пользователя базы данных PostgreSQL также могут быть причиной.

Рекомендации по оптимизации и настройке PostgreSQL для работы с 1С

Как мы уже выяснили, разработчики модуля Битрикс24 указали на необходимость проверки и настройки сервера и PostgreSQL. Давайте рассмотрим подробнее, какие параметры PostgreSQL критически важны для стабильной работы 1С.

Мы будем работать с основным конфигурационным файлом PostgreSQL — postgresql.conf, а также с файлом аутентификации клиентов — pg_hba.conf.

  1. Настройка postgresql.conf:
    • max_connections: Этот параметр определяет максимальное количество одновременных подключений к PostgreSQL. Для 1С, особенно при активных регламентных заданиях и большом числе пользователей, этот параметр должен быть увеличен. Рекомендуется устанавливать значение с запасом, исходя из максимального количества пользователей 1С плюс дополнительные подключения для фоновых заданий и служебных процессов. Например, для 10 пользователей, как в нашем случае, можно начать с max_connections = 100-200.
    • listen_addresses: Определяет IP-адреса, на которых PostgreSQL будет прослушивать входящие соединения. Если сервер 1С и PostgreSQL находятся на разных машинах или если доступ к PostgreSQL требуется не только с localhost, необходимо изменить значение на * (для прослушивания всех доступных интерфейсов) или указать конкретный IP-адрес сетевой карты, через которую происходит подключение. Пример: listen_addresses = '*'.
    • Параметры памяти:
      • shared_buffers: Объем памяти, выделяемый для буферного кэша PostgreSQL. Это один из наиболее важных параметров. Рекомендуется устанавливать 25-40% от общего объема оперативной памяти сервера, но не более 8-16 ГБ для большинства систем. Например, при 8 ГБ RAM можно установить shared_buffers = 2GB.
      • work_mem: Объем памяти, используемый каждой сессией для внутренних операций сортировки и хеширования. При больших отчетах или запросах с сортировкой увеличение этого параметра может значительно ускорить работу. Рекомендуется начать с 64MB или 128MB, но можно увеличить до нескольких сотен мегабайт, мониторя потребление памяти.
      • maintenance_work_mem: Память для операций обслуживания БД (VACUUM, CREATE INDEX и т.д.). Для больших баз и частых операций обслуживания можно установить maintenance_work_mem = 256MB или 512MB.
    • Параметры WAL (Write-Ahead Log):
      • wal_buffers: Буфер для журнала предзаписи. Рекомендуется увеличить до 16MB или 32MB.
      • checkpoint_timeout и max_wal_size: Определяют частоту контрольных точек и максимальный размер WAL-журналов. Эти параметры влияют на производительность и скорость восстановления. Для высоконагруженных систем рекомендуется увеличить checkpoint_timeout (например, до 15min) и max_wal_size (например, до 2GB или 4GB), чтобы уменьшить частоту операций записи на диск.
      • fsync: Важный параметр для обеспечения целостности данных. Всегда должен быть on, если вы не готовы рисковать потерей данных в случае сбоя питания.
    • Автоочистка (Autovacuum): Убедитесь, что autovacuum = on. Параметры autovacuum_vacuum_scale_factor и autovacuum_analyze_scale_factor могут быть настроены для более агрессивной очистки больших таблиц.
  2. Настройка pg_hba.conf:

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

    
    host    all             all             127.0.0.1/32            md5
    host    all             all             192.168.1.0/24          md5
    

    Где 192.168.1.0/24 — это подсеть, в которой находится ваш сервер 1С.

  3. Локаль и кодировка базы данных:

    1С требует определенную локаль и кодировку. Убедитесь, что ваша база данных PostgreSQL создана с локалью ru_RU.UTF-8.

  4. Проверка модуля mchar:

    Убедитесь, что модуль mchar корректно установлен и функционирует. Если при создании базы данных или при попытке выполнения запросов 1С вы получаете ошибку "type 'mvarchar' does not exist", это указывает на проблемы с mchar.

  5. Разделение табличных пространств (Tablespaces):

    Для высоконагруженных систем, особенно с SSD, рассмотрите возможность размещения данных, индексов и журналов транзакций (WAL) на разных физических дисках. Это может значительно распределить нагрузку на I/O и улучшить производительность.

  6. Проблема с TCP-портами в Windows:

    В операционных системах Windows, иногда может возникать ошибка "could not send data to server: No buffer space available", указывающая на недостаток доступных временных TCP-портов. Это актуально для систем с высокой сетевой активностью, например, между сервером 1С и PostgreSQL. Мы можем увеличить параметр MaxUserPort в реестре Windows. Для этого необходимо:

    1. Открыть Редактор реестра (regedit).
    2. Перейти по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.
    3. Создать или изменить параметр MaxUserPort типа DWORD со значением, например, 65534 (максимальное значение).
    4. Создать или изменить параметр TcpTimedWaitDelay типа DWORD со значением, например, 30 (в секундах).
    5. Перезагрузить операционную систему для применения изменений.

Особенности взаимодействия модуля Битрикс24 и 1С

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

  1. Нагрузка на базу данных:

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

  2. Публикация HTTP-сервисов:

    Интеграция 1С и Битрикс24 часто использует HTTP-сервисы. Мы должны убедиться, что веб-сервис в 1С правильно опубликован и что включена опция "Публиковать HTTP-сервисы расширений по умолчанию" (если модуль является расширением).

  3. Регистрация изменений:

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

  4. Очередь фоновых заданий:

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

  5. Журналирование ошибок в Битрикс24:

    Для отладки ошибок синхронизации мы можем включить настройку "Хранить информацию об ошибках" в Битрикс24 и просматривать журнал ошибок. Это позволит нам получить более детальную информацию о том, какие конкретно данные или операции вызывают сбой.

  6. Обновления модуля:

    Мы должны проверить наличие обновлений для модуля синхронизации Битрикс24. Разработчики могли выпустить исправления, устраняющие проблемы с блокировками или оптимизирующие работу.

Инструменты для глубокой диагностики блокировок

Когда общие настройки не помогают, мы переходим к более детальной диагностике. Здесь нам помогут инструменты логирования и мониторинга.

  1. Технологический журнал 1С: (logcfg.xml):

    Технологический журнал является мощным инструментом для анализа работы 1С. Мы можем настроить его для сбора информации о блокировках. В файле logcfg.xml нас будут интересовать следующие события:

    • TLOCK: События, связанные с управляемыми блокировками 1С.
    • TDEADLOCK: События взаимоблокировок (deadlocks), когда два или более процесса бесконечно ждут ресурсов друг от друга.
    • TTIMEOUT: События превышения таймаута ожидания блокировки.

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

  2. Анализ блокировок на уровне СУБД (PostgreSQL):

    Даже если технологический журнал 1С не выявил проблем с управляемыми блокировками, конфликты могут происходить на уровне СУБД (транзакционные блокировки). Для анализа мы можем использовать:

    • Представление pg_stat_activity: Показывает информацию об активных сеансах, включая текущий запрос и состояние. Мы можем отслеживать, какие запросы "зависают" или находятся в состоянии ожидания.
    • Представление pg_locks: Предоставляет детальную информацию о текущих блокировках в системе, включая тип блокировки, объект, который заблокирован, и ID процесса, который держит блокировку.
    • Инструменты трассировки и расширенные события PostgreSQL: Если доступно, можем использовать их для более глубокого анализа.

    Пример запроса для просмотра активных процессов и их блокировок:

    
    SELECT
        pid,
        usename,
        datname,
        client_addr,
        application_name,
        backend_start,
        state,
        query_start,
        waiting,
        query
    FROM pg_stat_activity
    WHERE state = 'active'
    ORDER BY query_start DESC;
    

    Пример запроса для поиска блокировок:

    
    SELECT
        blocking_locks.pid AS blocking_pid,
        blocking_activity.usename AS blocking_user,
        blocking_activity.query AS blocking_query,
        blocked_locks.pid AS blocked_pid,
        blocked_activity.usename AS blocked_user,
        blocked_activity.query AS blocked_query
    FROM pg_catalog.pg_locks blocked_locks
    JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
    JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
        AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
        AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
        AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
        AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
        AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
        AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
        AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
        AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
        AND blocking_locks.pid != blocked_locks.pid
    JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
    WHERE NOT blocked_locks.granted;
    
  3. Параметр "Время ожидания блокировки данных" в 1С:

    В настройках информационной базы 1С (через Конфигуратор: Администрирование -> Настройка информационной базы -> Параметры -> СУБД) существует параметр "Время ожидания блокировки данных". Временное увеличение этого параметра (например, до 300 секунд) может помочь снизить количество таймаутов, позволяя операциям дождаться снятия блокировок. Однако это скорее временное решение для анализа, а не устранение первопричины.

  4. Перезапуск службы сервера 1С:Предприятия:

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

Возможные шаги по устранению проблемы

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

  1. Временно отключите модуль Битрикс24:

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

  2. Оптимизируйте настройки PostgreSQL:

    Пересмотрите и настройте файл postgresql.conf согласно рекомендациям, изложенным выше (особенно max_connections, shared_buffers, work_mem, параметры WAL). Также убедитесь в корректности pg_hba.conf и локали базы данных. После изменений обязательно перезапустите службу PostgreSQL.

  3. Проверьте версию и целостность установки PostgreSQL для 1С:

    Убедитесь, что используемая версия PostgreSQL является той, которую 1С поддерживает и рекомендует (обычно это специализированная сборка 1С). Проверьте наличие и корректность модуля mchar.

  4. После настройки, повторно включите модуль и мониторьте:

    Как только настройки PostgreSQL будут оптимизированы, мы можем повторно включить модуль Битрикс24. Мы должны провести повторное перепроведение документов или восстановление последовательности, внимательно наблюдая за поведением системы.

  5. Используйте технологический журнал 1С для выявления конкретных блокировок:

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

  6. Проверьте обновления модуля Битрикс24 и платформы 1С:

    Убедитесь, что у вас установлены последние обновления как для платформы 1С:Предприятие, так и для модуля синхронизации Битрикс24. Разработчики постоянно выпускают исправления и оптимизации, которые могут решить вашу проблему.

  7. Обратитесь к разработчику модуля с подробным логом блокировок:

    Если проблема сохраняется после всех вышеуказанных шагов, соберите всю собранную информацию (логи 1С, результаты запросов к pg_stat_activity и pg_locks, описание настроек PostgreSQL) и предоставьте ее разработчику модуля Битрикс24. С такими данными им будет гораздо проще диагностировать проблему, которая может крыться в специфике реализации модуля или его взаимодействии с определенными версиями платформы и СУБД.

  8. Рассмотрите альтернативные механизмы обмена:

    В случае, если проблема не решается, и она критична для бизнес-процессов, возможно, стоит рассмотреть альтернативные подходы к синхронизации с Битрикс24, или выполнять критические операции (перепроведение) в часы минимальной нагрузки, когда обмен не активен, либо временно отключать обмен на время этих операций.

Решение проблемы "Ошибка разделенного доступа к базе данных" требует системного подхода. Мы должны последовательно исключать возможные причины, начиная от общих настроек СУБД и заканчивая детальным анализом работы конкретного модуля. Только так мы сможем добиться стабильной и эффективной работы вашей информационной системы 1С:Предприятия.

← На главную