Постоянное наличие одного сеанса в файловой базе 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 руб.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

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