К вопросу о зависающих фоновых заданиях в 8.1

Фоновые задания в клиент-серверном варианте иногда зависают так, что снять их можно только путем перезапуска службы. Насколько я понял, никто не знает, что с этим делать. И я не знаю. Но могу поделиться опытом, как научиться с этим жить 🙂

Входные условия :

Есть в клиент-серверной базе предопределенное регламентное задание с методом МойОбщийМодуль.МояПроцедура1, которое раз в N минут должно что-то делать в базе. Периодически по непонятным причинам фоновое задание, порождаемое регламентным, зависает. Как уже сказано выше, снять его проблематично. Но что еще хуже, новое фоновое задание стартовать не хочет. А зачем? Одно ведь уже выполняется!

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

Как я с этим боролся:

1) Регламентное задание убираем из конфигурации

2) Вводим пользователя специально для выполнения этой процедуры.

3) В Процедуре ПриНачалеРаботыСистемы пишем примерно так:

Если ИмяПользователя()="ЭтоСамоеИмя" Тогда
    МойОбщийМодуль.МояПроцедура2();
    ПрекратитьРаботуСистемы();
КонецЕсли;

4) В общем модуле МойОбщийМодуль

Процедура МояПроцедура2() Экспорт
    МоеФЗ=ФоновыеЗадания.Выполнить("МойОбщийМодуль.МояПроцедура1",,Строка(ТекущаяДата()));
КонецПроцедуры

5) В Планировщике Windows делаем задание на запуск базы с этим пользователем с нужным расписанием.

Что мы этим достигаем? Того же, что и в первом случае, за исключением того, что каждое фоновое задание запускается с уникальным ключом (см. третий параметр в методе выполнить). Поэтому зависшее фоновое задание не мешает стартовать следующим.

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

net stop...  net start...

Решение громоздкое, некрасивое и не нравится мне. Прошу сильно не пинать. Это больше приглашение к дискуссии. Буду рад, если кто-то предложит лучше.

26 Comments

  1. Душелов

    Пакетный запуск 1С использовался еще в 7-ке, до появления регламентных заданий.

    А с зависшими регламентными заданиями надо разбираться…

    Reply ↓
  2. bulpi

    2 Maniac(2)

    Это я пробовал. В том то и дело, что они не рубятся. Впрочем, это как раз такая тема, которая понимается, когда лично тебя петух клюнет. Если вас еще ни разу не клюнул — просто радуйтесь жизни.

    Кстати, Вас, Dushelov (1) это тоже касается 🙂

    Reply ↓
  3. Душелов

    (3) Зависали сессии. Было. Проблема в коде (блокировки транзакций) была. Пишите безопасный код, тогда сведете зависания к минимуму.

    Reply ↓
  4. bulpi

    (4)

    Во! Это уже конструктифф ! Что Вы имеете в виду под безопасным кодом ?

    Немного подробнее о том, что делается в зависающей процедуре. Вызывается через Интернет (web-интерфейс) другая база, туда-сюда гоняются xml-строки, создаются и проводятся документы.

    Reply ↓
  5. a-novoselov

    (0) Через консоль кластера задание не убивается??? Что-то с трудом в это верится…

    Кстати, с пустыми именами пользователя в консоли могут висеть не только фоновые задания, но и, например, пользователи, которые оставили окошко с вводом пароля аутентификации… соединение есть, а пользователя нет (еще не вошел). Тоже нормально гасятся через консоль кластера 1С.

    Reply ↓
  6. Душелов

    (6) Не убиваются. Замечено не однократно.

    И соединения не гасятся, блокировка регламентных и соединений в консоли тоже не помогает.

    Reply ↓
  7. a-novoselov

    (7) А что пишет? Блокировка-то понятно, что не помогает… А вот когда заходим в консоль серверов 1С предприятия, выбираем в дереве наш кластерсервернашу ИБсоединения… нажимаем на нужное правой кнопкой, пункт «Удалить», и не убирается? или снова появляется? или ошибку выдает?

    Reply ↓
  8. Душелов

    (8) Соединение удаляется и появляется снова.

    Reply ↓
  9. a-novoselov

    (9) Дак надо код тогда смотреть, нахрена она в цикле в базу долбится. Против пользователей, которые на автоподключение 1С-ку ставят блокировка помогает, а вот с заданиями похоже надо с каждым конкретным случаем разбираться. Хотя тут конечно спорный вопрос. Конечно программа должна работать так, как хочет программист, но если код платформы закрыт, то может что-то и в ней глюкать. Но это очень маловероятно, т.к. платформа 8.1 вылизана до мелочей…

    Reply ↓
  10. Душелов

    (10) При чем тут вообще цикл?

    Reply ↓
  11. venger

    (10)

    …т.к. платформа 8.1 вылизана до мелочей…

    😀

    Reply ↓
  12. tango

    (10) «платформа 8.1 вылизана до»

    удивляйся

    http://www.infostart.ru/public/65146/

    Reply ↓
  13. Душелов

    Блаженны верующие… 😀

    Reply ↓
  14. a-novoselov

    Ладно, про вылизанную платформу погорячился чуток)) Хотя в типовых решениях данные всетаки обработками в режиме энтерпрайз к нормальному виду приводятся… Но вот такой жесткий косяк, если код за собой тапки пытается убрать (ЗавершитьРаботуСистемы) а платформа этот код все равно весит… Просто слов нет, как это называется.

    Reply ↓
  15. tango

    типа «допустимые потери памяти» 🙂

    http://www.infostart.ru/public/63392/

    Reply ↓
  16. markers

    (8) У меня даже не повисшие фоновые не рубятся ни через что….. как писал (9) соединение появляется вновь. А вообще как и говорилось, надо отлаживать код… У нас были моменты когда фоновое зацикливалось и вообще блокировало доступ в базу, подставив в нужном месте ЗафиксироватьТранзакцию(); проблема снялась. И т.д. и т.п.

    Reply ↓
  17. PaNick

    Автор прав, глюк есть. Он проявляется при доступе в инет. Например обмен с фтп. Сессия подвисает и не убивается. Его вариант удобен, если есть возможность сделать перерывы в работе. А если база должна работать 24 часа, приходится извращаться другими способами. Я вышел тоже кривым способом: создал клиентскую обработку, которая подстраховывает на случай зависания задания. И при зависании пользователям сыпятся сообщения, что нужно ее запустить в отдельной программе. Благо виснут они не очень часто — раз-два в месяц. Но всеж было бы замечательно без этого )

    Reply ↓
  18. xantimans

    А в этом фоновом задании случаем OLE не используете? Если да, то скорее всего он и виноват, ненадежный зараза 😥

    Reply ↓
  19. bulpi

    (19)

    Нет, дело в том, что в процессе выполнения задания идет обращение в интернет. Зависает ТАМ. Я раскопал в документации объяснение, что снять задание невозможно, т.к. в серверных процедурах останов действует, только когда управление передается на следующий оператор за тем, во время которого произошла попытка останова. А управление не передается никогда, т.к. зависло. Можно переписать с серверных процедур на клиентские, раз я все равно запускаю сеанс. Но тогда кто-то должен вручную снять задание, т.е. кто-то должен следить за этим. А чтобы не следить, вот я и предложил такое.

    Reply ↓
  20. Alav

    Есть такое и на 8.2. причем там хуже. В режиме УФ часто используются фоновые, поэтому там чаще он себя проявляет.

    Например накидал отчет на СКД, который тупо выводить содержимое регистра. На толстом клиенте в обычном режиме — все ОК, за секунду выводит. в режиме УФ виснит зараза (пораждает фоновый процесс, а результата нет). Помогло только рестарт сервера предприятия. Тогда сразу все взлетело.

    P.S. А кто нибудь рестарт рабочих процессов настраивал, для борьбы с этим?

    Reply ↓
  21. WellMaster

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

    Также ищу решение по задаче рестарта работчих процессов.

    Reply ↓
  22. tango

    фоновое задание, убивающее фоновые задания

    Это я так, сказал просто

    Reply ↓
  23. sml

    у меня те же грабли. То задания выполняются, а то вдруг в какой-то момент виснут, причем иногда все сразу.

    Reply ↓
  24. voshkaniridze

    У меня такая проблема, переходить на предложенную схему неохота. А как узнать где именно зависает? Может блокировки, может транспорт? Как узнать?

    Reply ↓
  25. ROM_1C

    Так и не понял, есть ли еще решения для данной проблемы?

    Reply ↓
  26. bulpi

    (26)

    Нет. Уже 8.3, но все так и осталось. Для баз, у которых есть необходимость периодически лазить в инет, и при этом критично, чтобы эти задания ОБЯЗАТЕЛЬНО выполнялись, я использую планировщик заданий Windows с запуском клиентских сеансов, вместо механизма регламентных заданий.

    Reply ↓

Leave a Comment

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