В практике автоматизации часто возникает задача интеграции 1С со сторонними системами, например, со СКУД (Системами контроля и управления доступом). Одной из популярных систем является Кронверк, использующая в качестве хранилища базу данных Firebird (файлы с расширением .fdb). В этой статье мы подробно разберем, как установить стабильное соединение между 1С и Firebird, исправим типовые ошибки подключения и оптимизируем код загрузки данных.
Прежде чем приступать к написанию кода в 1С, необходимо подготовить среду окружения. Для работы через COM-объект нам потребуется установленный в системе ODBC-драйвер для Firebird.
Важный нюанс: разрядность (битовость) драйвера должна строго соответствовать разрядности приложения 1С, которое инициирует подключение. Если вы используете 32-битный клиент 1С (что встречается чаще всего), необходимо установить именно 32-битный ODBC Firebird Driver, даже если сама операционная система 64-битная. Если же код выполняется на стороне 64-битного сервера 1С, потребуется 64-битный драйвер.
Одной из первых проблем, с которой сталкиваются разработчики, является ошибка Unable to complete network request to host. Она возникает, когда путь к файлу указан неверно или не определен протокол взаимодействия. Рассмотрим правильный формат строки подключения.
Проанализируем ситуацию: просто указать локальный путь E:\base.fdb часто бывает недостаточно, так как сервер Firebird ожидает обращения через сетевой протокол. Правильнее указывать путь с использованием имени хоста или IP-адреса.
Разберем пример кода для инициализации соединения:
&НаКлиенте
Процедура ПодключитьсяКБазе()
ПутьКБазе = "localhost:E:\ibnet.fdb"; // Указываем хост и полный путь
мСоединение = Новый COMОбъект("ADODB.Connection");
// Формируем Connection String
мСоединение.ConnectionString = "driver=Firebird/InterBase® driver;
|Dialect=3;
|CHARSET=utf-8;
|Uid=SYSDBA;
|Pwd=masterkey;
|Dbname=" + СокрЛП(ПутьКБазе);
мСоединение.ConnectionTimeOut = 60;
мСоединение.CursorLocation = 3; // adUseClient
Попытка
мСоединение.Open();
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если вы получили ошибку Your user name and password are not defined, это означает, что параметры Uid и Pwd указаны неверно или не воспринимаются сервером. В стандартных инсталляциях Firebird по умолчанию используется пользователь SYSDBA с паролем masterkey.
Обратите внимание на регистр: иногда требуется вводить логин заглавными буквами. Также в некоторых версиях СКУД разработчики меняют стандартный пароль. Если база принадлежит сторонней системе, стоит уточнить реквизиты доступа в документации к этой системе.
Для повышения надежности и удобства администрирования рекомендуется использовать файл aliases.conf, который находится в корневой папке установленного сервера Firebird. Выясним, как это упрощает работу:
aliases.conf на сервере, где лежит база.skud_base = E:\Data\ibnet.fdb.Dbname можно указывать просто IP_Сервера:skud_base.Рассмотрим ситуацию, когда соединение установлено, но данные загружаются некорректно. Распространенная ошибка — попытка одновременного перебора двух разных наборов записей (Recordset) в одном цикле. Посмотрим на примере, как нельзя делать, и как исправить этот подход.
Ошибочный подход: использование двух независимых запросов и одного метода MoveNext. В этом случае данные о сотрудниках и их подразделениях перемешаются, так как их количество и порядок в таблицах базы СКУД не совпадают.
Правильный подход: использование SQL-запроса с соединением таблиц через JOIN. Это гарантирует, что каждому сотруднику будет соответствовать именно его подразделение.
&НаКлиенте
Функция ВыполнитьЗагрузку()
Connection = ВыполнитьПодключениеКБД();
Если Connection = Неопределено Тогда Возврат Ложь; КонецЕсли;
RecordSet = Новый COMОбъект("ADODB.Recordset");
// Используем JOIN для объединения сотрудников (OWNER) и отделов (WORKSITE)
ТекстЗапроса = "
|SELECT
| O.OW_LASTNAME,
| O.OW_FIRSTNAME,
| O.OW_MIDDLENAME,
| O.OW_ID,
| W.WS_FULLNAME
|FROM OWNER O
|LEFT JOIN WORKSITE W ON O.OW_WS_ID = W.WS_ID
|WHERE O.OW_IS_DELETED = 0"; // Пример фильтра по активным сотрудникам
Попытка
RecordSet.Open(ТекстЗапроса, Connection);
Исключение
Сообщить("Ошибка в SQL запросе: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Пока RecordSet.EOF = 0 Цикл
ФИО = СтрШаблон("%1 %2 %3",
RecordSet.Fields("OW_LASTNAME").Value,
RecordSet.Fields("OW_FIRSTNAME").Value,
RecordSet.Fields("OW_MIDDLENAME").Value);
КодСКУД = Строка(RecordSet.Fields("OW_ID").Value);
ПодразделениеНаименование = RecordSet.Fields("WS_FULLNAME").Value;
// Здесь вызываем серверную процедуру для поиска или создания сотрудника в 1С
ОбработатьДанныеСотрудника(ФИО, КодСКУД, ПодразделениеНаименование);
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();
КонецФункции
Если при получении данных из Firebird вы видите непонятные символы («кракозябры»), значит, кодировка в базе данных отличается от UTF-8. В старых версиях Firebird (1.5, 2.0) часто использовалась кодировка WIN1251. В этом случае в строке подключения замените CHARSET=utf-8 на CHARSET=WIN1251.
Проанализируем еще один современный способ интеграции, доступный в платформе 1С 8.3 — механизм Внешних источников данных. Вместо написания кода на ADO, вы можете добавить базу Firebird непосредственно в дерево конфигурации:
ВЫБРАТЬ ... ИЗ ВнешнийИсточникДанных.Кронверк.Таблица.OWNER).Преимущество этого метода: вы работаете со сторонними данными так же, как со справочниками 1С, с поддержкой типизации и визуального конструирования запросов. Для интерактивного создания и тестирования параметров подключения к сторонним СУБД подойдёт конструктор подключения к внешним источникам.
Подводя итог, можно сказать, что наиболее стабильным решением для подключения к Firebird является использование ADODB.Connection с явно указанным IP-адресом сервера и корректно настроенным ODBC-драйвером нужной разрядности. Не забывайте использовать JOIN в SQL-запросах, чтобы избежать логических ошибок при сопоставлении данных из разных таблиц.