Когда имеется целый зоопарк баз на SQL (да и в других случаях) бывает необходимо определить запущена база монопольно или нет из другой программы (будь то 1С или скрипт автоматического обмена)
Как известно 7-ка при монопольном режиме ставит SQL базу в single user. Получив значение этой переменной SQL Server для базы можно определить монопольно ли кто-либо в ней или нет (хотя конечно single user может быть включен и другими средствами, но опустим это как частный случай). Получить значение данного свойства от SQL Server можно выполнив запрос:
EXEC sp_dboption 'BASE', 'single user'
Для этого для SQL версии можно воспользоваться следующим кодом 1С 7.7:
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "EXEC sp_dboption 'BASE', 'single user'";
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Попытка
Если СокрЛП(Врег(ТЗ.ПолучитьЗначение(1, 2))) = "ON" Тогда
Сообщить("Монопольно");
Иначе
Сообщить("Не монопольно");
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Манипулируя этой переменной можно из запущенной 1С снять single user для текущей базы данных, при этом 1С при запуске будет воспринимать базу как запущенную монопольно и не даст войти другим пользователям. Это возможно сделать используя следующий T-SQL скрипт:
declare @CurDBName sysname
set @CurDBName = db_name()
exec sp_dboption @CurDBName, 'single user', 'false'
В 1С это выглядит так:
Если МонопольныйРежим() = 1 Тогда
ТекстЗапроса = "
|declare @CurDBName sysname
|set @CurDBName = db_name()
|exec sp_dboption @CurDBName, 'single user', 'false'
|";
ЗапросТекущаяБаза = СоздатьОбъект("ODBCRecordset");
Если ЗапросТекущаяБаза.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Не удалось снять Single User Mode" + РазделительСтрок + ЗапросТекущаяБаза.ПолучитьОписаниеОшибки(), "!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;