Запуск 1С под заданным пользователем как службы (service) Windows




Позволяет запустить любую конфигурацию 1С 8 как службу Windows

Не так давно, передо мной встала задача, сделать так чтобы регламентные задания 1С, в файловой базе, выполнялись постоянно, но при этом никому бы не приходилось держать открытой 1Ску под пользователем регламентных заданий. 

Так как конфигурация была переписана, и некоторые (дописанные) задания требовали наличия полных прав (а переписывать всё в привилегированный модуль было долго и лень 😉 ), то было решено запускать 1Ску под пользователем с полными правами, и прятать окно 1С с рабочего стола чтобы кому-либо не было доступа к интерфейсу программы.

Лучшим вариантом стал запуск 1С как службы. 

Исходный код написан на Delphi

Для тех, кто не сможет скомпилировать исходники сервиса, поменяв в коде логин и пароль пользователя для запуска 1С, для них есть скомпилированный файл сервиса со встроенным логином: "ServiceAdmin" и паролем: "MegaPassword" без кавычек, и с соблюдением регистра. Нужно будет только добавить этого пользователя в базу и задать ему этот пароль.

И самое главное! Если в конфигурации у пользователей есть настройка типа "Запрашивать подтверждение при закрытии программы" или любые её разновидности, которые не закрывают 1С, а выводят какие-нибудь сообщения и ждут действия пользователя перед закрытием, то для этого пользователя необходимо их ОТКЛЮЧИТЬ, иначе процесс 1С зависнет и сервис не сможет остановится ожидая закрытия 1С. Останется только срубать 1С через ctrl+alt+del.

 

Настройка сервиса производится в файле service.ini. Для удобства редактирования файла настроек, а также установки/запуска/остановки сервиса, используется ServiceSetupGUI.exe. С настройками, думаю, не возникнет проблем. Все на русском.

Есть еще один нюанс по остановке сервиса и как следствие закрытию 1С. В настройках сервиса есть галка "Останавливать 1С посылкой wm_close". Она означает, что для закрытия 1С главному окну программы будет послана winapi-комманда WM_CLOSE, что примерно аналогично нажатию крестика "Закрыть" в окне программы. И в большинстве случаев этого будет достаточно. НО, в моей конфигурации нужно было обязательно выполнить, на важно какие, действия перед закрытием 1С, а wm_close бывало приходило раньше, чем они завершались, и 1с закрывалась. Так вот, в этом случае можно убрать галку "Останавливать 1С посылкой wm_close", в этом случае сервис создаст файл "wm_close" в папке, которая будет указана в настройке "Общая с 1С папка для записи файла", и тогда в 1С для нашего пользователя в процедуре ПриНачалеРаботыСистемы можно подключить обработчик ожидания, в котором проверять, не появился ли в нашей папке файл wm_close, и если он там есть, то выполнять необходимые нам действия, после чего вызывать ЗавершитьРаботуСистемы( Ложь ); Сервис дождётся завершения 1С и остановится. Путь к этой папке в 1С у меня хранится в константе, хотя можно его и в коде прописать, если уверены что папка ни куда переедет.

На счет прав. При установке сервиса кнопкой "Установить" из ServiceSetupGUI у пользователя должны быть права администратора. Также если для остановки сервиса через создание файла wm_close  в папке нужно проследить чтобы у соответствующих пользователей были права на запись и удаление файлов в этой папке.

Сервис по умолчанию имеет Тип запуска — автоматически, т.е. при загрузке компа сервис стартанет и запустит 1С. Тип запуска можно сменить либо в Delphi, либо в свойствах службы в оснастке Windows.

В принципе вроде всё, будут вопросы пишите : )

48 Comments

  1. Spartan

    Все это классно и безусловно полезно, но решается гораздо проще с помощью стандартных утилит от мелкомягких instsrv.exe и srvany.exe, входящих в состав Recource Kit для Windows. С помощью них можно запустить любое приложение как сервис, в том числе и 1С.

    Reply
  2. vkr

    (1) А почему бы автору не освоить системное программирование — пусть даже в применении к 1С ?

    Чем он хуже Гейтса и Нуралиева ? 🙂

    Reply
  3. UPSoft

    (1) Spartan, Ну, на самом деле, в моем случае сервис выполнял намного больше функций, там было и бэкапирование и получение/отправка всякихнужныхфайлов, и работа с вебсервисом, вобщем помогал 1Ске с документооборотом… просто я подумал что это может кому-нибудь пригодится, тому кто не знает об instsrv.exe и srvany.exe, а перед ним стоит подобная задача. Всё «ненужное» я почистил оставив основу, на которую уже можно, по желанию, прикрутить всё что угодно…

    Reply
  4. Spartan

    (2),(3) ок, уговорили… 🙂 в любом случае достойно уважения, раз сам написал. плюсую!

    Reply
  5. UPSoft

    качают, а плюсы не ставят 🙁 тут всегда так?

    Reply
  6. DrAku1a

    (5) Бывает и наоборот… Плюсуем если идея понравилась, но не качаем (оставляем зарубку на будущее).

    Reply
  7. D.S.Denton

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

    не качал, поэтому спрошу — с какими параметрами создается сервис? и — гуя сразу вносит запись в реестр или вызывает SC.exe?

    то бишь есть важные моменты:

    type= own или share?

    есть ли дополнительно interact?

    поведение при невозможности старта?

    Reply
  8. UPSoft

    (7) D.S.Denton,

    Сервис регистрируется выполнением из gui команды «Service.exe install», удалить сервис можно, соответственно, командой «Service.exe uninstall», из меню пуск-выполнить… Такой кнопки в gui нет.

    >>поведение при невозможности старта?

    ни как не обрабатывается

    Это полноценный сервис, созданный наследованием от класса TService из SvcMgr.



    SC.exe тут вообще не используется, поэтому вопросы про type = own или share и interact не актуальны.

    Reply
  9. dumal

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

    Reply
  10. sir_sva

    +, качаю как пример сервисов в Дельфи. 1с устраивает в стандарте

    Reply
  11. simgo83

    Необходимо добавить на форму имя пользователя и пароль для 1С, а не программно их привязывать, и плюсов будет гараздо больше, а так нужно еще среду разработки Delphi иметь.

    Reply
  12. UPSoft

    (11) simgo83, как правило такой пользователь имеет полные права, и одной из целей, было скрыть имя и пароль этого пользователя от кого-либо.

    Reply
  13. Il

    Надо будет качнуть — возможно пригодиться.

    Reply
  14. Asaqura
    Il пишет:

    Надо будет качнуть — возможно пригодиться.

    Reply
  15. softest

    удобная вечь я так тоже запускал фоновый задания!

    Reply
  16. Kochevnic

    Спасибо! Попробуем на практике

    Reply
  17. iov

    (0) а бекап файловой базы чем при работающем «сервисе» делаете? И как боретесь с на запланированным открытием модальных окон ?

    Reply
  18. UPSoft

    (18) я не писал что сервис делает бэкапирование. Он просто запускает 1С. А при остановке, пытается её закрыть. И всякие «модальные окна» и т.п. в 1С, уже на том кто этим пользуется, и как раз об этом я в статье предупреждаю.

    Reply
  19. iov

    (19)

    а бекап файловой базы чем при работающем «сервисе» делаете?

    Я тоже не писал что сервис этим занимается — а написал чем делаете бекап при условии что сервис запущен…

    Reply
  20. UPSoft

    (20) iov, в моем сервисе (3), происходит так:

    1) остановка 1с запущенной сервисом

    2) запрет работы пользователей, дожидаюсь пока все выйдут.

    3) бэкапирование 1Ской, через командную строку.

    4) разрешение работы пользователей

    5) старт 1Ски

    Повторюсь, что здесь выложен сервис который только запускает 1С, и ничего выше перечисленного не делает.

    Reply
  21. iov

    (21) ok

    может поможет в дальнейшем

    1)

    бэкапирование 1Ской, через командную строку.

    Кране не надежная вещь.

    2) если между 2 и 4 произойдет завершение или иное действие которое не позволит выполнить 4 пункт — сами догадайтесь.

    А в остальном как и предполагал — высчитывание времени имеет место быть.

    Reply
  22. UPSoft

    (22) iov, если что-то упадет между 2 и 4, есть блок Finally в котором работа пользователей всё равно разрешится, + спецальнообученый человек с ярлыком для того же действия, а если упал сервис то при повторном запуске проверяется нужно ли разрешить работу пользователям.

    и я вообще не понимаю какое отношение имеет мой сервис, который здесь не выложен, к данной публикации.

    Reply
  23. iov

    (23) Просто спросил как делается бекап. ПРОСТО интересно — мне по* правильно или нет.

    Просто интересно чем люди пользуются…

    А тема может быть хоть про обрезание пуповины у страусов на аляске.

    Ответили — спасибо. не ответили — ну заняты значит…

    Лови плюс — в качестве компенсации.

    Reply
  24. seakuban

    публикация — http://infostart.ru/public/101168/ — о запуске 1с в фоновом режиме как регламентного задания))

    Reply
  25. squeez

    А почему бы не сделаьб ввод логина и пароля в файле настройки? Тогда и компилить не прийдётся. Просто не всегда есть под рукой установленный Delphi….

    Reply
  26. UPSoft

    (26) squeez, я уже писал об этом (12). и также о том что есть скомпилированный сервис с логином и паролем.

    Reply
  27. Raminus

    автор молодец.

    Reply
  28. netmate

    А если используется две базы БП 2.0 и УТ 11, то возможно использование данной разработки для проведения процесса обмена между вышеназванными конфигурациями по регламентным заданиям?

    Reply
  29. mob51

    Подскажите возможно ли создать таких служб несколько штук, но так что бы они не пересекались? заранее благодарен за ответ=)

    Reply
  30. Baser

    Я пробовал вручную через SC прописать. Прописалось, но вот запускаться не хотит: сразу отвечает что не получен ответ от службы. Хотя такая ошибка обычно происходит через 30 сек. после попытки запуска службы.

    Вот поэтому вопрос: что именно у Вас прописано в поле «Исполняемый файл».

    Скачать не могу, т.к. виртуальных денег не хватает 🙁

    Reply
  31. Baser

    Еще только заметил, что в процессах она все же появилась и ничего не делает.

    Reply
  32. seakuban

    (33) Baser, может проблема в том что для текущей учетки не зарегистрирована эта база? см. http://infostart.ru/public/101168/

    Reply
  33. Baser

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

    Reply
  34. mob51

    исполняемый файл Service.exe

    Reply
  35. UPSoft

    (32) Baser, читай (8)

    Reply
  36. UPSoft

    (31) mob51, можно, если перекомпилировать сам сервис и обозвать их по разному ( поле Name в (8) ), т.к. запуск сервиса происходит по его имени. И если нужно будет то и в ServiceSetupGUI, в коде, тоже поменять имя сервиса на новое.

    Reply
  37. Baser

    погуглил: сама 1c через sc.exe не заведется. Поэтому нужны такие самописные службы

    Тогда вопрос следующего содержания: как бы запустить с параметрами, а именно хочется выходной файл /outC:Result.txt прописать.

    Reply
  38. UPSoft

    (39) Baser, перекомпилировать сервис, и добавить всё что захочется.

    Reply
  39. kronos87

    Тоже пробовал запускать 1С в качестве службы (правда через anyserv.exe).

    Делал это для организации автообмена между рабочим местом менеджера магазина и кассой (на базе 1С8:Розница).

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

    Вопрос: Можно ли при помощи этой утилиты решить подобную проблему.

    PS: Каталог обмена находится на PC манагера.

    Reply
  40. netmate

    (41) kronos87, всё решается намного проще. Запускаешь 1С из шедулера с параметрами:

    «C:Program Files1cv82Bin1cv8c.exe» ENTERPRISE /IBConnectionString»File=»»C:Инфорационная база»»;» /NВасилий /PПароль /C»DoScheduledJobs SkipMessageBox AloneIBSession»

    Для надёжности запускаешь каждый час. Параметр AloneIBSession не даст запустить вторую копию, если первая жива.

    Reply
  41. kronos87

    netmate, Спасибо,попробую. Таки было чувство что должен быть вариант попроще.

    Reply
  42. netmate

    (43) kronos87, я этот вариант взял из инструкции к 1С 😀 Он просто не может не работать.

    Reply
  43. metmetmet

    (41) kronos87,

    (42) netmate, А можно еще это оформить в виде batch или wsh скрипта, чтобы придать гибкость настройки и запускать задание под другим пользователем, тогда никому «лишняя» 1C’ка мешаться не будет. правда в таком случае не получится корректно завершить 1С’ку, если конечно этого не предусмотреть заранее 😉

    Reply
  44. Kuzja_R

    (11) simgo83, (26) squeez, (31) mob51, (39) Baser,

    решение вопроса — http://infostart.ru/public/157107/

    Reply
  45. KEV8383

    Как указать режим запуска сеанса, чтобы он выполнял регламентные задания? (1С 8.2.16.362, УТ 11)

    Reply
  46. KEV8383

    DoScheduledJobs

    SkipMessageBox

    AloneIBSession

    Reply
  47. w22u

    Есть ещё альтернативный способ: нужно запустить 1С на рабочем столе пользователя, предварительно запустив у него приложение «Tray It!» в котором нужно создать профиль для этой копии, который свернёт и спрячет окно из панели задач и из трея. Сама программа «Tray It!» своё присутствие в трее также может успешно скрывать.

    Reply
  48. script

    Уже два раза очень помогла. Автору большое спасибо.

    Reply

Leave a Comment

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