При организации автоматического обмена данными между информационными базами 1С 7.7 через OLE-соединение программисты часто сталкиваются с ситуацией, когда в монопольном режиме (с параметром /M) метод Initialize отрабатывает без нареканий, но при попытке немонопольного подключения возвращает ошибку или значение 0. В этой статье мы подробно проанализируем причины такого поведения платформы и разберем способы решения данной проблемы.
Проанализируем ключевые факторы, из-за которых база 1С 7.7 может отказываться подключаться через OLE без флага монопольного доступа:
V1CEnterprise.Application или V77.Application, операционная система вызывает тот класс COM/OLE, который был зарегистрирован в Windows последним. Если последней запускалась однопользовательская (локальная) версия 1С 7.7 (1cv7l.exe), она физически не поддерживает сетевую и многопользовательскую работу. Локальная версия сможет открыть базу только в монопольном режиме, а попытка обычного входа приведет к ошибке инициализации.1cv7.lck и 1cv7.mlk). Если у OLE-пользователя в Конфигураторе не задан индивидуальный Каталог пользователя или указан каталог, под которым уже запущен другой активный сеанс, немонопольный запуск блокируется.*.cdx): В немонопольном режиме платформа критична к целостности всех DBF-индексов. При наличии сбоев в индексах запуск через OLE завершается ошибкой без вывода окна переиндексации, тогда как монопольный режим может игнорировать или автоматически исправлять часть ошибок./D, /N, /P) препятствует корректному запуску OLE-сервера.Рассмотрев проблему вызова не той версии платформы, применим наиболее надежное решение: заменим универсальный ProgID на явное вызов сетевой или SQL-версии 1С 7.7.
Вместо универсального V1CEnterprise.Application используем:
V77M.Application — для сетевой (многопользовательской) базы 1С 7.7;V77S.Application — для SQL-версии 1С 7.7.Разберем пример кода создания OLE-объекта с явным указанием сетевой компоненты:
// Создаем объект сетевой версии 1С 7.7
v7 = СоздатьОбъект("V77M.Application");
// Формируем параметры подключения
ПутьКБазе = "C:\Data\УпрБаза";
Логин = "Auto";
Пароль = "123";
КомСтр = "/d""" + СокрЛП(ПутьКБазе) + """ /n" + СокрЛП(Логин) + " /p" + СокрЛП(Пароль);
// Выполняем инициализацию без вывода сплэш-экрана
БазаОткрыта = v7.Initialize(v7.RMTrade, КомСтр, "NO_SPLASH_SHOW");
Если БазаОткрыта = 0 Тогда
Сообщить("Ошибка подключения к базе через OLE!");
Иначе
Сообщить("Успешное немонопольное подключение!");
КонецЕсли;
Посмотрим на пример правильной сборки параметров командной строки с обработкой монопольного и немонопольного режимов, а также экранированием путей кавычками:
БазаИсточник = СоздатьОбъект("V77M.Application");
// Экранируем путь к базе кавычками на случай наличия пробелов
КомСтр = "/d""" + СокрЛП(ПутьКБазе) + """";
Если Монопольно = 1 Тогда
КомСтр = " /m " + КомСтр;
КонецЕсли;
Если ПустаяСтрока(Пользователь) = 0 Тогда
КомСтр = КомСтр + " /n" + СокрЛП(Пользователь);
КонецЕсли;
Если ПустаяСтрока(Пароль) = 0 Тогда
КомСтр = КомСтр + " /p" + СокрЛП(Пароль);
КонецЕсли;
Состояние("Подождите, выполняется подключение к OLE-серверу...");
Рез = БазаИсточник.Initialize(БазаИсточник.RMComplex, КомСтр, "NO_SPLASH_SHOW");
Если Рез = 0 Тогда
Предупреждение("Не удалось установить соединение с базой данных!");
КонецЕсли;
Выясним, как правильная настройка пользователя устраняет блокировки при немонопольном доступе:
Robot_OLE).usr_ole внутри каталога базы или отдельно на диске).Важно: Убедимся, что под этим пользователем не запущена работа других фоновых процессов или обычных пользователей в интерактивном режиме.
Если OLE-соединение продолжает выдавать ошибку при немонопольном вызове, проанализируем состояние файловой структуры базы данных:
1cv7.lck и 1cv7.mlk).После выполнения перечисленных шагов немонопольное подключение через OLE с использованием V77M.Application будет работать стабильно.