Автоматическое завершение зависших расчетов месяца

У клиента файловая база в конфигурации из двух компьютеров, на первом стоит веб-сервер Apache, первый работает по толстому клиенту, второй работает через тонкого клиента.

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

Это изображение имеет пустой атрибут alt; его имя файла - image-109.png

Мне понятно, что такое происходит из-за зависания записи о уже закончившемся регламентном задании «Выполнение операций по закрытию месяца»:

Я подчищал при обращениях регистр вручную. В конце-концов написал им инструкцию, чтобы не выставлять им постоянно счета за эту операцию. Но клиент захотел автоматизировать этот процесс, чтобы не тратить свое время.

ОК, решил, что буду автоматически удалять такие зависшие записи.

Как раз ко мне обратились, когда случилось такое зависание в регистре сведений.

Проверяю, фоновых заданий по расчету закрытия месяца нет:

Открываю последнее регламентное задание и вижу, что оно завершено с ошибкой:

Ошибка та же, что и при запуске вручную (уже есть запущенные расчеты):

Поискав в конфигурации обращение к регистру ВыполнениеОперацийЗакрытияМесяца, нашел процедуру, которая вроде бы должна очищать подобную ситуацию:

Я сначала думал, что эта процедура просто не вызывается. Но поставил отладчик и в эту процедуру код зашел. Правда, присмотревшись к комментариям, я понял, почему в файловой такие зависшие задания не очищаются.

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

В итоге целиком заменил код своим через расширение:


&Вместо(«ОбновитьСостояниеАктивныхРасчетов»)
Функция дор_ОбновитьСостояниеАктивныхРасчетов()
   
//Осипов
   
ЭтоФайловаяИБ = ОбщегоНазначения.ИнформационнаяБазаФайловая();
   
ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(,, Ложь);

   
Запрос = Новый Запрос;
   
//Осипов — добавил дату начала 2021-06-25
   
Запрос.Текст =
   
«ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   ВыполнениеРасчета.ИдентификаторРасчета КАК ИдентификаторРасчета,
    |   ВыполнениеРасчета.ДатаНачала КАК ДатаНачала
    |ИЗ
    |   РегистрСведений.ВыполнениеОперацийЗакрытияМесяца КАК ВыполнениеРасчета
    |ГДЕ
    |   ВыполнениеРасчета.РасчетВыполняется»
;
   
Расчеты = Запрос.Выполнить().Выгрузить();
   
//Осипов — добавил Дельту 2021-06-25
   
Дельта = 0;

    Для Каждого
ТекСтр Из Расчеты Цикл

       
СостояниеЗадания = ЗакрытиеМесяцаСервер.ТекущееСостояниеФоновогоЗадания(
           
ЗакрытиеМесяцаСервер.ИмяФоновогоЗадания(ТекСтр.ИдентификаторРасчета));

        Если НЕ
СостояниеЗадания.Активно Тогда

           
// Если задание расчета не найдено по GUID, то его нельзя считать завершенным:
            // — в файловой ИБ, т.к. платформа «не видит» фоновые задания другого сеанса
            // — если текущий пользователь не администратор, т.к. менеджер фоновых заданий не показывает такому пользователю
            // задания других пользователей.
           
Если НЕ (СостояниеЗадания.НеНайдено И (ЭтоФайловаяИБ ИЛИ НЕ ЭтоПолноправныйПользователь))
             ИЛИ
СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда
               
УстановитьПризнакОкончанияРасчета(ТекСтр.ИдентификаторРасчета);
            КонецЕсли;

           
//Осипов — проверяем дату начала 2021-06-25
           
Если ТекущаяДата() — ТекСтр.ДатаНачала > 30 * 60 Тогда //30 минут по 60 секунд
               
УстановитьПризнакОкончанияРасчета(ТекСтр.ИдентификаторРасчета);
               
Дельта = 1;
            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

   
//Осипов — добавил Дельту 2021-06-25
   
Возврат Расчеты.Количество() — Дельта;



   
//Результат = ПродолжитьВызов();
    //Возврат Результат;
КонецФункции

Как видно из кода, я даже подкорректировал с помощью переменной Дельта количество расчетов. Однако переживал я зря, количество расчетов не анализируется:

При первом запуске я опять словил ошибку, что задание уже запущено, правда время старта было текущим. Сначала не понял почему така. Но т.к. я запустил регламентное задание по кнопке «Запустить в режиме отладки», регламентное задание не создалось и 1С посчитала, что его надо создать. Запустил задание нормально, по кнопке «Выполнить» (не в режиме отладки) и все заработало.

Правда другие этапы закрытия месяца не отработали:

Но это уже не связано с блокировкой регламентного задания зависшей записью. Главное, что себестоимость рассчиталась.

Объем факт: 0.8 час. Среда: УТ 11.4.13.46

fixin

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

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

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

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