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



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

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

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

23 Comments

  1. IvanSusanin

    Безусловно разработчик получил навыки при реализации этой обработки но в практическом применении считаю ее бесполезной т.к. проще настроить это в windiws.

    Reply
  2. MNevgeny

    (1) IvanSusanin, Видите ли перенумерацию документов тоже можно провести в ручную, но мы пишем разного рода обработки. Потому что так удобней.

    Reply
  3. kondrat1C

    Если нет возможности запускать, созданные службы, по расписанию, то не вижу особого практического применения

    Reply
  4. MNevgeny

    (3) kondrat1C, Вот! это хорошая идея. Но запуск того или иного действия можно прописать в коде конфигурации(хоть по расписанию, хоть произвольно) главное, чтобы она запускалась и не мешала пользователям. А, вот насчет применения, я в описании в кратце привел несколько примеров. Я например использую для управления службой которая запускает базуостанавливает для смс оповещения клиентов и сотрудников разного рода информацией. Обработка вам поможет создать службу, настроить базу данных для запуска, а вот для чего??? Это вы сами решите…

    Reply
  5. r00t
    andrej260276 пишет:

    главное, чтобы она запускалась и не мешала пользователям

    дваждую

    Кошерная обработка, очевидный плюс за работу

    Reply
  6. sound
    Есть одно узкое место в коде которое мне не удалось оптимизировать. Это получение состоятия системной службы (запущена она или остановлена).

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

    // Возвращает таблицу значений, содержащую
    // сведения о службах компьютера
    // для локального компьютера HostName = «.»
    Функция ПолучитьСведенияОСлужбах(HostName) Экспорт
    ТЗСлужбы = Новый ТаблицаЗначений;
    ТЗСлужбы.Колонки.Добавить(«Name»,,»Имя файла»,25);
    ТЗСлужбы.Колонки.Добавить(«Caption»,,»Имя»,);
    ТЗСлужбы.Колонки.Добавить(«Description»,,»Описание»,);
    ТЗСлужбы.Колонки.Добавить(«State»,,»Состояние»,);
    ТЗСлужбы.Колонки.Добавить(«StartMode»,,»Тип запуска»,);
    ТЗСлужбы.Колонки.Добавить(«PathName»,,»Строка запуска»,);
    Попытка
    ServicesSet = GetComObject(«winmgmts:{impersonationLevel=impersonate}!\» + СокрЛП(HostName) + »
    ootcimv2″);
    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»);
    Исключение
    Возврат Неопределено;
    КонецПопытки;
    Возврат ТЗСлужбы;
    КонецФункции // ПолучитьСведенияОСлужбах()
    

    Показать

    Reply
  7. sound

    Еще до кучи 🙂

    // Start, Stop или Restart службы компа
    Функция ИзменитьСостояниеСлужбы(HostName, Name, State) Экспорт
    Попытка
    ServicesSet = GetComObject(«winmgmts:{impersonationLevel=impersonate}!\» + СокрЛП(HostName) + »
    ootcimv2″);
    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();
    КонецЕсли;
    КонецЦикла;
    Возврат Истина;
    Исключение
    Возврат Ложь;
    КонецПопытки;
    КонецФункции // ИзменитьСостояниеСлужбы()
    

    Показать

    Reply
  8. MNevgeny

    Спасибо за пример кода. Обязательно воспользуюсь и переделаю в обработке функцию получение состояния службы.

    Reply
  9. zavedeev

    молодец, респект разработчику!!!

    Reply
  10. Genneral

    Полезная обработка, у меня сборка/рассылка данных с wi-fi терминалов реализован на прямую в 1с, попробую запускать как службу, когда будет контроль состояния службы.

    Reply
  11. echo77

    В разделе файлы: чем файл «Файл обработки для 8.2» отличается от «Файл обработки для 8.2«?

    Написано хорошо — молодец.

    Только непонятно зачем в обработке присутствует вариант создания службы для серверной 1с? Регламентные задания в 1с никто не отменял — все должно получиться без доп. функционала

    Reply
  12. MNevgeny
    Genneral пишет:

    попробую запускать как службу, когда будет контроль состояния службы.

    Контроль состояния службы присутствует и работает 100% правильно. Я имел ввиду, что эту функцию в модуле я хочу оптимизировать увеличив быстродействие получения состояния.

    Reply
  13. It-developer

    Да, интересная обработка. Интересна больше идея создания-удаление службы.

    Регламентные задания правда все это заменяют, но этот подход тоже имеет право жить — может кому то и понадобится.

    Ну и плюс — все регламентные как бы в одном месте. Но вопрос будут ли 2 регламентных работать параллельно в одной/разных базах?

    Reply
  14. go3i

    для чего может пригодится си Е изобретение ???

    Reply
  15. MNevgeny

    Уважаемый go3i, внимательней читайте описание! Там всё написано, а ещё можете ознакомиться с системным программированием если посмотрите код данной разработки. Я думаю вы найдёте для себя много интересного.

    Reply
  16. softest

    Спасибо автору! Я тоже применяю эту обработку для отсылки смс польователям!

    Reply
  17. dandrontiy

    Интересная разработка. А можно сделать так, чтобы служба созданная стартовала при запуске системы ?

    Reply
  18. MNevgeny

    (17) dandrontiy, Очень легко. Помотрите процедуру ЗапускОстановкаНажатие, которая запускает созданную службу и останавливает её при следующем нажатии. А, если коротко то вот этот код

    КомандаСистемы(«net start » + СокрЛП(НазваниеСлужбы));

    пропишите в модуле приложения в процедуре ПриНачалеРаботыСистемы().

    Reply
  19. Spartan

    (13) Для запуска регламентных заданий в файловом варианте, как раз-таки нужен отдельный сеанс — вот его-то лучше всего и запустить как службу.

    Reply
  20. Imm

    Грамотное решение. Автору +

    Reply
  21. agent007

    Автор молодец! Идея грамотная и полезная… Очень много конфигураций используются в файловом режиме. Вот здесь, эта обработка будет крайне необходима для выполнения регламентный заданий. И пользователям мешать не будет.

    Reply
  22. OrsoBear

    Спасибо! То, что надо! Даже на не очень хорошем сервере со странно работающим планировщиком завелась.

    Прежде чем проверять на рабочем сервере, где вертится 2008 server, хотел уточнить, на нем такая обработка заведется? Или нужны другие версии файлов?

    Reply
  23. MNevgeny

    В (22) OrsoBear, На 2008 server не тестировал, но предполагаю, что должна сработать без проблем. Это же тоже Windows…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *