'Скрипт демонстрирует возможность принудительного завершения процессов 1С 'на всех компьютерахуказанного домена. Данный код можно применять непосредственно перед пакетным запуском 1С:Предприятия, 'требующим монопольного входа в базу данных (например, при резервном копировании). 'ВНИМАНИЕ! Задайте нужное значение переменной "DomainName"! 'ВНИМАНИЕ! Для успешной работы скрипта его желательно запускать с правами администратора домена. 'ВНИМАНИЕ! Чтобы опробовать скрипт, не производя деструктивных действий, достаточно закомментировать 'оператор "Proc.Terminate". Option Explicit On Error Resume Next Dim DomainName 'Имя домена DomainName = "MYDOMAIN" Dim StrResult 'строка результата работы всей программы StrResult = StrResult & CStr(Now) & " начало работы скрипта" & VbCrLf Dim ADSI Set ADSI = GetObject("WinNT://" & DomainName) ADSI.Filter = Array("computer") Dim Comp 'компьютер Dim WMI 'объект WMI Dim Proc 'процесс Dim CurrName 'имя текущего компьютера CurrName = GetNameComp() 'Цикл по компьютерам домена For Each Comp In ADSI If Comp.Name <> CurrName Then Set WMI = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\" & Trim(Comp.Name) & "\Root\CIMV2") If Err.Number=0 Then 'Цикл по процессам компьютера For Each Proc In WMI.ExecQuery("S_elect * FROM Win32_Process WHERE Name = '1cv7s.exe'") StrResult = StrResult & _ CStr(Now) & " Computer=" & Comp.Name & " PID=" & Proc.ProcessId & _ VbCrLf 'Завершение процесса Proc.Terminate Next 'Цикл по процессам компьютера Else 'Не удалось соединиться с компьютером If Err.Number <> 462 Then 'The remote server machine does not exist or is unavailable StrResult = StrResult & _ " " & CStr(Now) & " Computer=" & Comp.Name & " ERROR " & Err.Number & _ VbCrLf End If End If Err.Clear End If Next 'Цикл по компьютерам домена StrResult = StrResult & CStr(Now) & " конец работы скрипта" & VbCrLf 'Отображение результата ShowInNotepad("Процессы 1cv7s.exe:" & VbCrLf & VbCrLf & StrResult) '========================================================================== 'Процедура отображает переданную строку в блокноте Sub ShowInNotepad(StrToFile) Dim FSO 'Объект файловой системы Scripting.FileSystemObject Dim TempPath 'Путь к временному файлу Dim TxtFile 'Поток текстового файла Set FSO = CreateObject("Scripting.FileSystemObject") TempPath = GetTempPath() & "\" & FSO.GetTempName Set TxtFile = FSO.CreateTextFile(TempPath) TxtFile.WriteLine(StrToFile) TxtFile.Close CreateObject("WScript.Shell").Run "notepad.exe " & TempPath WScript.Sleep 1000 FSO.DeleteFile TempPath End Sub 'ShowInNotepad '========================================================================== 'Функция возвращает путь к каталогу временных файлов текущего пользователя Function GetTempPath() GetTempPath = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%") End Function 'GetTempPath '========================================================================== 'Функция возвращает имя текущего компьютера Function GetNameComp() GetNameComp = CreateObject("WScript.Network").ComputerName End Function 'GetNameComp
Ex = Новый COMObject("Excel.Application"); Ex.Workbooks.Open(Путь); Ex.Visible = 1; ТекЛист=Ex.WorkSheets(1); Для Ячейка = 1 по 400 цикл Если НЕ ТекЛист.Cells(Ячейка,1).Value = Неопределено тогда Сообщить(Строка(ТекЛист.Cells(Ячейка,1).Value)); Карта = Справочники.Номенклатура.НайтиПоКоду(ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value)); Если Карта.Пустая() тогда Сообщить(" Пустой элемент " + ТекЛист.Cells(Ячейка,1)); иначе Объект = Карта.ПолучитьОбъект(); Объект.ОсновнойПоставщик = ОсновнойКлиент; Объект.Записать(); конецесли; конецесли; конеццикла;
// Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт #Если Клиент Тогда Состояние("Установка соединения с Excel"); #КонецЕсли //ЗаголовкиВСтроке1 = "HDR=YES;" ЗаголовкиВСтроке1 = "HDR=NO;"; СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;"""; Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionString = СтрокаСоединения; Попытка Connection.Open(); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; RS = Новый COMОбъект("ADODB.Recordset"); ТекстЗапроса = "S_elect | Лист.* |FROM | [" + пЛист + "$] as Лист"; Попытка RS.Open(ТекстЗапроса, Connection); Исключение Сообщить ("Проблемы с выполнением запроса"); Возврат Неопределено; КонецПопытки; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НомерСтроки = 0; КолвоСтрок = RS.RecordCount; Пока RS.EOF() = 0 Цикл НомерСтроки = НомерСтроки + 1; #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); ОбработкаПрерыванияПользователя(); #КонецЕсли Если НомерСтроки < НачСтрока Тогда RS.MoveNext(); Продолжить; КонецЕсли; Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда Прервать; КонецЕсли; НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); НоваяСтрока["К" + Счетчик] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = RS.Fields.Item(КлючИЗначение.Значение - 1); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; // Обработка других полей RS.MoveNext(); КонецЦикла; // Завершение работы RS.Close(); Connection.Close(); Возврат Таблица; КонецФункции // Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние("Открытие Excel"); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить("К" + Счетчик); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); Для НомерСтроки = НачСтрока По КонСтрока Цикл #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока)); ОбработкаПрерыванияПользователя(); #КонецЕсли НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для НомерКолонки = 1 По КолвоКолонок Цикл Поле = Лист.Cells(НомерСтроки, НомерКолонки); НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; КонецЦикла; XLSОбъект.Application.Quit(); Возврат Таблица; КонецФункции // Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние("Открытие Excel"); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить("К" + Счетчик); КонецЦикла; Иначе МаксимальныйНомерКолонки = 0; Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение); КонецЦикла; КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки); КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); // Массив типа COMSafeArray Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value; КолвоСтрок = Массив.GetUpperBound(1); Для НомерСтроки = 1 По КолвоСтрок Цикл #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); ОбработкаПрерыванияПользователя(); #КонецЕсли НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для НомерКолонки = 1 По КолвоКолонок Цикл НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки); КонецЦикла; КонецЕсли; КонецЦикла; XLSОбъект.Application.Quit(); Возврат Таблица; КонецФункции // Функция получает список листов Excel // // Параметры: // пФайл - Имя файла // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // СписокЗначений // Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Возврат Новый СписокЗначений; КонецПопытки; СписокЛистов = Новый СписокЗначений; Для каждого Лист Из XLSОбъект.Sheets Цикл СписокЛистов.Добавить(Лист.Name); КонецЦикла; XLSОбъект.Application.Quit(); Возврат СписокЛистов; КонецФункции
Попытка Excel = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()+"; программа Excel не установлена на данном компьютере!"); Возврат; КонецПопытки; РабочиеКниги=Excel.WorkBooks; // создаем рабочую книгу Попытка // открываем файл Отчет=РабочиеКниги.Open(Каталог+ИмяФайла); Исключение Сообщить(ОписаниеОшибки()+"; фаил с макросом не найден!"); Возврат; КонецПопытки; // заносим в таблицу какие-либо данные Лист = Отчет.Worksheets(1); Для Ном=1 По 20 Цикл Ячейка = Лист .Cells(ном,1); Ячейка.Value; Сообщить(Ячейка ); КонецЦикла; Excel.Visible=1; Попытка Отчет.Save(); Исключение Сообщить(ОписаниеОшибки()+"; не могу сохранить отчет!"); Возврат; КонецПопытки;
спКомп = СоздатьОбъект("СписокЗначений"); Попытка ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function GetComputers() | Set WinNT = GetObject(""WinNT:"") | WinNT.Filter = Array(""domain"") | For Each Domain In WinNT | Set ADSI = GetObject(""WinNT://"" & Domain.Name) | ADSI.Filter = Array(""computer"") | For Each Comp In ADSI | strInfo=strInfo & Domain.Name & "";"" & Comp.Name & vbCrLf | Next | Next | GetComputers = strInfo |End Function |"); Текст=СокрЛП(ScrptCtrl.Run("GetComputers")); ScrptCtrl = ""; Исключение Предупреждение(ОписаниеОшибки()); Возврат; КонецПопытки; Для Индекс=1 по СтрКоличествоСтрок(Текст) Цикл СтрТекста=СтрПолучитьСтроку(Текст,Индекс); Разделитель=Найти(СтрТекста,";"); Домен=Лев(СтрТекста,Разделитель-1); Компьютер=Прав(СтрТекста,СтрДлина(СтрТекста)-Разделитель); спКомп.ДобавитьЗначение(Компьютер,Домен+""+Компьютер); КонецЦикла; спКомп.Сортировать();
спКомп = Новый СписокЗначений; Попытка ScrptCtrl= Новый COMОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function GetComputers() | Set WinNT = GetObject(""WinNT:"") | WinNT.Filter = Array(""domain"") | For Each Domain In WinNT | Set ADSI = GetObject(""WinNT://"" & Domain.Name) | ADSI.Filter = Array(""computer"") | For Each Comp In ADSI | strInfo=strInfo & Domain.Name & "";"" & Comp.Name & vbCrLf | Next | Next | GetComputers = strInfo |End Function |"); Текст=СокрЛП(ScrptCtrl.Run("GetComputers")); ScrptCtrl = ""; Исключение Предупреждение(ОписаниеОшибки()); Возврат; КонецПопытки; Для Индекс=1 по СтрЧислоСтрок(Текст) Цикл СтрТекста=СтрПолучитьСтроку(Текст,Индекс); Разделитель=Найти(СтрТекста,";"); Домен=Лев(СтрТекста,Разделитель-1); Компьютер=Прав(СтрТекста,СтрДлина(СтрТекста)-Разделитель); спКомп.Добавить(Компьютер,Домен+""+Компьютер); КонецЦикла; спКомп.СортироватьПоПредставлению(); //Выберем комп спКомп.ВыбратьЭлемент();