К вопросу о зависающих фоновых заданиях в 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 не будет опубликован. Обязательные поля помечены *