Регламентные задания для платформы 1С:Предприятие 7.7











В данной статье собраны материалы и инструменты для запуска 1С:Предприятие 7.7 в виде службы Windows.
Цель:
Реализовать механизм запуска 1С:Предприятие 7.7 в режиме "Предприятие" в виде службы Windows без каких-либо вмешательств со стороны пользователей (Администраторов). Так как режим запуска службы можно установить в "Автоматический" — после перезагрузки сервера она будет запущена.
Как правило такой вариант запуска очень помогает решить вопрос, связанный например с периодическим обменом данными.

!!!ВНИМАНИЕ!!!: Изменилась версия файла службы.

1. Теперь стало возможным запускать множество служб для разных информационных баз 1С (индивидуальный для каждой ИБ — файл службы и INI-файл с настройками).

2. Файл со службой может находиться в любой удобной для Вас директории (раньше он жестко был привязан к «c:1cv7regl»)

Описание как это сделать — в самом конце публикации. 


Цель задачи проста:

В 1С:Предприятие 7.7 нет такого объекта конфигурации как «Регламентное задание» по сравнению с 8-й версией Платформы — приложенный в данной публикации набор инструментов позволяет запускать сеанс 1С:Предприятие 7.7 в виде службы Windows, с последующей отработкой действий через обработчики ожидания.

Моя задача состояла в том, чтобы запустить 1С 7.7 как службу и с определенной периодичностью подгружать данные из файлов в ИБ, которые в свою очередь выгружались из другой учетной системы. 

Также порассуждаем на тему основных проблем запуска 1С:Предприятия в виде службы, и разберем варианты реализации данной задачи.

Первое с чего хотелось бы начать — это проблемы, с которыми можно столкнуться при запуске 1С 7.7 в режиме «Предприятие»:

1. В случае, если кто-либо из пользователей информационной базы произвел запуск в монопольном режиме, то это сразу же накладывает блокировку запуска этой ИБ у других пользователей.

2. Если процесс 1С:Предприятие 7.7 был завершен некорретно, то при последующей попытке запуска мы «натыкаемся» на диалоговое окно:

Диалоговое окно с предложением запуска в монопольном режиме

и для корректного запуска 1С 7.7 нужно все равно запускать ее в монопольном режиме с последущим выходом, дабы освободить ИБ для работы остальных пользователей.

Про пункт №1 — просто так кто-либо из пользователей ни с того ни с сего не должен запускать 1С:Предприятие 7.7 в монопольном режиме. Этот пункт остается на контроле Администратора, который в принципе должен быть в курсе подобных событий.

Про пункт №2:

  1. первый вариант решения проблемы стандартный и состоит из следующих действий — запустить монопольно, переиндексировать ИБ или нет — на выбор, выйти и дать работать остальным пользователям.
  2. второй же вариант, который пришлось применить — это удаление файла 1susers.dbf, в котором после завершения работы всеми пользователями остается запись как раз того пользователя, который некорретно «вылетел» — в принципе эта запись и является сигналом Платформе к тому, чтобы показать диалоговое окно про монопольный режим.

Напрашивается несложный метод:

Чтобы 1С 7.7 обязательно запустилась, необходимо сначала попытаться удалить файл 1susers.dbf и затем стартовать 1С в режиме «Предприятие». Если файл удалить не получилось то это почти на 100% означает, что с данной информационной базой работают другие пользователи и на окно с требованием запуска в монопольном режиме мы однозначно не «нарвемся».

Все бы хорошо, и по сути можно написать некий bat-файл, состоящий из двух действий и прописать его в планировщик заданий Windows.

Тут появляется нюанс:

1. Чтобы остановить сеанс 1С 7.7, который мы стартовали при помощи «батника» (ситуации бывают разные, и остановка такого «регламентного задания» тоже бывает необходимой, например если ИБ нужно запустить монопольно) как вариант — попробовать прописать в «батник» конструкции котрые бы «убивали» запущенный процесс — причем «убивали» конкретный экземпляр, который был запущен от определенного пользователя, чтобы не выбить нужные процессы, т.к. на одном сервере может работать куча экземпляров 1С от разных ИБ и разных пользователей. Или же Администратор руками через диспетчер задач Windows сам находит этот процесс и завершает его. А наша задача состоит в том чтобы вмешательство со стороны Администратора в работу такого регламента было минимальным.

Хотелось бы отметить то, что средствами пакетных файлов Windows достаточно затратно реализовывать некое отслеживание работы процесса 1cv7.exe под конкретным пользователем ОС. Это пожалуй основная причина, по которой было решено реализовывать работу 1С в виде службы Windows, так как службу можно и перезапускать и останавливать когда это необходимо и стартовать она может автоматически. 

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

1. Удаление файла 1susers.dbf;

2. Запуск 1С 7.7 с параметрами коммандной строки;

3. Отработка вышеуказанных действий без вмешательства со стороны Администратора (автоматический запуск службы);

4. Возможность в любой момент, без лишних поисков нужного процесса, остановить этот самый сеанс 1С (остановка службы). 

Техническая сторона реализации решения следующая:

Текущее решение выполнено в виде скомпилированного VB-скрипта.

1cv7regl — выполняет перечисленные выше операции №1 и №2, а после установки его в виде службы Windows удовлетворяет требованиям пунктов №3 и №4;

 

Чтобы «превратить» скрипт-VB в процесс — его как минимум нужно сделать приложением. В архиве для скачивания скрипты уже скомпиллированы.

Для установки «скомпилированных» скриптов в качестве службы Windows использовался «NSSM: The Non-Sucking Service Manager» (http://nssm.cc/) — это open-source утилита, позволяющая запускать приложения в виде служб.

 

Теперь, как это работает: 

Для удобства настройки работы скрипта реализован механизм работы с INI-файлом — файл выглядит следующим образом:


[settings]

Name = «ЮзерРегл»
Password = «123»
DirForBase = c:1cv7reglТестовая база
PlatformPath = C:Program Files1Cv77BIN1cv7.exe


Name — Имя пользователя в ИБ 1С;

Password — Пароль пользователя ИБ 1С;

DirForBase — каталог ИБ;

PlatformPath — путь к платформе 1С 7.7 (т.к. не обязательно она будет располагаться в каталоге «Program files»).

 

Установка:

К данной статье я прикладываю архив с файлом службы 1cv7regl.exe, NSSM и тестовую базу 1С, в которой прописан простой обработчик ожидания. 

Содержимое архива необходимо распаковать на диск «C».

Таким образом у вас должна получиться следующая структура файлов и каталогов:

Содержимое папки C:1cv7regl

1cv7regl.exe — файл службы 1cv7regl
1cv7regl.ini — файл с настройками служб

nssm-2.24 — дистрибутив NSSM

Тестовая база — тестовая ИБ 1С

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

В результате запуска файла должна запуститься 1С 7.7,под указанным в INI пользователем, паролем, для указанной информацинной базы.

Установка службы 1cv7regl:

nssm install 1cv7regl

В диалоговом окне NSSM необходимо установить параметры (прикладываю скрины):

NSSM#1

NSSM#2

NSSM#3

Все настройки на остальных вкладках нужно оставить по-умолчанию.


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

Эти «нюансы» справедливы даже, если вы пропишите при помощи NSSM сам файл платформы (1cv7.exe) как службу!

В момент запуска 1С с параметрами коммандной строки от пользователя «система» (так как мы запускаем службу) платформа скорее всего попросит добавить информационную базу в список, но вы этого не увидите без определенных манипуляций. 

Пойдем по порядку:

1. Необходимо запустить службу ui0detect («Обнаружение интерактивных служб»). Сделать это можно при помощи powershell, комманда «start-service ui0detect«

2. Проверить состояние данной службы можно в том же powershell «get-service ui0detect«

3. Возможно обнаружение интерактивных служб отключено на уровне ОС — нужно проверить в реестре: 

HKLMSystemCurrentControlSetControlWindows параметр типа DWORD с именем NoInteractiveServices и ставим его значение в 0.

 

Теперь в свойствах службы 1cv7regl взводим флажок «Разрешить взаимодействие с рабочим столом» и запускаем ее.

Взаимодействие службы с рабочим столом

 

В момент запуска должен появиться диалог при помощи которого мы можем попасть сессию где запускается наша 1С:

Обнаружение интерактивных служб

 

С большой долей вероятности там будет нечто подобное:

Диалоговое окно регистрации ИБ

Прописываем базу и теперь сервис полностью готов к работе.

P.S. Лучше создать отдельного пользователя в ИБ со своими необходимыми правами и минимальным интерфейсом, от имени которого будет осуществляться обмен или иной регламент.


ВАЖНО ДЛЯ ТЕКУЩЕЙ ВЕРСИИ!!!: В случае когда необходимо стартовать несколько подобных процессов (например для нескольких разных ИБ) необходимо:

1. Скопировать файл 1cv7regl.exe — например в 1cv7regl2.exe

2. Скопировать INI-файл — его имя должно соответствовать имени файла службы (1cv7regl2.ini)

3. При помощи NSSM зарегистрировать еще одну службу (например под именем 1cv7regl2 выбрав соответствующий exe-файл из п.1)

14 Comments

  1. sournk

    Чем это решение принципиально лучше интерактивного запуска приложений под нужным пользователем? Что делать, если потребуется несколько одновременно запущенных 1С под разными пользователями?

    Reply
  2. fora-4a

    1. Если говорить о запуске в интерактивном режиме — например через тот же BAT-файл, то про это написано в публикации почти в самом начале. А именно какие минусы у данного метода, по сравнению с запуском в виде службы.

    2. Запуск таких служб для нескольких баз одновременно на одном сервере (ПК) будет реализован в течение ближайших пары дней:

    * Можно будет именовать файл службы (exe) по собственному усмотрению (для одной базы — файл под своим именем), после чего он будет забирать параметры из одноименного INI-файла. Таким образом можно будет зарегистрировать при помощи NSSM сколько угодно много служб.

    Reply
  3. fora-4a

    (1) sournk, файлы публикации обновлены, также добавлено краткое описание каким образом запустить несколько служб для разных ИБ.

    Reply
  4. puh14

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

    Reply
  5. fora-4a

    (4) puh14, Параметр Pause в инишнике как раз для проверки наличия процесса у службы.

    Реализация отслеживания будет в следующей версии. Буквально на этой неделе.

    Сейчас служба никак не реагирует на тот факт — если процесс 1cv7.exe будет «убит» руками или по какой либо-другой причине.

    Reply
  6. user796070

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

    Попробовал обработку ожидания через FormEx, она вроде заработала в вашем варианте.

    Reply
  7. user796070

    Уже сам разобрался. Оказывается при старте базы запускался «Совет дня» и блокировал стандартную обработку ожидания. Обработка ожидания через FormEx при этом не блокируется.

    Не сразу было понятно откуда ноги ростут, т.к процесс запущенный от имени системы через службу не отображается на рабочем столе.

    Reply
  8. CheBurator

    Игнорирование необходимости переиндексации чревато трудно диагностируемыми проблемами.

    Reply
  9. fora-4a

    (7) в общем про подобную особенность упоминалось, а именно про диалоговое окно которое препятствует окончательного запуску платформы.

    Reply
  10. fora-4a

    (8) для этого в компаниях и должны существовать специалисты, проводящие подобные регламенты. Это всего лишь одна из реализаций требовавшейся когда-то задачи.

    Reply
  11. user796070

    Можете подсказать, как отслеживать ситуацию когда 1с запущенный службой закрывают по какой либо причине (сис. админ или вылет из-за ошибки). Ваша разработка не умеет проверять запущена ли 1с службой и перезапускать ее в случае отсутствия? Или может что то посоветуете по этому поводу?

    Reply
  12. fora-4a

    (11)ответ написал, но что то не вижу его — еще раз напишу — мониторинг процесса есть и если его закрыть (например через диспетчер задач), то он будет перезапущен автоматом.

    Reply
  13. user796070

    У меня служба запускает два процесса

    1cv7regl и 1c:v7 — непосредственно сама 1с

    Если убить процесс 1cv7regl, то 1c:v7 автоматически закрывается и запускается заново

    Если убить процесс 1c:v7, то ничего не происходит, 1cv7regl остается висеть в диспетчере как и раньше, а 1c:v7 уже не появляется

    Так и задумано или все же 1c:v7 должен запускаться после закрытия через диспетчер и это у меня что то не сростается просто?

    Reply
  14. user782054

    Файл не найден! Дайте пожалуйста рабочую ссылку

    Reply

Leave a Comment

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