Как устранить блокировку пользователей Firebird при подключении из 1С через ADODB

Программист 1С v8.3 (Обычные формы) Промышленность, строительство и АПК
← На главную

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

Анализ ситуации: почему возникают блокировки?

Рассмотрим типичный сценарий: на сервере или локальном компьютере установлена специализированная программа (CAD), которая использует свою версию Firebird. При попытке подключиться к этой же базе из 1С через ADODB.Connection пользователи начинают получать сообщения о невозможности доступа. Выясним основные причины такого поведения:

  1. Наличие нескольких служб Firebird: Часто для разработки или тестов устанавливается дополнительный экземпляр Firebird. Если обе службы пытаются работать с одним и тем же файлом базы данных .FDB, неизбежно возникают конфликты доступа.
  2. Использование Embedded-версии: Если в строке подключения или через используемые библиотеки (например, fbembed.dll, переименованную в fbclient.dll) задействован встроенный движок, он открывает файл базы в монопольном режиме. В этом случае серверная служба Firebird уже не сможет открыть этот файл.
  3. Конфликт сетевых портов: По умолчанию Firebird использует порт 3050. Если запущено две службы, одна из них может перехватить запросы, или же вы можете подключаться не к той службе, которая реально обслуживает базу данных CAD-системы.

Шаг 1: Идентификация работающих служб и используемых портов

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

Воспользуемся командной строкой для определения того, какой процесс занимает сетевой порт. Введем команду:

netstat -a -n -o | findstr :3050

Эта команда покажет нам PID (идентификатор процесса), который слушает стандартный порт Firebird. После этого в Диспетчере задач на вкладке "Подробности" мы сможем сопоставить этот PID с конкретным исполняемым файлом fbserver.exe или fb_inet_server.exe. Это позволит понять, какой путь к программе является "родным" для текущей базы данных.

Шаг 2: Правильная настройка строки подключения ADODB

Посмотрим на пример строки подключения, которая может вызывать проблемы, и разберем ее параметры:


СтрокаПодключения = "Driver=Firebird/InterBase(r) driver;
                     Dbname=localhost/3050:I:\Basics\Base.FDB;
                     UID=sysdba;
                     PWD=masterkey;
                     CHARSET=UTF8;
                     client=C:\Program Files\Firebird\Firebird_2_5\bin\fbclient.dll;";

Здесь крайне важны следующие моменты:

Шаг 3: Устранение конфликтов в firebird.conf

Если нам действительно необходимо держать две службы Firebird на одном сервере (например, одна для 1С, другая для стороннего ПО), проанализируем файл конфигурации firebird.conf, который находится в папке установки сервера.

Для предотвращения конфликтов во второй установке (вашей) необходимо изменить параметр RemoteServicePort:

  1. Найдите строку #RemoteServicePort = 3050.
  2. Раскомментируйте ее и измените порт, например: RemoteServicePort = 3051.
  3. Перезапустите службу.

Теперь в строке подключения в 1С необходимо будет указывать localhost/3051:. Это разделит потоки запросов, и службы перестанут мешать друг другу на сетевом уровне.

Шаг 4: Разрядность библиотек и 1С

Частая причина ошибки unable to complete network request to host localhost заключается в несовпадении разрядности. Разберем этот нюанс подробнее:

Если ваша 1С является 32-битной (что часто встречается для клиентских приложений), она не сможет загрузить 64-битную библиотеку fbclient.dll, даже если сам сервер Firebird 64-битный. В этом случае вам нужно подложить в строку подключения путь к 32-битной версии клиентской библиотеки. При этом сама библиотека прекрасно свяжется с 64-битным сервером по сетевому протоколу.

Шаг 5: Настройка уровней изоляции транзакций в ADODB

Иногда блокировки возникают не из-за способа подключения, а из-за того, как ADODB открывает транзакции. По умолчанию уровень изоляции может быть слишком строгим. Для Firebird в среде 1С рекомендуется использовать режим Read Committed.

Рассмотрим пример кода на языке 1С для правильной настройки объекта Connection:


Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаПодключения;
Connection.CursorLocation = 3; // adUseClient
Connection.Open();

// Установка уровня изоляции транзакции
Connection.IsolationLevel = 256; // adXactReadCommitted

Использование Read Committed позволяет вашим запросам из 1С читать данные, не блокируя других пользователей, которые в этот момент могут вносить изменения через CAD-систему. Это критически важно для обеспечения параллельной работы.

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

Проанализируем еще несколько технических аспектов, которые помогут избежать проблем:

Подводя итог, можно сказать, что решение проблемы блокировок в Firebird при работе с 1С всегда кроется в четком разделении ресурсов между службами. Правильный выбор порта, использование корректной клиентской библиотеки нужной разрядности и отказ от локальных (не сетевых) протоколов подключения гарантируют стабильную одновременную работу 1С и CAD-систем.

← На главную