В результате описанной в предыдущем посте обработке мы научились безболезненно для основных производственных процессов восстанавливать последовательность. Теперь необходимо автоматизировать запуск данной обработки, который в реальном времени позволяет контролировать процесс восстановления последовательности.
Начнем с автоматизации запуска. Основные требования к данной утилите:
- Запускаться самостоятельно по определенному расписанию.
- Проверять статус восстановления последовательности, и, если восстановления последовательности не происходит, то инициировать повторный запуск обработки 1С.
- Уметь логировать свои действия.
Принцип работы и основные элементы предлагаемой обработки проще изобразить с помощью схемы:
Теперь я пройду по каждому шагу схемы и распишу логику его работы. Самая простая часть – настроить планировщик Windows, чтобы он каждые 20 минут запускал определенное приложение. В нашем случае, это простейшее приложение (командная строка), созданная на C#, без пользовательского интерфейса. Назовем его Restore_Robot.
В первую очередь Restore_Robot получает дату последней операции по восстановлению последовательности. Так как все наши действия мы логируем, то это делается простейшим запросом к базе данных:
ALTER PROCEDURE dbo.Wrk_GetLastRobotAction
AS
set nocount on
select top 1 errM.ErrorDate, errM.ErrorXML.value('(/Parameters/DocParameters/@SequenceDate)[1]', 'datetime') SequenceDate
from dbo.Log_Errors errM with(nolock)
where not errM.ErrorXML.value('(/Parameters/DocParameters/@SequenceDate)[1]', 'datetime') is null
order by errM.ErrorDate desc
В приведенной выше процедуре, мы получаем дату и время, когда мы последний раз выполняли процедуру по восстановлению последовательности и дату, до которой последовательность восстановлена (понадобится для дальнейшего анализа).
Далее мы выполняем следующий анализ:
if (dCurrentDate.Subtract(dLastOperatoin).TotalMinutes > Convert.ToDouble(ConfigurationManager.AppSettings["EveryDayPauseInMinutes"])
&& dSequence.Day != DateTime.DaysInMonth(dSequence.Year, dSequence.Month)) // для всех дней, кроме первого и последнего
{
NeedRestart = true;
}
else if (dCurrentDate.Subtract(dLastOperatoin).TotalMinutes > Convert.ToDouble(ConfigurationManager.AppSettings["FirstAndLastDayPauseInMinutes"]) &&
(dSequence.Day == DateTime.DaysInMonth(dSequence.Year, dSequence.Month) || dSequence.Day == 1)) // для первого и последнего дн
{
NeedRestart = true;
}
Так как в последний день месяца есть очень тяжелые документы, которые могут проводится по 30-40 минут каждый, то у нас есть два паузы – для первого и последнего дня месяца последовательности и всех остальных дней. В созданной обработке я выставил следующие паузы:
- Для первого и последнего дней месяца последовательности Restart_Robot ждет 6 часов с момента последней операции.
- Для всех остальных дней последовательности Restart_Robot ждет 40 минут.
Если все нормально, то Restart_Robot завершает работу. Если активности нет и мы в приведенном выше коде выставляем флаг NeedRestart, то приложение создает bat-файл, который запускает 1С с запуском необходимой обработки. Почему именно bat-файл и можно ли делать запуск другим способом? Конечно можно, а bat-файл был выбран, так как я достаточно хорошо знаю командную строку и с его помощью я мог выполнить те операции, которые требовались.
Сам командный файл достаточно простой, ниже я привожу его текст с комментариями:
// На всякий случай убиваем существующий процесс, так как 1С могла просто зависнуть
C:\Windows\System32\taskkill.exe -F -IM 1cv8.exe –T
// Задаем директорию, в котором находятся все необходимые для запуска файлы
set DIR=D:\Robot_UPP
// Задаем путь для базы 1С
set DB=SERVER/1C_Base
// Задаем имя пользователя и пароль, под которым будет выполняться восстановление последовательности
set USER=USER_ROBOT
set PASS=PASSWORD_ROBOT
// Путь до обработки 1С, которая выполняет восстановление последовательности
set HANDLER=%DIR%\restore_robot.epf
// Путь до файла, в который будут писать бизнес ошибки восстановления последовательности
set INF=%DIR%\Report.txt
// Запускаем 1С в режиме предприятия под указанным выше пользователем, с записью лога работы в определенный файл, после старта 1С внутри сразу запускается обработка по восстановлению последовательности.
set EXEC_STR=start «« «FULL_PATH_TO_1C» enterprise /S «%DB%» /DisableStartupMessages /N «%USER%» /P «%PASS%» /out «%INF%» -NoTruncate /Execute «%HANDLER%»
%EXEC_STR%
Несколько особенностей работы обработки, о которых надо помнить:
- Bat-файл создается динамически и после отработки сразу удаляется. Нет необходимости светить пароли в текстовом файле.
- Путь до приложения 1с может меняться в зависимости от релиза платформы. Поэтому данный параметр должен быть динамическим и определяться в момент работы приложения.
string[] files = Directory.GetFiles(@"C:\Program Files (x86)\1cv82\", "1cv8.exe", SearchOption.AllDirectories);
string st1CApplicationPath = files[0];
- Пользователь, под которым стартует 1С и идет восстановление последовательности, должен иметь полные права.
- Для работы обработки, желательно выделить отдельную машину, а лучше всего ее запускать на сервере.
- Естественно каждый запуск приложения Restart_Robot логируется в базу статистики.
Вот собственно и все. В следующем посте будет описан отчет, который позволяет в реальном времени наблюдать за работой процесса по восстановлению последовательности и анализировать работу за прошлые периоды.