В платформе 1С:Предприятие 7.7, в отличие от современных версий 8.x, отсутствуют развитые встроенные средства для программного получения списка активных сессий в одну строку кода. Тем не менее, задача мониторинга подключенных пользователей остается актуальной для администраторов и разработчиков, особенно в периоды регламентных работ или для контроля лицензий. Рассмотрим подробно все доступные способы решения этой задачи: от использования внешних библиотек до анализа системных файлов операционной системы.
Одним из самых популярных и надежных программных методов является использование возможностей библиотеки FormEx. Эта компонента расширяет стандартный функционал 7.7 и предоставляет прямой метод для получения списка пользователей. Разберем, как это реализовать в коде.
Для начала нам необходимо создать объект типа Сервис и вызвать соответствующий метод. Мы получим таблицу значений, которую затем сможем вывести в отчет или обработать программно.
// Создаем объект расширения
Сервис = СоздатьОбъект("Сервис");
// Создаем таблицу значений для приема данных
ТЗПользователей = СоздатьОбъект("ТаблицаЗначений");
// Получаем список активных пользователей
// Режим определяет формат возвращаемых данных
Реж = 1;
Сервис.ПолучитьСписокАктивныхПользователей(ТЗПользователей, Реж);
// Теперь в ТЗПользователей содержатся данные о сессиях
ТЗПользователей.ВыбратьСтроки();
Пока ТЗПользователей.ПолучитьСтроку() = 1 Цикл
Сообщить("Пользователь: " + ТЗПользователей.ИмяПользователя + " вошел в: " + ТЗПользователей.ВремяВхода);
КонецЦикла;
Этот метод хорош тем, что он работает быстро и не требует парсинга текстовых файлов вручную. Однако он требует регистрации библиотеки FormEx.dll на рабочей станции или сервере.
Проанализируем механику работы самой платформы 1С 7.7. При подключении пользователя к базе данных в каталоге SYSLOG, который находится внутри папки информационной базы, создается или обновляется файл links.tmp. Этот файл содержит текстовую информацию о текущих сессиях.
Рассмотрим структуру этого файла. Каждая запись в нем обычно содержит сетевое имя компьютера и имя пользователя 1С. Мы можем прочитать этот файл как обычный текстовый документ. Посмотрим на пример кода для парсинга этого файла:
Текст = СоздатьОбъект("Текст");
ПутьКФайлу = КаталогИБ() + "SYSLOG\links.tmp";
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
Текст.Открыть(ПутьКФайлу);
Для Ном = 1 По Текст.КоличествоСтрок() Цикл
Стр = Текст.ПолучитьСтроку(Ном);
// Здесь можно реализовать логику разделения строки
// Обычно данные разделены спецсимволами или пробелами
Сообщить("Запись о подключении: " + Стр);
КонецЦикла;
КонецЕсли;
Важное замечание: Метод парсинга links.tmp имеет существенный недостаток. Если сеанс пользователя завершился аварийно (например, «вылетела» ошибка или пропало питание), запись в файле может остаться. Поэтому данный список не всегда является на 100% достоверным.
Выясним причину, по которой многие разработчики предпочитают создавать собственные механизмы контроля активности. Чтобы гарантированно знать, что пользователь находится в базе, можно использовать механизм объектных блокировок. Разберем по шагам, как это реализовать:
Пользователи (если его еще нет).ПриНачалеРаботыСистемы (в глобальном модуле) будем находить элемент текущего пользователя и пытаться его заблокировать.ПриЗавершенииРаботыСистемы) блокировка снимется автоматически.Для проверки списка активных пользователей нам достаточно попытаться заблокировать элементы справочника. Если элемент не блокируется — значит, пользователь в данный момент работает в системе.
// Пример проверки активности пользователя "Иванов"
Спр = СоздатьОбъект("Справочник.Пользователи");
Если Спр.НайтиПоНаименованию("Иванов", 0, 1) = 1 Тогда
Если Заблокировать(Спр.ТекущийЭлемент()) = 0 Тогда
Сообщить("Пользователь Иванов активен (элемент заблокирован им)");
Иначе
Разблокировать(Спр.ТекущийЭлемент());
Сообщить("Пользователь Иванов не в сети");
КонецЕсли;
КонецЕсли;
Этот метод считается одним из самых надежных, так как блокировка на уровне СУБД или файловой системы всегда сбрасывается операционной системой при закрытии приложения, даже аварийном.
Рассмотрим ситуацию, когда программный код писать не требуется, а нужно быстро оценить ситуацию администратору. В комплекте с 1С 7.7 поставляется утилита 1cv7mon.exe (Монитор). Она позволяет видеть список активных пользователей и историю их действий, если в базе включено ведение журнала регистрации.
Если же мы работаем в терминальном режиме (RDP), мы можем воспользоваться командами командной строки Windows для анализа процессов 1cv7s.exe:
qwinsta — покажет список всех активных RDP-сессий.tasklist /v — позволит увидеть, под какими именами запущены процессы 1С.Если ваша база данных работает на SQL-сервере, проанализируем ситуацию на уровне сервера баз данных. Мы можем выполнить системную процедуру sp_who2 или сделать запрос к таблице sysprocesses. Это позволит увидеть все активные соединения с конкретной базой данных.
Хотя SQL-сервер не знает "имени пользователя 1С", он знает сетевое имя компьютера (поле hostname). Сопоставив эти данные, администратор может быстро вычислить, кто из сотрудников удерживает базу.
-- Пример SQL-запроса для получения списка соединений
SELECT spid, status, loginame, hostname, db_name(dbid) as DBName
FROM master.dbo.sysprocesses
WHERE dbid = DB_ID('ИмяВашейБазы')
Подведем итог. Для оперативного программного получения списка пользователей внутри 1С лучше всего подходит FormEx. Если вы хотите построить максимально надежную систему контроля без внешних библиотек — используйте метод блокировки элементов справочника. Для административных нужд вполне достаточно штатного Монитора или анализа открытых файлов на сервере с помощью команды openfiles или утилиты Handle от Microsoft.