При организации обмена данными между информационными базами 1С часто применяется технология COM-соединения. Однако при попытке подключиться к базе, работающей на платформе 8.3, разработчики могут столкнуться с исключением:
Ошибка при выполнении операции с информационной базой: Несовместимая версия файла базы данных '.../1Cv8.1CD'
Разберем причины возникновения этой ошибки, выясним, почему для 1С 8.3 обязательно требуется соответствующий коннектор, и посмотрим на пример правильного кода функции подключения.
Проанализируем архитектурные особенности работы платформы 1С:Предприятие:
1Cv8.1CD) был существенно модернизирован (появилась поддержка страниц увеличенного размера, оптимизация для работы с большими таблицами). Старая библиотека comcntr.dll от платформы 8.2 (V82.COMConnector) физически не умеет работать с новым форматом файла и сообщает о несовместимости.V83.COMConnector. Попытка использовать V82.COMConnector для баз 8.3 логически некорректна.Посмотрим на частую ошибку в исходном коде: вызов метода в блоке Попытка...Исключение с заглушением реальной ошибки через модальные окна, а также отсутствие возвращаемого значения функции. Модальные окна вроде Предупреждение() нарушают работу серверного кода и заблокированы в управляемом интерфейсе, а пустая обработка исключения скрывает технические подробности сбоя.
Рассмотрим правильный и универсальный вариант экспортной функции подключения:
Функция ПолучитьПодключениеКОсновнойБД(ПутьКБазе, ИмяПользователя, ПарольПользователя) Экспорт
// Формируем строку подключения для файловой базы данных
ПараметрыПодключения = "File=""" + ПутьКБазе + """; Usr=""" + ИмяПользователя + """; Pwd=""" + ПарольПользователя + """;";
Попытка
COMКоннектор = Новый COMОбъект("V83.COMConnector");
БазаПодключения = COMКоннектор.Connect(ПараметрыПодключения);
Возврат БазаПодключения;
Исключение
// Обязательно выводим понятное описание ошибки в журнал или пользователю
ТекстОшибки = "Ошибка подключения к информационной базе: " + ОписаниеОшибки();
Сообщить(ТекстОшибки);
ЗаписьЖурналаРегистрации("Интеграция.COM", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
Возврат Неопределено;
КонецПопытки;
КонецФункции
Посмотрим, как правильно вызывать эту функцию и обрабатывать полученное соединение в коде обработки:
Процедура ВыполнитьОбмен()
Путь = "\\server\rzn_kassa";
Пользователь = "Администратор";
Пароль = "";
Соединение = ПолучитьПодключениеКОсновнойБД(Путь, Пользователь, Пароль);
Если Соединение = Неопределено Тогда
Сообщить("Не удалось установить COM-соединение с удаленной базой.");
Возврат;
КонецЕсли;
Попытка
// Пример выборки данных через внешнее соединение
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Товар из удаленной базы: " + Выборка.Наименование);
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении данных: " + ОписаниеОшибки());
КонецПопытки;
// Обязательно освобождаем память и закрываем сеанс внешнего подключения
Соединение = Неопределено;
КонецПроцедуры
Разберем технические тонкости, которые необходимо учитывать при промышленной эксплуатации COM-соединений:
comcntr.dll, вызов Новый COMОбъект("V83.COMConnector") завершится ошибкой «Класс не зарегистрирован». Для совмещения разрядностей регистрируют COM+-приложение в Службах компонентов Windows.regsvr32 "C:\Program Files\1cv8\8.3.X.XXXX\bin\comcntr.dll"\\server\share) выполняется на сервере (в процедурах &НаСервере), убедитесь, что учетная запись службы сервера 1С (обычно usr1cv8) имеет полные права доступа к общей сетевой папке.Неопределено.