Давайте вместе разберем, как программно создать и тонко настроить регламентное задание в системе 1С 8.3 на управляемых формах. Эта задача является одной из ключевых при автоматизации различных фоновых процессов, требующих регулярного выполнения без участия пользователя. Для построения высоконагруженных систем автоматизации можно использовать готовый конвейер обработки задач, который позволяет эффективно управлять очередями фоновых операций.
Мы рассмотрим основные шаги, необходимые объекты 1С, примеры кода для разных типов расписаний, а также важные нюансы, которые помогут нам избежать типичных ошибок и обеспечить стабильную работу наших автоматизированных процессов. Если вы работаете над проектом без использования БСП, вам будет полезен пример реализации фоновых заданий с отслеживанием результата и индикацией прогресса.
Прежде чем мы перейдем к коду, давайте выясним, что такое регламентные задания в 1С. Регламентные задания — это механизм платформы, предназначенный для выполнения определенных серверных процедур по заданному расписанию. Они позволяют автоматизировать рутинные операции, такие как обмен данными, очистка логов, перерасчеты и многое другое. Управление регламентными заданиями осуществляется через объекты РегламентноеЗадание и РегламентныеЗаданияМенеджер.
Наш подход будет заключаться в использовании этих объектов для программного создания, настройки и сохранения нового регламентного задания.
Для начала нам необходимо получить менеджер регламентных заданий и создать новый экземпляр объекта РегламентноеЗадание. Это будет нашим 'пустым бланком', который мы будем заполнять информацией о будущем задании.
// Создаем новое регламентное задание
НовоеЗадание = РегламентныеЗадания.Создать();
Здесь РегламентныеЗадания — это глобальный менеджер регламентных заданий, доступный на серверной стороне, который предоставляет методы для работы с заданиями, в том числе и метод Создать().
После создания объекта НовоеЗадание мы приступаем к заполнению его ключевых свойств. Эти свойства определяют, как задание будет отображаться, как оно будет называться в системе и какой метод будет вызывать при выполнении.
Наименование: Это свойство задает понятное для пользователя название задания, которое будет отображаться в списке регламентных заданий в пользовательском интерфейсе. Мы рекомендуем использовать информативные названия.Имя: Это уникальное строковое имя, используемое для программной идентификации задания. Оно должно быть уникальным в рамках одной информационной базы. Если задание с таким именем уже существует, оно не будет создано повторно, или при повторной записи будет обновлено существующее. Мы должны следить за уникальностью этого имени, чтобы избежать конфликтов.Метод: Это строка, указывающая на экспортируемый метод общего модуля, который будет выполняться при запуске задания. Формат записи: "ИмяОбщегоМодуля.ИмяПроцедурыИлиФункции". Важно отметить, что этот общий модуль не должен иметь флажка "Клиент" и его метод должен быть экспортируемым. Чтобы исключить ошибки в путях к методам, рекомендуется выполнять анализ конфигурации на наличие ошибок в экспортных процедурах.Использование: Логическое значение, определяющее, активно ли задание. Если установить Истина, задание будет выполняться по расписанию; если Ложь – оно будет неактивным.Давайте посмотрим на пример заполнения этих свойств:
НовоеЗадание.Наименование = "Мое Ежедневное Задание по Обработке Данных";
НовоеЗадание.Имя = "МоеЕжедневноеЗаданиеУникальное"; // Это имя должно быть уникальным
НовоеЗадание.Метод = "ОбщиеМодули.МойОбщийМодуль.ВыполнитьМоеЗадание"; // Путь к серверной процедуре
НовоеЗадание.Использование = Истина; // Задание активно и будет запускаться
Один из самых важных шагов — это настройка расписания, по которому будет запускаться наше задание. Объект РегламентноеЗадание содержит коллекцию расписаний, которая представлена свойством Расписание. Мы можем добавить одно или несколько расписаний для одного задания.
Предположим, нам нужно, чтобы задание запускалось каждый день в 03:00. Для этого мы используем ВидЗапускаРегламентногоЗадания.Ежедневно и устанавливаем ВремяНачала.
// Создаем новое расписание для задания
Расписание = НовоеЗадание.Расписание.Добавить();
// Устанавливаем вид запуска - ежедневно
Расписание.ВидЗапуска = ВидЗапускаРегламентногоЗадания.Ежедневно;
// Указываем конкретное время запуска
Расписание.ВремяНачала = '03:00:00'; // Время в формате ЧЧ:ММ:СС
// Устанавливаем период повтора. Для ежедневного запуска это 1 день.
Расписание.ПериодПовтора = 1; // Повторять каждый день
Мы также можем установить ДатаНачала и ДатаОкончания для расписания, если задание должно работать только в определенный период.
// Пример установки даты начала и окончания
Расписание.ДатаНачала = ТекущаяДата(); // Начать с сегодняшнего дня
Расписание.ДатаОкончания = ДобавитьМесяц(ТекущаяДата(), 1); // Работать в течение месяца
Если требуется запускать задание, например, каждую неделю по понедельникам в 03:00, то вид запуска и настройка дней недели будут иными.
// Создаем новое расписание (или добавляем второе, если нужно несколько)
РасписаниеЕженедельно = НовоеЗадание.Расписание.Добавить();
// Устанавливаем вид запуска - еженедельно
РасписаниеЕженедельно.ВидЗапуска = ВидЗапускаРегламентногоЗадания.Еженедельно;
// Указываем конкретный день недели для запуска
РасписаниеЕженедельно.ДниНедели.Вставить(ДеньНедели.Понедельник); // Запуск только в понедельник
// Указываем время запуска
РасписаниеЕженедельно.ВремяНачала = '03:00:00';
// Устанавливаем период повтора. Для еженедельного запуска это 1 неделя.
РасписаниеЕженедельно.ПериодПовтора = 1; // Каждую неделю
Мы можем вставлять несколько дней недели в коллекцию ДниНедели, если задание должно запускаться в разные дни недели. Например, РасписаниеЕженедельно.ДниНедели.Вставить(ДеньНедели.Среда); добавит среду к дням запуска.
Кроме ежедневного и еженедельного расписания, существуют также:
ВидЗапускаРегламентногоЗадания.КаждыеNСекундВидЗапускаРегламентногоЗадания.КаждыеNМинутВидЗапускаРегламентногоЗадания.КаждыеNЧасовВидЗапускаРегламентногоЗадания.Произвольное (позволяет задать более сложные настройки). Для платформы версии 8.3.27 и выше при настройке сложных интервалов перезапуска процессов полезно использовать конструктор Cron расписания.Каждый вид запуска имеет свои специфические свойства для настройки. Мы рекомендуем изучить их в синтакс-помощнике для более детального понимания.
После того как все свойства и расписания заполнены, нам необходимо сохранить объект регламентного задания в информационной базе. Для этого используется метод Записать().
// Записываем регламентное задание в информационную базу
НовоеЗадание.Записать();
Однако, просто запись задания в базу данных не гарантирует его немедленного запуска или применения изменений, особенно на серверной стороне. Чтобы убедиться, что система 1С 'подхватила' новое или измененное задание, мы должны вызвать метод РегламентныеЗадания.ОбновитьРегламентныеЗадания(). Этот метод сигнализирует серверу 1С о необходимости перечитать актуальный список регламентных заданий.
// Обновляем список регламентных заданий на сервере, чтобы изменения вступили в силу
РегламентныеЗадания.ОбновитьРегламентныеЗадания();
Без вызова ОбновитьРегламентныеЗадания() новое задание может начать работать только после перезапуска рабочего сервера 1С или с некоторой задержкой.
Очень важный аспект, о котором часто забывают — это права доступа. Если метод вашего регламентного задания выполняет операции, которые требуют полных прав, вам потребуется использовать привилегированный режим.
Существует два основных способа обеспечить привилегированный режим для регламентного задания:
ПривилегированныйРежим для самого объекта РегламентноеЗадание:
Мы можем установить это свойство перед записью задания. Это гарантирует, что весь код, выполняющийся в рамках данного регламентного задания, будет иметь полные права.
НовоеЗадание.ПривилегированныйРежим = Истина;
// ... затем НовоеЗадание.Записать();
#Регион Привилегированный или метода УстановитьПривилегированныйРежим() в коде общего модуля:
Если нам нужно, чтобы только часть кода выполнялась с полными правами, мы можем использовать стандартные инструменты платформы. Также для мониторинга действий под привилегиями полезно исполнять метод в фоновом задании с выводом лога сообщений, чтобы видеть результат работы в реальном времени.
// В общем модуле "МойОбщийМодуль"
Процедура ВыполнитьМоеЗадание() Экспорт
// Выполняем действия, не требующие привилегий
#Область Привилегированный
// Код в этом регионе будет выполняться в привилегированном режиме
#КонецОбласти
// Продолжаем выполнение без привилегий
КонецПроцедуры
Давайте соберем все рассмотренные шаги в единый фрагмент кода, чтобы у нас был полноценный пример для создания ежедневного регламентного задания с учетом всех нюансов.
// Процедура для создания регламентного задания
Процедура СоздатьЕжедневноеРегламентноеЗадание() Экспорт
Перем НовоеЗадание;
// Проверяем, существует ли уже задание с таким уникальным именем
Если РегламентныеЗадания.НайтиПоИмени("МоеЕжедневноеЗаданиеУникальное") <> Неопределено Тогда
Сообщить("Регламентное задание 'МоеЕжедневноеЗаданиеУникальное' уже существует. Обновляем его.");
НовоеЗадание = РегламентныеЗадания.НайтиПоИмени("МоеЕжедневноеЗаданиеУникальное");
Иначе
Сообщить("Создаем новое регламентное задание 'МоеЕжедневноеЗаданиеУникальное'.");
НовоеЗадание = РегламентныеЗадания.Создать();
КонецЕсли;
Попытка
// 1. Заполняем основные свойства
НовоеЗадание.Наименование = "Мое Ежедневное Задание по Обработке Данных";
НовоеЗадание.Имя = "МоеЕжедневноеЗаданиеУникальное";
НовоеЗадание.Метод = "ОбщиеМодули.МойОбщийМодуль.ВыполнитьМоеЗадание";
НовоеЗадание.Использование = Истина;
// Устанавливаем привилегированный режим, если задание требует полных прав
НовоеЗадание.ПривилегированныйРежим = Истина;
// 2. Очищаем старые расписания
НовоеЗадание.Расписание.Очистить();
// 3. Создаем и настраиваем новое расписание (ежедневное в 03:00)
Расписание = НовоеЗадание.Расписание.Добавить();
Расписание.ВидЗапуска = ВидЗапускаРегламентногоЗадания.Ежедневно;
Расписание.ВремяНачала = '03:00:00';
Расписание.ПериодПовтора = 1;
// 4. Записываем регламентное задание
НовоеЗадание.Записать();
// 5. Обновляем список регламентных заданий на сервере
РегламентныеЗадания.ОбновитьРегламентныеЗадания();
Сообщить("Регламентное задание успешно создано/обновлено и активировано!");
Исключение
Сообщить("Ошибка при создании/обновлении регламентного задания: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для успешной и стабильной работы регламентных заданий, созданных программно, мы должны учитывать несколько важных моментов:
Имя регламентного задания уникально. Используйте проверку РегламентныеЗадания.НайтиПоИмени().Попытка...Исключение.Таким образом, мы видим, что программное создание и настройка регламентных заданий в 1С 8.3 — это мощный инструмент для автоматизации, который требует внимательности к деталям. Следуя этим шагам и рекомендациям, мы сможем эффективно внедрять фоновые процессы в наших информационных системах.