Создаём системную службу для запуска БД 1С в скрытом виде. (Обновление)

Опубликовал Андрей 1 (andrej260276) в раздел Администрирование - Системное

Обработка создает в системе Windows службу при помощи утилит из комплекта Windows 2000 Server Resource Kit ( INSTSRV.EXE и SRVANY.EXE) для запуска БД 1С в скрытом от пользователей виде для выполнения регламентных заданий, рассылки смс, электронной почты, востановления последовательности в документах и т. д.

Для начала необходимо скопировать эти утилиты ( INSTSRV.EXE и SRVANY.EXE) в системную директорию C:\Windows\System32 (для этого нужно чтобы ваша учетная запись имела права администратора) и всё. После запускаем обработку в режиме 1С Предприятия. Указываем название службы (любое понятное вам), параметры запуска БД 1С и жмём кнопку "Создать Windows службу". Обработка при помощи утилит создаст в системе службу, пропишем в системный реестр все нужные параметры и вам останется только нажать на кнопку запустить службу, а вместе с ней произойдет запуск БД которую вы указали в параметрах. Нажав на кнопку Остановить службу, произойдет остановка службы и выход пользователя из БД. Нажав на кнопку "Удалить службу", вы удалите службу указанную в наименовании. Вы можете создать любое нужное количество служб, для этого просто в наименовании указываете новое название, после события "При изменении" наименования получите возможность ввести новые параметры БД и т.д. Тоже самое с удалением службы. Вводите наименование, после события "при изменении" обработка анализирует состояние службы и если такая служба есть в системе можете её удалить (но, увлекаться не стоит, удаляйте только то что сами создали, ну или на 100% уверены в том что удаляете не нужную службу). Есть одно узкое место в коде которое мне не удалось оптимизировать. Это получение состоятия системной службы (запущена она или остановлена). В моей обработке, это занимает около минуты, но определяет точно. Может быть кто нибудь знает более правильное решение, буду признателен т.к. сам я не программист, а программирование моё хобби. Код открыт. Буду рад если кому нибудь пригодится... Обработка написана на платформе 8.2.14.537 Обычное приложение. Тестировал на Windows 7 32 bit. , но уверен что под XP будет работать.

Обновление обработки!!! 1. Оптимизированна функция получения состояния службы! 2. Добавлена возможность менять пользователя или пароль пользователя БД. 3. Добавлена возможность изменять подключение к БД (путь для файловой и имя сервера и имя БД для серверного варианта). Для того, чтобы воспользоваться новыми возможностями, нажмите на картинку в нужной группе реквизитов и откроется режим редактирования. После редактирования реквизитов, жмём кнопку "Сохранить изменения" и обновлённые данные запишутся в системный реестр ОС.

Скачать файлы

Наименование Файл Версия Размер
Файл обработки для 8.2 (обновление от 11.01.2012)
.epf 18,70Kb
15.11.12
75
.epf 18,70Kb 75 Скачать
Утилиты Windows
.rar 18,93Kb
15.11.12
47
.rar 18,93Kb 47 Скачать

См. также

PowerTools от 1 000
Комментарии
1. Иван Сусанин (IvanSusanin) 04.01.12 10:47 Сейчас в теме
Безусловно разработчик получил навыки при реализации этой обработки но в практическом применении считаю ее бесполезной т.к. проще настроить это в windiws.
2. Андрей 1 (andrej260276) 52 04.01.12 11:39 Сейчас в теме
(1) IvanSusanin, Видите ли перенумерацию документов тоже можно провести в ручную, но мы пишем разного рода обработки. Потому что так удобней.
3. Виталий Кондратьев (kondrat1C) 42 04.01.12 12:03 Сейчас в теме
Если нет возможности запускать, созданные службы, по расписанию, то не вижу особого практического применения
4. Андрей 1 (andrej260276) 52 04.01.12 12:24 Сейчас в теме
(3) kondrat1C, Вот! это хорошая идея. Но запуск того или иного действия можно прописать в коде конфигурации(хоть по расписанию, хоть произвольно) главное, чтобы она запускалась и не мешала пользователям. А, вот насчет применения, я в описании в кратце привел несколько примеров. Я например использую для управления службой которая запускает базу\останавливает для смс оповещения клиентов и сотрудников разного рода информацией. Обработка вам поможет создать службу, настроить базу данных для запуска, а вот для чего??? Это вы сами решите...
5. Вася Пупкин (r00t) 04.01.12 13:12 Сейчас в теме
andrej260276 пишет:
главное, чтобы она запускалась и не мешала пользователям

дваждую

Кошерная обработка, очевидный плюс за работу
6. sound sound (sound) 519 04.01.12 13:59 Сейчас в теме
Есть одно узкое место в коде которое мне не удалось оптимизировать. Это получение состоятия системной службы (запущена она или остановлена).


Для получения/изменения состояния служб можно использовать, например, WMI, привожу пример функции:


// Возвращает таблицу значений, содержащую 
// сведения о службах компьютера
// для локального компьютера HostName = "."
Функция ПолучитьСведенияОСлужбах(HostName) Экспорт
	ТЗСлужбы = Новый ТаблицаЗначений;
	ТЗСлужбы.Колонки.Добавить("Name",,"Имя файла",25);
	ТЗСлужбы.Колонки.Добавить("Caption",,"Имя",);
	ТЗСлужбы.Колонки.Добавить("Description",,"Описание",);
	ТЗСлужбы.Колонки.Добавить("State",,"Состояние",);
	ТЗСлужбы.Колонки.Добавить("StartMode",,"Тип запуска",);
	ТЗСлужбы.Колонки.Добавить("PathName",,"Строка запуска",);
	Попытка
		ServicesSet = GetComObject("winmgmts:{impersonationLevel=impersonate}!\\" + СокрЛП(HostName) + "\root\cimv2");
		Items = ServicesSet.ExecQuery("SELECT Name,Caption,Description,State,StartMode,PathName From Win32_Service");
		Для каждого Item Из Items Цикл
			НоваяСтрока = ТЗСлужбы.Добавить();
			НоваяСтрока.Name        = Item.Name;
			НоваяСтрока.Caption     = Item.Caption;
			НоваяСтрока.Description = Item.Description;
			НоваяСтрока.State       = Item.State;
			НоваяСтрока.StartMode   = Item.StartMode;
			НоваяСтрока.PathName    = Item.PathName;
		КонецЦикла;
		ТЗСлужбы.Сортировать("Name");
	Исключение
		Возврат Неопределено;
	КонецПопытки;
	Возврат ТЗСлужбы;
КонецФункции // ПолучитьСведенияОСлужбах()
...Показать Скрыть
Spacer; stal76; +2 Ответить
7. sound sound (sound) 519 04.01.12 14:00 Сейчас в теме
Еще до кучи :)

// Start, Stop или Restart службы компа
Функция ИзменитьСостояниеСлужбы(HostName, Name, State) Экспорт
	Попытка
		ServicesSet = GetComObject("winmgmts:{impersonationLevel=impersonate}!\\" + СокрЛП(HostName) + "\root\cimv2");
		Items = ServicesSet.ExecQuery("SELECT Name From Win32_Service WHERE Name=""" + СокрЛП(Name) + """");
		Для каждого Item Из Items Цикл
			Если State = 1 Тогда
				Item.StartService();
			ИначеЕсли State = 2 Тогда
				Item.StopService();
			ИначеЕсли State = 3 Тогда
				Item.StopService();
				Item.StartService();
			КонецЕсли;	
		КонецЦикла;
		Возврат Истина;
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции // ИзменитьСостояниеСлужбы()	
...Показать Скрыть
8. Андрей 1 (andrej260276) 52 04.01.12 14:09 Сейчас в теме
Спасибо за пример кода. Обязательно воспользуюсь и переделаю в обработке функцию получение состояния службы.
9. zavedeev (zavedeev) 04.01.12 17:14 Сейчас в теме
молодец, респект разработчику!!!
10. Андрей (Genneral) 04.01.12 22:46 Сейчас в теме
Полезная обработка, у меня сборка/рассылка данных с wi-fi терминалов реализован на прямую в 1с, попробую запускать как службу, когда будет контроль состояния службы.
11. Александр Крынецкий (echo77) 686 05.01.12 07:22 Сейчас в теме
В разделе файлы: чем файл "Файл обработки для 8.2" отличается от "Файл обработки для 8.2"?

Написано хорошо - молодец.
Только непонятно зачем в обработке присутствует вариант создания службы для серверной 1с? Регламентные задания в 1с никто не отменял - все должно получиться без доп. функционала
12. Андрей 1 (andrej260276) 52 05.01.12 15:19 Сейчас в теме
Genneral пишет:
попробую запускать как службу, когда будет контроль состояния службы.
Контроль состояния службы присутствует и работает 100% правильно. Я имел ввиду, что эту функцию в модуле я хочу оптимизировать увеличив быстродействие получения состояния.
13. Kostya Zhurov (It-developer) 20 06.01.12 16:43 Сейчас в теме
Да, интересная обработка. Интересна больше идея создания-удаление службы.
Регламентные задания правда все это заменяют, но этот подход тоже имеет право жить - может кому то и понадобится.
Ну и плюс - все регламентные как бы в одном месте. Но вопрос будут ли 2 регламентных работать параллельно в одной/разных базах?
14. Артем Ганиев (go3i) 08.01.12 12:51 Сейчас в теме
для чего может пригодится си Е изобретение ???
15. Андрей 1 (andrej260276) 52 08.01.12 14:42 Сейчас в теме
Уважаемый go3i, внимательней читайте описание! Там всё написано, а ещё можете ознакомиться с системным программированием если посмотрите код данной разработки. Я думаю вы найдёте для себя много интересного.
16. Тарас (softest) 08.01.12 19:43 Сейчас в теме
Спасибо автору! Я тоже применяю эту обработку для отсылки смс польователям!
17. Дандронтий Крузенштерн (dandrontiy) 10.01.12 15:25 Сейчас в теме
Интересная разработка. А можно сделать так, чтобы служба созданная стартовала при запуске системы ?
18. Андрей 1 (andrej260276) 52 10.01.12 15:58 Сейчас в теме
(17) dandrontiy, Очень легко. Помотрите процедуру ЗапускОстановкаНажатие, которая запускает созданную службу и останавливает её при следующем нажатии. А, если коротко то вот этот код
КомандаСистемы("net start " + СокрЛП(НазваниеСлужбы));
пропишите в модуле приложения в процедуре ПриНачалеРаботыСистемы().
19. Иван Т (Spartan) 300 10.01.12 17:44 Сейчас в теме
(13) Для запуска регламентных заданий в файловом варианте, как раз-таки нужен отдельный сеанс - вот его-то лучше всего и запустить как службу.
20. Alexandr Zaslavskiy (Imm) 12.01.12 04:11 Сейчас в теме
Грамотное решение. Автору +
21. Андрей Петров (agent007) 28.02.12 08:13 Сейчас в теме
Автор молодец! Идея грамотная и полезная... Очень много конфигураций используются в файловом режиме. Вот здесь, эта обработка будет крайне необходима для выполнения регламентный заданий. И пользователям мешать не будет.
22. Alex Steiner (OrsoBear) 19.12.13 10:13 Сейчас в теме
Спасибо! То, что надо! Даже на не очень хорошем сервере со странно работающим планировщиком завелась.

Прежде чем проверять на рабочем сервере, где вертится 2008 server, хотел уточнить, на нем такая обработка заведется? Или нужны другие версии файлов?
23. Андрей 1 (andrej260276) 52 19.12.13 13:59 Сейчас в теме
В (22) OrsoBear, На 2008 server не тестировал, но предполагаю, что должна сработать без проблем. Это же тоже Windows...