Постоянное наличие одного сеанса в файловой базе 1С
Для того, чтобы выполнялись регламентные задания, нужно чтобы в базе всегда присутствовал один сеанс 1С.
Написал для этого простую обработку RunOne1s.epf, которая раз в минуту проверяет, есть ли другие сеансы, и если есть, завершает свою работу. Саму обработку надо запускать раз в 10 минут, если сеансы есть, она сразу закроется.
Командная строка для запуска базы имеет вид:
"C:\Program Files (x86)\1cv8\8.3.17.2171\bin\1cv8.exe" ENTERPRISE /AppAutoCheckMode /DisableStartupMessages /F"C:\1C\Bases\trade" /N"robot" /P"****" /Execute "C:\1C\RunOne1s.epf" /CОтключитьЛогикуНачалаРаботыСистемы
У пользователя robot должны быть права на открытие внешних обработок:
При этом надо хоть раз зайти интерактивно под пользователем, чтобы согласиться с предупреждением (если не используете отключение логики начала работы системы):
В принципе, можно использовать ключ отключения логики начала работы системы /CОтключитьЛогикуНачалаРаботыСистемы, хотя он пишется на русском, это лишние проблемы с кодировкой в скрипте, но не в командной строке планировщика.
Для того чтобы из скрипта запускалось, использую кодовую страницу UTF как описано здесь:
chcp 65001
В конфигураторе у пользователя robot должна быть отключена галочка «Защита от опасных действий», иначе при открытии обработки будет один раз выдавать предупреждение.
Благодаря отключению логики работы системы в начале работы выводится вот такая надпись и не делается лишних тяжеловесных проверок:
Сам тестовый скрипт run1s.cmd выглядит так:
chcp 65001 «C:\Program Files (x86)\1cv8\8.3.17.2171\bin\1cv8.exe» ENTERPRISE /AppAutoCheckMode /DisableStartupMessages /F»C:\1C\Bases\trade» /N»robot» /P»****» /Execute «C:\1C\RunOne1s.epf» /CОтключитьЛогикуНачалаРаботыСистемы pauseВ планировщик надо прописать строку для программы:
"C:\Program Files (x86)\1cv8\8.3.17.2171\bin\1cv8.exe"
И для ее параметров:
ENTERPRISE /AppAutoCheckMode /DisableStartupMessages /F"C:\1C\Bases\trade" /N"robot" /P"****" /Execute "C:\1C\RunOne1s.epf" /CОтключитьЛогикуНачалаРаботыСистемы
Само задание запускать раз в 10 или 15 минут, я использую 15 минут, чтобы не перегружать систему:
Вначале не нужно ставить галочку «Выполнять для всех пользователей», тогда 1С будет визуально открываться в текущем сеансе. Можно выполнить его вручную или дождаться выполнения. Визуально будет виден запуск 1С и если нет открытых сеансов 1С Предприятия, окно запущенной 1С останется с открытой обработкой.
Потом поставить галочку «Выполнять для всех пользователей», чтобы выполнять даже если не открыт сеанс администратора. Проверить, что если нет открытых сеансов 1С Предприятия, задача находится в планировщике в состоянии «Это задание выполняется в настоящее время». Или посмотреть в журнале регистрации, что сеанс под robot начат, но не завершен.
Далее запустить 1С и убедиться, что в течении минуты сеанс robot будет завершен. Можно смотреть журнал регистрации:
В планировщике у задания будет результат запуска (0x1). Это нормально.
Желательно также закрыть сеанс и потом через некоторое время убедиться, что сеанс robot был запущен и открыт некоторое время, пока не были запущены другие сеансы 1С.
Код формы обработки выглядит так:
&НаСервере Функция ЗавершатьРаботуСистемы() Экспорт НомерСоединенияИнформационнойБазы = НомерСоединенияИнформационнойБазы(); СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы(); Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл Если НомерСоединенияИнформационнойБазы = Соединение.НомерСоединения Тогда Продолжить; КонецЕсли; ИмяПриложения = Соединение.ИмяПриложения; //1CV8 - идентификатор приложения "1С:Предприятие"; //1CV8C - идентификатор приложения тонкого клиента "1С:Предприятие"; //Если есть другие соединения, кроме текущего Если ИмяПриложения = "1CV8" ИЛИ ИмяПриложения = "1CV8C" Тогда Возврат Истина; //ЗавершитьРаботуСистемы(ложь); КонецЕсли; КонецЦикла; Возврат ложь; КонецФункции &НаКлиенте Процедура ПроверкаСоединений() Экспорт Если ЗавершатьРаботуСистемы() Тогда ЗавершитьРаботуСистемы(ложь); Иначе Сообщить("Других сеансов нет, держим служебный сеанс открытым: " + ТекущаяДата()); КонецЕсли; ПодключитьОбработчикОжидания("ПроверкаСоединений", 60, истина); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) ПроверкаСоединений(); КонецПроцедуры
Купить у меня за 800 руб.
Свежие комментарии