Служба Windows с веб-интерфейсом для учёта информационных баз 1С:Предприятие 8.3. Собирает базы со всех кластеров 1С, показывает, где лежат их базы данных на MS SQL Server и PostgreSQL, какие группы Active Directory дают к ним доступ и где они опубликованы на IIS. Публикует сводные таблицы в Confluence и умеет восстанавливать DEV-базы из архива бэкапов.
- Находит кластеры 1С на серверах через WMI (службы
ragentиras), а если WMI недоступен, то по открытым TCP-портам. - Опрашивает кластеры через
rac.exe: список баз, версия платформы, сервер и имя базы в СУБД. - Подключается к СУБД и показывает файлы данных и журналов, их размеры и пути, модель восстановления, пользователей.
- Сопоставляет базу с группами AD (
rdp_1c_*,1cbases*), показывает участников групп и позволяет добавлять и удалять их. - Находит веб-публикации баз на IIS и выводит ссылки на них.
- Раз в сутки публикует таблицы DEV, PROD и SA_INFO в Confluence; при ошибке присылает письмо.
- Даёт скрытые консоли: управление службами 1С, журнал аудита, восстановление DEV-баз из архива бэкапов.
OneSGetDatabases/
├── src/
│ ├── OneSGetDatabases.Core/ # опрос кластеров, rac/RAS, СУБД, AD, IIS, Confluence, восстановление, кэш
│ └── OneSGetDatabases.Web/ # ASP.NET Core API + веб-интерфейс + служба Windows (порт 5070)
├── tests/
│ └── OneSGetDatabases.Tests/ # xUnit, FluentAssertions, Moq
├── build.ps1 # сборка, тесты, публикация в publish\Web
├── Directory.Build.props # версия и общие настройки сборки
└── LICENSE
- .NET 10, C# 14, асинхронный код без блокирующих вызовов.
- ASP.NET Core (контроллеры) на Kestrel, запуск как служба Windows
OneSGetDatabasesWeb. - Веб-интерфейс на чистом JavaScript и CSS, без сборщиков.
- СУБД:
Microsoft.Data.SqlClient,Npgsql. AD:System.DirectoryServices. WMI:System.Management. - Кэш баз, групп AD и состояния кластеров хранится в памяти и в каталоге
cacheрядом со службой, поэтому после перезапуска данные доступны сразу, до окончания нового опроса.
- Список серверов задаётся в
ClusterDiscovery:Servers, кластеры и порты RAS на них находятся автоматически. - Запросы к
rac.exeвыполняются параллельно. Если RAS отвечает медленно, запрос повторяется с удвоенным таймаутом. - Авторизация подбирается автоматически: без учётной записи, с администратором кластера (
--cluster-user), с администратором центрального сервера (--agent-user). - Если rac отказал, кластер помечается как «Ошибка» или «Ошибка авторизации» с текстом ответа rac, а не как пустой. Причина видна в окне «Кластеры → Диагностика» и в логе службы.
- WMI-запрос к хосту ограничен по времени (
ClusterDiscovery:WmiQueryTimeoutSeconds), поэтому один медленный сервер не задерживает весь опрос. - Если опрос вернул 0 баз, а в кэше они есть, кэш не перезаписывается: пустой результат почти всегда означает ошибку конфигурации или сети.
- При опросе служба читает
applicationHost.configна серверах кластеров (и наIisPublications:ExtraHosts) иdefault.vrdкаждого приложения IIS через административную шаруC$. - Публикация связывается с базой по строке подключения из
default.vrd: имени базы (Ref) и серверу кластера (Srvr). - Показывается только основная публикация: её имя совпадает с именем базы, регистр не важен. Служебные публикации той же базы (
/<база>_,/<база>_Web, публикации под другим именем) не выводятся. - Публикация учитывается, только если сайт IIS стоит на сервере кластера базы или на сервере, куда указывает сервис Consul базы. Копии публикации на других серверах не выводятся, даже если
default.vrdссылается на эту базу. - На каждую базу выводится одна публикация. Если база опубликована на нескольких серверах, приоритет у адреса через Consul (
*.service.consul), затем у публикации с точным совпадением регистра имени. - Если у базы есть сервис Consul (
app-<база>.service.consul) и он указывает на тот же сервер, что и публикация, ссылка строится через имя Consul с теми же схемой, портом и путём. Это правило важнееIisPublications:BaseUrls. Имя сервиса с_или другими недопустимыми для DNS символами (например,app-UTD_Test) не используется: Consul не отдаёт такие имена по DNS, и ссылка строится поBaseUrlsили привязке IIS. - Иначе адрес берётся из
IisPublications:BaseUrls(например,http://app-dev.service.consul/<база>), а без настройки — из привязки сайта IIS. Публикации с собственным заголовком узла в привязке IIS не переписываются. - В таблице «Информационные базы» колонка «Публикация» показывает полный адрес вместе с
http://. В узкой колонке адрес переносится перед точками имени сервера и перед/; по дефису внутри имени сервера перенос не делается. - Ширины колонок, заданные мышью на широком экране, на узком окне уменьшаются пропорционально, чтобы остальные колонки не сжимались. Сохранённые значения при этом не меняются.
- MS SQL Server и PostgreSQL: размеры и физические пути файлов данных и журналов.
- Модель восстановления, уровень совместимости, состояние базы, пользователи и роли.
- Вкладка «Файлы и размеры СУБД» с выгрузкой в Excel и JSON.
- Сервер СУБД показывается именем машины. Если в кластере указан сервис Consul (
sql-1c-ERP.service.consul), имя берётся из поляAddressэтого сервиса в Consul. Если указан DNS-алиас, берётся каноническое имя из DNS. Экземпляр и порт (\INST,,1433) сохраняются. Исходное имя видно в подсказке, по нему же идёт подключение к СУБД. Если имя машины найти не удалось, выводится имя из кластера.
- Группа доступа базы определяется по имени (
rdp_1c_<база>,1cbases83_<база>и похожие варианты). - Окно группы показывает участников: ФИО, логин, должность, отдел, e-mail, состояние учётной записи. Вложенные группы не выводятся.
- В группах из
ActiveDirectory:ManageableGroupPatternsможно искать пользователей AD, добавлять и удалять участников. Каждое изменение пишется в журнал аудита (AD_ADD_MEMBER,AD_REMOVE_MEMBER).
- Страницы DEV, PROD и SA_INFO обновляются по расписанию (
Scheduler:ConfluenceSyncTime). - Пока кэш баз пуст, публикация не выполняется, чтобы не записать в Confluence пустые таблицы.
- При ошибке публикации отправляется письмо на адрес из
Email:Recipient.
- Таблицы информационных баз и файлов СУБД: поиск, фильтры по среде, кластеру, серверу СУБД и платформе, сортировка. Таблицы помещаются по ширине экрана, длинные значения обрезаются, полный текст виден в подсказке.
- Ширина колонки меняется перетаскиванием разделителя в заголовке: во время перетаскивания видны направляющая линия и ширина в пикселях. Двойной щелчок по разделителю возвращает исходную ширину. Ширины сохраняются в браузере.
- Выбор строк флажками или кликом; выбранные строки можно скопировать в буфер (TSV) или выгрузить в Excel и JSON.
- При наведении на ячейку подсвечиваются ячейки с тем же значением в этой колонке, например все базы на той же версии платформы.
- Текст в таблицах и полях можно выделять и копировать: пока есть выделение, таблицы не перерисовываются.
- Окно «Кластеры» с состоянием каждого кластера и логом опроса.
Открываются сочетанием Ctrl + Alt + клик и видны только в текущей вкладке браузера.
| Консоль | Где кликнуть | Что даёт |
|---|---|---|
| Управление службами 1С | по заголовку «1С: Get Databases» | состояние служб ragent и ras; старт, стоп, перезапуск, перезапуск с очисткой сеансового кэша (snccntx*) |
| Журнал аудита | по плашке версии внизу справа | кто, когда и что сделал: IP и имя компьютера, объект, действие, результат, длительность |
| Восстановление баз | по счётчику «Показано …» внизу слева | восстановление DEV-баз из архива бэкапов SQL Server |
- У каждой строки четыре кнопки: старт, стоп, перезапуск, перезапуск с очисткой кэша. Недоступные в текущем состоянии кнопки выключены. Каждое действие требует подтверждения.
- Во время операции в строке показывается прогресс, остальные службы можно запускать и останавливать параллельно. Над одной службой одновременно выполняется только одна операция.
- Браузер передаёт только сервер, имя службы и действие. Порт кластера, служба RAS и каталог кластера берутся из опроса. Если служба в опросе не найдена, операция отклоняется.
- Остановка затрагивает RAS, агент и его процессы
rphost/rmngr. Какие процессы относятся к кластеру, определяется по родительскому агенту, каталогу кластера или порту. - У операции собственный таймаут: 3 минуты, закрытая вкладка её не прерывает. Если служба остановилась, запуск выполняется в любом случае, даже при сбое очистки или истёкшем таймауте.
- Кэш очищается через административную шару: удаляются папки
snccntx*. Если шара недоступна, используется WMI (cmd.exeна сервере), результат в этом случае не проверяется. Каталог с запрещёнными символами или путь к корню диска отклоняется. - Если у нескольких агентов на сервере общий каталог
srvinfo, очищается только папкаreg_<порт+1>своего кластера. - Все действия и их результат пишутся в журнал аудита.
X-Forwarded-Forучитывается только от локального обратного прокси.
- Источник выбирается из архива
SqlRestore:BackupArchiveRoot(<сервер>\<база>\…, до 3 уровней вложенности, в том числе раскладкаFULL/DIFF/LOG). Каталоги без файлов бэкапа в списке не показываются, есть поиск по имени базы и сервера. - Точка восстановления выбирается в календаре. Перед запуском окно показывает план: какой полный, разностный бэкап и сколько журналов будет применено.
- Цепочка FULL → DIFF → LOG проверяется по LSN из
RESTORE HEADERONLY, учитываются полные бэкапы сCOPY_ONLYи stripe-наборы из нескольких файлов. - Перед восстановлением база переводится в OFFLINE, чтобы рабочие процессы 1С не заняли подключение.
- После восстановления возвращаются владелец базы, пользователи и их роли; при необходимости база переводится в модель Simple со сжатием журнала.
- До изменения базы включается блокировка регламентных заданий 1С через
rac infobase update. Если включить её не удалось, восстановление не начинается. - Разрешены только серверы из
SqlRestore:AllowedTargetServersбезprodв имени. Базы изSqlRestore:ExcludedDatabasesнедоступны ни как источник, ни как цель. - В журнал аудита записывается короткая сводка: источник, цепочка бэкапов (журналы сворачиваются в «Log ×N» с первым и последним временем), число файлов, длительность и пользователи, которым вернули права. Первые десять имён выводятся полностью, дальше «и ещё N». Остальные предупреждения: не больше трёх, каждое до 150 символов. Полный список предупреждений и пользователи без логина на сервере пишутся в лог службы.
- Windows Server 2016 и новее или Windows 10/11 x64.
- .NET 10 Runtime / Hosting Bundle.
- Платформа 1С:Предприятие 8.3 на сервере службы (нужен
rac.exe).
.\build.ps1Скрипт восстанавливает пакеты, собирает решение, запускает тесты и публикует службу в publish\Web. Локальные каталоги cache и logs из папки публикации удаляются, чтобы при выкладке не затереть кэш на сервере.
{
"Kestrel": {
"Endpoints": {
"Http": { "Url": "http://*:5070" }
}
},
"Scheduler": {
"DiscoveryIntervalMinutes": 30,
"EnableAutoSyncConfluence": true,
"ConfluenceSyncTime": "04:00",
"ConfluenceSyncIntervalHours": 24
},
"Rac": {
"RacPath": "C:\\Program Files\\1cv8\\8.3.25.1445\\bin\\rac.exe",
"TimeoutSeconds": 30,
"MaxConcurrency": 16
},
"ActiveDirectory": {
"Domain": "example.corp",
"Username": "svc_1c_inventory",
"Password": "YourSecureAdPassword123!",
"GroupFilters": [ "rdp_1c_*", "1cbases_*" ],
"ManageableGroupPatterns": [ "rdp_1c_*", "1cbases*" ],
"V8iBasePath": "\\\\fileserver.example.corp\\1c_bases"
},
"Dbms": {
"DefaultSqlUsername": "monitoring_user",
"DefaultSqlPassword": "YourSecureDbmsPassword123!",
"DefaultPgUsername": "monitoring_user",
"DefaultPgPassword": "YourSecureDbmsPassword123!",
"ConnectionTimeoutSeconds": 8
},
"Confluence": {
"BaseUrl": "https://confluence.example.com",
"BearerToken": "YOUR_CONFLUENCE_API_TOKEN_HERE",
"PageIdDev": "10000001",
"PageIdProd": "10000002",
"PageIdSaInfo": "10000003"
},
"ClusterDiscovery": {
"Enabled": true,
"DefaultClusterUser": "admin_1c",
"DefaultClusterPassword": "YourClusterPassword123!",
"WmiQueryTimeoutSeconds": 30,
"Servers": [
{ "Host": "app-dev01.example.corp", "Environment": "DEV" },
{ "Host": "app-prod01.example.corp", "Environment": "PROD" }
]
},
"SqlRestore": {
"BackupArchiveRoot": "\\\\backup_sql\\sql_archive$",
"AllowedTargetServers": [ "dev-s-sql01", "dev-s-sql02" ],
"AllowedDomainSuffixes": [ "example.corp" ],
"DefaultRestoreUsername": "sql_restore",
"DefaultRestorePassword": "YourDevSqlRestorePassword123!",
"ExcludedCatalogs": [ "PROD-OLAP" ],
"ExcludedDatabases": [ "master", "model", "msdb", "tempdb", "ReportServer*", "test_base", "Archive_*" ],
"InfobaseAdminCredentials": [
{ "Username": "infobase_admin", "Password": "YourInfobaseAdminPassword123!" }
]
},
"IisPublications": {
"Enabled": true,
"ExtraHosts": [],
"BaseUrls": {
"app-dev01.example.corp": "http://app-dev.service.consul"
},
"TimeoutSecondsPerHost": 60
},
"AuditLog": {
"RetentionDays": 14,
"MaxLogSizeBytes": 1073741824,
"LogFilePath": "logs/audit.jsonl"
},
"Clusters": []
}Параметры, которые легко пропустить:
Rac:TimeoutSeconds— таймаут одного вызоваrac.exe. После таймаута делается один повтор с удвоенным временем.ClusterDiscovery:WmiQueryTimeoutSecondsограничивает WMI-запрос к одному хосту. Не ответивший хост опрашивается через TCP-порты.ActiveDirectory:ManageableGroupPatterns— маски групп, состав которых можно менять из интерфейса. Учётной записи изActiveDirectory:Username(или учётной записи службы) нужно право на изменение членства в этих группах.SqlRestore:AllowedDomainSuffixes— домены, в которых FQDN сервера изAllowedTargetServersсчитается тем же сервером. Имена в других доменах отклоняются.SqlRestore:ExcludedDatabasesиExcludedCatalogs— имена целиком (без учёта регистра) или маски с*и?.ITILисключает только базуITIL, аITIL*— все базы, начинающиеся сITIL.SqlRestore:InfobaseAdminCredentials— администраторы информационных баз 1С для блокировки регламентных заданий. Пробуются по порядку, последним пробуется администратор кластера. ПолеEncryptedPasswordпринимается как синонимPassword, но значение не шифруется.IisPublications:BaseUrls— внешний адрес публикаций для каждого сервера IIS.ExtraHosts— серверы IIS, на которых нет кластеров 1С.
PowerShell от имени администратора:
cd .\publish\Web
.\INSTALL_SERVICE.ps1 -StartСоздаётся служба OneSGetDatabasesWeb с автозапуском и перезапуском при сбое. Веб-интерфейс: http://<сервер>:5070, Swagger: http://<сервер>:5070/swagger.
- Остановите службу
OneSGetDatabasesWeb. - Скопируйте содержимое
publish\Webв каталог службы. Каталогиcacheиlogsна сервере не заменяйте. Еслиappsettings.jsonна сервере свой, перенесите в него новые ключи вместо замены файла. - Запустите службу и обновите страницу с
Ctrl + F5.
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/databases, /api/databases/files, /api/databases/stats |
базы, файлы СУБД, сводка |
| GET | /api/databases/clusters/health, /api/databases/clusters/logs |
состояние кластеров и лог опроса |
| GET | /api/export/excel, /api/export/json |
выгрузка |
| GET | /api/activedirectory/group/{группа}/members |
участники группы AD |
| POST, DELETE | /api/activedirectory/group/{группа}/members[/{логин}] |
добавить или удалить участника |
| GET | /api/restore/sources, /timeline, /plan, /diagnose |
архив бэкапов, точки и план восстановления |
| POST | /api/restore/start |
запуск восстановления |
| POST | /api/services/action |
старт, стоп, перезапуск служб 1С |
| GET | /health |
проверка работоспособности |
Полный список с параметрами — в Swagger.
- Веб-интерфейс и API работают без аутентификации. Изменение групп AD, управление службами 1С и восстановление баз доступны любому, кто открыл порт 5070. Ограничьте доступ к порту брандмауэром или обратным прокси с аутентификацией. Журнал аудита записывает IP клиента, но заголовок
X-Forwarded-Forклиент может подменить. - Серверы 1С. Учётной записи службы нужны права локального администратора на серверах из
ClusterDiscovery:Servers: WMI для поиска и управления службами, административная шараC$для чтения конфигурации IIS. - SQL Server, инспекция. Достаточно
VIEW ANY DATABASE,VIEW SERVER STATE,VIEW ANY DEFINITIONиCONNECT ANY DATABASE. - SQL Server, восстановление. Учётной записи
SqlRestore:DefaultRestoreUsernameнужна рольsysadminна DEV/TEST-серверах изAllowedTargetServers: восстановление переводит базу в OFFLINE, заменяет её, создаёт пользователей и меняет владельца. Служба SQL Server должна читать каталог архива бэкапов. - Active Directory. Для просмотра групп достаточно чтения. Для изменения состава нужно право на изменение членства в группах из
ManageableGroupPatterns. - Секреты. Пароли и токены хранятся в
appsettings.jsonоткрытым текстом. Ограничьте доступ к каталогу службы или вынесите секреты в переменные окружения.
MIT. См. LICENSE.