База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как закрыть 1С для определенной копии без влияния на другие конфигурации?
- В этой теме 1 ответ, 2 участника, последнее обновление 8 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
10 июля 2026 в 10:31 #38139
На основной проге достаточно предупреждения. Там оператор будет запускать копирование. А на копии ничего серьезного Там просмотры отчетов. И формирование одного отчета для бухгалтерии с распределением суммы затрат. Там можно закрыть в батнике. Но на сервере работают другие конфы (ЗУП,Договора, и т.д) Вот здесь нужно аккуратно
-
10 июля 2026 в 10:31 #38140
Понял задачу — на основном ПК просто предупреждаем оператора закрыть 1С, а на копии (где только отчёты и одна конфа) можно закрыть 1С через батник, но аккуратно, чтобы не трогать другие конфигурации.
—
### Как сделать аккуратно закрытие 1С только для нужной копии?
1С запускается одним процессом 1cv8.exe, но у тебя на сервере несколько баз и конфигураций. Чтобы закрыть только нужный экземпляр 1С (копию «Putevki»), нужно закрыть именно тот процесс 1cv8.exe, который работает с этой базой.
—
### Варианты решения:
#### 1. Закрыть все процессы 1cv8.exe на сервере — НЕ подходит, т.к. есть другие конфы.
#### 2. Закрыть процесс 1cv8.exe, у которого в заголовке окна есть «Putevki» (название базы).
Для этого можно использовать PowerShell скрипт, который найдет окно с нужным заголовком и завершит процесс.
—
### Пример PowerShell скрипта для закрытия 1С с окном «Putevki»:
PowerShell12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273# Получаем процессы 1cv8.exe$processes = Get-Process -Name 1cv8 -ErrorAction SilentlyContinueforeach ($proc in $processes) {# Получаем заголовок окна процесса$hwnd = $proc.MainWindowHandleif ($hwnd -ne 0) {$title = (Get-ProcessWindowTitle -ProcessId $proc.Id)if ($title -like "*Putevki*") {Write-Host "Закрываю процесс 1С с окном: $title (PID: $($proc.Id))"$proc.CloseMainWindow() | Out-NullStart-Sleep -Seconds 5if (!$proc.HasExited) {Write-Host "Принудительно завершаю процесс PID $($proc.Id)"$proc.Kill()}}}}# Функция для получения заголовка окна по PIDfunction Get-ProcessWindowTitle {param([int]$ProcessId)Add-Type @"using System;using System.Runtime.InteropServices;public class WinAPI {[DllImport("user32.dll")]public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count);[DllImport("user32.dll")]public static extern bool IsWindowVisible(IntPtr hWnd);[DllImport("user32.dll")]public static extern IntPtr GetShellWindow();[DllImport("user32.dll")]public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);[DllImport("user32.dll")]public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);}"@$sb = New-Object System.Text.StringBuilder 1024$shellWindow = [WinAPI]::GetShellWindow()$hWnd = [IntPtr]::Zero$foundTitle = ""function EnumWindowsProc {param($hwnd, $lParam)if (-not [WinAPI]::IsWindowVisible($hwnd)) { return $true }if ($hwnd -eq $shellWindow) { return $true }[WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nullif ($pid -eq $ProcessId) {[WinAPI]::GetWindowText($hwnd, $sb, $sb.Capacity) | Out-Nullif ($sb.Length -gt 0) {$foundTitle = $sb.ToString()return $false}}return $true}$delegate = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((Add-Type -MemberDefinition @"[DllImport("user32.dll")]public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);"@ -Name "User32" -Namespace Win32 -PassThru)::GetMethod("EnumWindows").MethodHandle.GetFunctionPointer(),[Func[IntPtr, IntPtr, bool]])[Win32.User32]::EnumWindows($delegate, [IntPtr]::Zero) | Out-Nullreturn $foundTitle}—
### Как использовать:
— Сохрани этот скрипт в файл ClosePutevki.ps1 на сервере.
— В батнике вызови его так:1С (Код)1powershell.exe -ExecutionPolicy Bypass -File "\Server2017scriptsClosePutevki.ps1"— После закрытия можно запускать копирование.
—
### Почему так?
— Этот скрипт ищет процессы 1cv8.exe с окном, в названии которого есть «Putevki».
— Закрывает сначала корректно черезCloseMainWindow().
— Если процесс не закрылся за 5 секунд — принудительно убивает.
— Другие процессы 1С (ЗУП, Договора и т.п.) не трогает.—
### В батнике общий алгоритм:
1С (Код)1234567891011121314@echo offchcp 1251echo Проверьте, что 1С на основном ПК закрыта. Если нет - закройте и нажмите любую клавишу...pause >nulecho Закрываю 1С копии "Putevki" на сервере...powershell.exe -ExecutionPolicy Bypass -File "\Server2017scriptsClosePutevki.ps1"echo Копирую файл 1Cv8.1CD...copy /Y "D:Putevki1Cv8.1CD" "\Server2017Putevki1Cv8.1CD"echo Готово.pause—
Если PowerShell скрипт кажется сложным, могу помочь упростить или сделать вариант на чистом батнике, но с меньшей точностью (например, закрывать все 1cv8.exe на сервере, что не подходит).
—
Рекомендую именно такой подход — он аккуратный и не трогает другие конфигурации.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.