Входные условия :
Есть в клиент-серверной базе предопределенное регламентное задание с методом МойОбщийМодуль.МояПроцедура1, которое раз в N минут должно что-то делать в базе. Периодически по непонятным причинам фоновое задание, порождаемое регламентным, зависает. Как уже сказано выше, снять его проблематично. Но что еще хуже, новое фоновое задание стартовать не хочет. А зачем? Одно ведь уже выполняется!
Таким образом, очень важные процедуры просто прекращают выполняться.
Как я с этим боролся:
1) Регламентное задание убираем из конфигурации
2) Вводим пользователя специально для выполнения этой процедуры.
3) В Процедуре ПриНачалеРаботыСистемы пишем примерно так:
Если ИмяПользователя()="ЭтоСамоеИмя" Тогда
МойОбщийМодуль.МояПроцедура2();
ПрекратитьРаботуСистемы();
КонецЕсли;
4) В общем модуле МойОбщийМодуль
Процедура МояПроцедура2() Экспорт
МоеФЗ=ФоновыеЗадания.Выполнить("МойОбщийМодуль.МояПроцедура1",,Строка(ТекущаяДата()));
КонецПроцедуры
5) В Планировщике Windows делаем задание на запуск базы с этим пользователем с нужным расписанием.
Что мы этим достигаем? Того же, что и в первом случае, за исключением того, что каждое фоновое задание запускается с уникальным ключом (см. третий параметр в методе выполнить). Поэтому зависшее фоновое задание не мешает стартовать следующим.
И контрольный выстрел : чтобы почистить зависшие фоновые задания раз в сутки ночью выполняем с помощью планировщика задание на
net stop... net start...
Решение громоздкое, некрасивое и не нравится мне. Прошу сильно не пинать. Это больше приглашение к дискуссии. Буду рад, если кто-то предложит лучше.
Пакетный запуск 1С использовался еще в 7-ке, до появления регламентных заданий.
А с зависшими регламентными заданиями надо разбираться…
2 Maniac(2)
Это я пробовал. В том то и дело, что они не рубятся. Впрочем, это как раз такая тема, которая понимается, когда лично тебя петух клюнет. Если вас еще ни разу не клюнул — просто радуйтесь жизни.
Кстати, Вас, Dushelov (1) это тоже касается 🙂
(3) Зависали сессии. Было. Проблема в коде (блокировки транзакций) была. Пишите безопасный код, тогда сведете зависания к минимуму.
(4)
Во! Это уже конструктифф ! Что Вы имеете в виду под безопасным кодом ?
Немного подробнее о том, что делается в зависающей процедуре. Вызывается через Интернет (web-интерфейс) другая база, туда-сюда гоняются xml-строки, создаются и проводятся документы.
(0) Через консоль кластера задание не убивается??? Что-то с трудом в это верится…
Кстати, с пустыми именами пользователя в консоли могут висеть не только фоновые задания, но и, например, пользователи, которые оставили окошко с вводом пароля аутентификации… соединение есть, а пользователя нет (еще не вошел). Тоже нормально гасятся через консоль кластера 1С.
(6) Не убиваются. Замечено не однократно.
И соединения не гасятся, блокировка регламентных и соединений в консоли тоже не помогает.
(7) А что пишет? Блокировка-то понятно, что не помогает… А вот когда заходим в консоль серверов 1С предприятия, выбираем в дереве наш кластерсервернашу ИБсоединения… нажимаем на нужное правой кнопкой, пункт «Удалить», и не убирается? или снова появляется? или ошибку выдает?
(8) Соединение удаляется и появляется снова.
(9) Дак надо код тогда смотреть, нахрена она в цикле в базу долбится. Против пользователей, которые на автоподключение 1С-ку ставят блокировка помогает, а вот с заданиями похоже надо с каждым конкретным случаем разбираться. Хотя тут конечно спорный вопрос. Конечно программа должна работать так, как хочет программист, но если код платформы закрыт, то может что-то и в ней глюкать. Но это очень маловероятно, т.к. платформа 8.1 вылизана до мелочей…
(10) При чем тут вообще цикл?
(10)
😀
(10) «платформа 8.1 вылизана до»
удивляйся
http://www.infostart.ru/public/65146/
Блаженны верующие… 😀
Ладно, про вылизанную платформу погорячился чуток)) Хотя в типовых решениях данные всетаки обработками в режиме энтерпрайз к нормальному виду приводятся… Но вот такой жесткий косяк, если код за собой тапки пытается убрать (ЗавершитьРаботуСистемы) а платформа этот код все равно весит… Просто слов нет, как это называется.
типа «допустимые потери памяти» 🙂
http://www.infostart.ru/public/63392/
(8) У меня даже не повисшие фоновые не рубятся ни через что….. как писал (9) соединение появляется вновь. А вообще как и говорилось, надо отлаживать код… У нас были моменты когда фоновое зацикливалось и вообще блокировало доступ в базу, подставив в нужном месте ЗафиксироватьТранзакцию(); проблема снялась. И т.д. и т.п.
Автор прав, глюк есть. Он проявляется при доступе в инет. Например обмен с фтп. Сессия подвисает и не убивается. Его вариант удобен, если есть возможность сделать перерывы в работе. А если база должна работать 24 часа, приходится извращаться другими способами. Я вышел тоже кривым способом: создал клиентскую обработку, которая подстраховывает на случай зависания задания. И при зависании пользователям сыпятся сообщения, что нужно ее запустить в отдельной программе. Благо виснут они не очень часто — раз-два в месяц. Но всеж было бы замечательно без этого )
А в этом фоновом задании случаем OLE не используете? Если да, то скорее всего он и виноват, ненадежный зараза 😥
(19)
Нет, дело в том, что в процессе выполнения задания идет обращение в интернет. Зависает ТАМ. Я раскопал в документации объяснение, что снять задание невозможно, т.к. в серверных процедурах останов действует, только когда управление передается на следующий оператор за тем, во время которого произошла попытка останова. А управление не передается никогда, т.к. зависло. Можно переписать с серверных процедур на клиентские, раз я все равно запускаю сеанс. Но тогда кто-то должен вручную снять задание, т.е. кто-то должен следить за этим. А чтобы не следить, вот я и предложил такое.
Есть такое и на 8.2. причем там хуже. В режиме УФ часто используются фоновые, поэтому там чаще он себя проявляет.
Например накидал отчет на СКД, который тупо выводить содержимое регистра. На толстом клиенте в обычном режиме — все ОК, за секунду выводит. в режиме УФ виснит зараза (пораждает фоновый процесс, а результата нет). Помогло только рестарт сервера предприятия. Тогда сразу все взлетело.
P.S. А кто нибудь рестарт рабочих процессов настраивал, для борьбы с этим?
Сам когда-то пытался бороться с проблемой завершения и удаления фоновых заданий (причем не только зависших, но и просто отработанных). Пришел к выводу, что это невозможно.
Также ищу решение по задаче рестарта работчих процессов.
фоновое задание, убивающее фоновые задания
Это я так, сказал просто
у меня те же грабли. То задания выполняются, а то вдруг в какой-то момент виснут, причем иногда все сразу.
У меня такая проблема, переходить на предложенную схему неохота. А как узнать где именно зависает? Может блокировки, может транспорт? Как узнать?
Так и не понял, есть ли еще решения для данной проблемы?
(26)
Нет. Уже 8.3, но все так и осталось. Для баз, у которых есть необходимость периодически лазить в инет, и при этом критично, чтобы эти задания ОБЯЗАТЕЛЬНО выполнялись, я использую планировщик заданий Windows с запуском клиентских сеансов, вместо механизма регламентных заданий.