При интеграции 1С с внешними базами данных, такими как Firebird (часто используемыми в CAD-системах, например, Базис-Мебельщик), программисты часто сталкиваются с ситуацией, когда подключение из 1С блокирует работу всех остальных пользователей. В этой статье мы подробно разберем, почему возникает монопольный захват базы, как правильно настроить совместный доступ и устранить конфликты между несколькими экземплярами серверов Firebird на одном компьютере.
Рассмотрим типичный сценарий: на сервере или локальном компьютере установлена специализированная программа (CAD), которая использует свою версию Firebird. При попытке подключиться к этой же базе из 1С через ADODB.Connection пользователи начинают получать сообщения о невозможности доступа. Выясним основные причины такого поведения:
.FDB, неизбежно возникают конфликты доступа.fbembed.dll, переименованную в fbclient.dll) задействован встроенный движок, он открывает файл базы в монопольном режиме. В этом случае серверная служба Firebird уже не сможет открыть этот файл.3050. Если запущено две службы, одна из них может перехватить запросы, или же вы можете подключаться не к той службе, которая реально обслуживает базу данных CAD-системы.Проанализируем состояние системы. Если мы видим, что в списке служб Windows присутствуют два и более экземпляра Firebird, нам необходимо точно определить, какой из них обслуживает нужную базу. Разберем, как это сделать с помощью системных утилит.
Воспользуемся командной строкой для определения того, какой процесс занимает сетевой порт. Введем команду:
netstat -a -n -o | findstr :3050
Эта команда покажет нам PID (идентификатор процесса), который слушает стандартный порт Firebird. После этого в Диспетчере задач на вкладке "Подробности" мы сможем сопоставить этот PID с конкретным исполняемым файлом fbserver.exe или fb_inet_server.exe. Это позволит понять, какой путь к программе является "родным" для текущей базы данных.
Посмотрим на пример строки подключения, которая может вызывать проблемы, и разберем ее параметры:
СтрокаПодключения = "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;";
Здесь крайне важны следующие моменты:
localhost/3050: принудительно заставляет драйвер использовать сетевой протокол TCP/IP. Если убрать эту часть и оставить только путь к файлу, драйвер может попытаться использовать локальный протокол (XNET), что часто приводит к монопольному захвату файла движком клиента. Всегда используйте сетевой адрес для многопользовательской работы.fbclient.dll должен указывать на библиотеку той версии Firebird, которая запущена как основная служба для этой базы. Если CAD-программа использует Firebird 2.1, а вы подсовываете ей библиотеку от 2.5, возможны непредсказуемые блокировки на уровне структуры файла (ODS).Если нам действительно необходимо держать две службы Firebird на одном сервере (например, одна для 1С, другая для стороннего ПО), проанализируем файл конфигурации firebird.conf, который находится в папке установки сервера.
Для предотвращения конфликтов во второй установке (вашей) необходимо изменить параметр RemoteServicePort:
#RemoteServicePort = 3050.RemoteServicePort = 3051.Теперь в строке подключения в 1С необходимо будет указывать localhost/3051:. Это разделит потоки запросов, и службы перестанут мешать друг другу на сетевом уровне.
Частая причина ошибки unable to complete network request to host localhost заключается в несовпадении разрядности. Разберем этот нюанс подробнее:
Если ваша 1С является 32-битной (что часто встречается для клиентских приложений), она не сможет загрузить 64-битную библиотеку fbclient.dll, даже если сам сервер Firebird 64-битный. В этом случае вам нужно подложить в строку подключения путь к 32-битной версии клиентской библиотеки. При этом сама библиотека прекрасно свяжется с 64-битным сервером по сетевому протоколу.
Иногда блокировки возникают не из-за способа подключения, а из-за того, как 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-систему. Это критически важно для обеспечения параллельной работы.
Проанализируем еще несколько технических аспектов, которые помогут избежать проблем:
LocalSystem или NetworkService), имеет полные права на папку с базой данных. Если одна служба создаст временный файл или изменит заголовок БД, а у другой не будет прав на чтение/запись, возникнет ошибка доступа.localhost:), механизмы управления кэшем могут конфликтовать с серверным процессом, что приведет к блокировке или повреждению данных. Всегда работайте через TCP/IP стек.Подводя итог, можно сказать, что решение проблемы блокировок в Firebird при работе с 1С всегда кроется в четком разделении ресурсов между службами. Правильный выбор порта, использование корректной клиентской библиотеки нужной разрядности и отказ от локальных (не сетевых) протоколов подключения гарантируют стабильную одновременную работу 1С и CAD-систем.