Фоновое задание на каждые 5 секунд (клиент сервер)

1. timeforlive 15 11.12.17 06:57 Сейчас в теме
Всем привет!
Обращаюсь к вам за советом, как реализовать запуск обработки в фоне, которая будет работать в режиме 24\7

Сейчас это работает так. Есть батник (.bat), который запускается на серваке планировщиком заданий под конкретным пользователем. Кратко - он запускает 1С и обработку, а также проверяет каждую минуту, что процесс 1С все еще активен. Если не активен, то запускает себя сам снова.

Обработка запускает еще кучу обработок - на каждого телеграмм бота свою из справочника внешние обработки. Все настройки ботов на регистрах сделаны.
В обработке выполняется метод встроенного языка "ПодключитьОбработчикОжидания" и каждые 5 секунд делается проверка, были ли переданы боту сообщения и если да, то выполнить эти команды.

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

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


В рамках данного вопроса спрошу вот еще что. Может мне это поможет и я оставлю все на батнике.
Если процесс 1С убить или он зависнет, то батник будет продолжать видеть запущенный процесс 1С. Как быть в такой ситуации?
Думал над запуском каждые 1-2 часа другого батника, убивающего все процессы 1С, но это радикальный метод. Может запрос бота обработать некорректно в момент отключения.
Думал над таким извращением как запуск в фоновом задании обработки, которая будет проверять - запущен ли сеанс пользователя (все через метод встроенного языка "ПолучитьСоединенияИнформационнойБазы") и если нет, то будет запускать батник, убивающий процессы 1С для конкретного пользователя (винды).
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
8. sandybaev 196 12.12.17 11:27 Сейчас в теме
(1) А может попробовать весь фон перекинуть на apache?
создать в 1с web-сервис и пусть апач каждые 5 сек вызывает твою обработку.
зато 1с не будет висеть, вся нагрузка ляжет на другой сервак

реализовать это вроде не сложно если знаешь как с xdto работать.
13. Win98 12.12.17 14:25 Сейчас в теме
(1) ... у нас бот работает в регламентном задании каждые 3 секунды... больше года, полет нормальный.
2. Aitbay 11.12.17 07:52 Сейчас в теме
у меня запуск производится раз в 10 минут
иногда фоновое задание выполняется больше приходится ограничивать

Если ИнтерективныйЗапуск Тогда
Попытка
ФоновоеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.СКД_ЗагрузкаЖурналаСобытий).ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено И ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда // продолжать нет смысла
Сообщить(НСтр("ru = 'Загрузка новых событий выполняется другим процессом.'"));
Возврат Ложь;
КонецЕсли;
Исключение
// Возможно менеджер фоновых заданий не активен, продолжим выполнение кода
КонецПопытки;
КонецЕсли;

мжт поможет
4. timeforlive 15 12.12.17 10:45 Сейчас в теме
(2)
Д_ЗагрузкаЖурналаСобытий).ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено И ФоновоеЗадание.Состояние =


Да, это очень поможет, спасибо. Только для другой задачи, хах.

Пока что остаюсь верным идее с батником. Обновление каждые 5-10 секунд для пару десятков ботов - это круто, но с этим не справится регламентное задание.
И самое то главное, вчера в процессе тестирования обнаружил (вспомнил) одну особенность. Пользователь, чтобы получить информацию из 1С от бота, должен сначала авторизироваться, а затем кнопками выбрать действия. Так вот. Если обработку закрыть и открыть снова, то авторизироваться придется снова. А это вовсе никуда не годится.

Думаю сделать так.
В момент, когда обработка будет запущена (перезапущена) выполнится следующий код. На все запросы отвечать "перезагрузка бота завершена, повторите авторизацию" (либо вообще ничего не отправлять).
3. VmvLer 11.12.17 09:16 Сейчас в теме
по-моему, смесь технологий "фоновые задания 1С" и "исполнение bat-файлов" портит все дело. как ни крутись - косяков избежать сложно.

я бы выбрал что-то одно(одну технологию), избегая трудностей "притирки" друг к другу
корум; +1 Ответить
5. timeforlive 15 12.12.17 10:50 Сейчас в теме
Добавлю вот еще полезную ссылку по запуску 1С из командной строки:
http://kb.mista.ru/article.php?id=338

Мне помогла команда /DisableStartupMessages чтобы отключить стартовые сообщения, типа "...конфигурация не соответствует сохраненной..." и т.д.
6. timeforlive 15 12.12.17 10:57 Сейчас в теме
И текста самого батника выкладываю, поможет решить вопрос о работе 1С в режиме 24\7 (в кавычках):

:m0
start "1cv8" "C:\Program Files\1cv8\8.3.10.2639\bin\1cv8.exe" ENTERPRISE /S"MY_FOLDER1\MY_FOLDER2" /N"MY_USER_1C" /P"MY_PASSWORD" /Execute"MY_FOLDER_WHERE_EPF\start_all_bots.epf" /DisableStartupMessages
:m1
TIMEOUT /T 45 /NOBREAK
TaskList /FI "username EQ MY_USER" /FI "IMAGENAME eq 1cv8.exe" | Find /I "1cv8.exe"
If %ErrorLevel% NEQ 0 goto :m0
goto :m1


И перезапуск всех процессов 1С:
taskkill /fi "username eq MY_USER" /IM 1cv8.exe /f

Где
MY_USER - имя пользователя
MY_FOLDER1\MY_FOLDER2 - путь расположения базы
MY_USER_1C - имя пользователя 1С
MY_PASSWORD - пароль пользователя (вроде как быть обязан для запуска из cmd)
MY_FOLDER_WHERE_EPF\start_all_bots.epf - путь к обработке, которую нужно запустить
7. ЧерныйКот 12.12.17 11:09 Сейчас в теме
делал такое. только фоновое задание запускалось однократно и висело постоянно.
вечный цикл "пока Истина", чтоб не было зависаний, и сервер не молотил это задание постоянно - обращение к оболочке - команда таймаут на 1 секунду.
Если обработку закрыть и открыть снова, то авторизироваться придется снова. А это вовсе никуда не годится.
и авторизацию не придется делать снова.
P.S. на файловой базе такой метод требует доп настройки = пришлось выделить 1 сеанс отдельный, на котором был разрешен запуск этого регламентного, в остальных сеансах запуск был запрещен, иначе такое вечное регламентное - не давало запустится остальным регламентным.
9. timeforlive 15 12.12.17 11:44 Сейчас в теме
(7) А в фоне вечный цикл только одну обработку выполнял?

Да, отдельный пользователь на сервере. Отдельный пользователь в 1С. Ну это нормально.
Вот есть проблема. Для каждого бота нужно запускать отдельную обработку (там все заточено на одного бота, переделывать ее уже не стану, двойная работа).

Сейчас батник запускает обработку, которая запускает на каждого бота отдельную обработку, а сама проверят каждые минут 30, появился ли новый бот.
В общем, понял, если делать на регламентных заданиях, все переделывать придется. Так что не вариант. Но за совет спасибо.

Расскажите, какие проблемы возникали при вечном цикле в фоне? Ни разу не использовал, боязно такую бомбу делать :)
10. ЧерныйКот 12.12.17 11:52 Сейчас в теме
(9) регламентное запускалось один раз, с миллионом попыток перезапуска (на случай если сервак выключат/перезагрузят).
в самом регламентном не было вызова обработок, все было в коде процедуры, сама процедура выполняла https запросы и обрабатывала их ответы, после получения и обработки - таймаут системе, иначе реально сервер ляжет. авторизация выполнялась перед циклом, далее авторизация повторялась если по каким то причинам соединение сбрасывалось (например сбой интернета), и т.д....
Если боязно - поставь таймаут 5 секунд, в моем регламентном таймаут был 1 секунда, хотя поначалу тоже ставил 5,потом 2.

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

Хотя, по уму, решение действительно нерекомендуемое, т.к. разумнее написать свой модуль на C++ или еще каком то языке программирования, и запускать его отдельно от 1С, ловя и обрабатывая от него только внешние события.
11. timeforlive 15 12.12.17 13:11 Сейчас в теме
(10) Звучит прекрасно. Одно задание, никаких батников.
Завтра вечером попробую этот вариант - с вечным циклом. Переделаю обработку на обход всех ботов, чтобы не запускать отдельную обработку на каждого.
12. timeforlive 15 12.12.17 13:27 Сейчас в теме
(7)
чтоб не было зависаний, и сервер не молотил это задание постоянно - обращение к оболочке - команда таймаут на 1 секунду


А как настроил фон, чтобы не дублировался запуск заданий?
14. ЧерныйКот 12.12.17 14:35 Сейчас в теме
(12)
так запуск один раз, никаких дублей задания не может быть. а чтоб перезапускалось при перезагрузке сервера - миллион попыток).
могу вечером из дома скинуть вырезку основного кода без начинки. судя по описанию задачи вам должен подойти такой вариант.
15. timeforlive 15 12.12.17 19:52 Сейчас в теме
(14) Проверил на вечном двигателе цикле - работает норм. Сейчас посмотрю как ночью фон будет работать и день рабочий.
Прикрепленные файлы:
16. ЧерныйКот 12.12.17 23:56 Сейчас в теме
(15) как и обещал - держи код:
Выполнять: каждый день; каждые 3 сек.
Повторять при ошибках: 1000000 раз через 1 секунду.
Процедура ВечныйДвигатель()
	
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
	
	УстановитьПривилегированныйРежим(Истина);
	
	// <инициализация локальных переменных>
	
	Shell = Новый COMОбъект("WScript.Shell"); 
	
	// <авторизация>	
	
	Пока ИСТИНА Цикл
		
		// <получение данных>
		
		// <обработка данных>	
		
		Подождать(1, Shell); 
		
	КонецЦикла;
	
КонецПроцедуры

Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
	
	Попытка
		Если Shell = Неопределено Тогда
			Shell = Новый COMОбъект("WScript.Shell"); 
		КонецЕсли;
		Shell.Run("timeout /T " + Секунд + " /nobreak" ,0,True);	
	Исключение
		// обработка не требуется
	КонецПопытки;
	
КонецПроцедуры

Показать
timeforlive; +1 Ответить
17. timeforlive 15 13.12.17 12:33 Сейчас в теме
(16) Спасибо. Сегодня вечером потестирую.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)