Как программно создать и настроить регламентное задание в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Давайте вместе разберем, как программно создать и тонко настроить регламентное задание в системе 1С 8.3 на управляемых формах. Эта задача является одной из ключевых при автоматизации различных фоновых процессов, требующих регулярного выполнения без участия пользователя. Для построения высоконагруженных систем автоматизации можно использовать готовый конвейер обработки задач, который позволяет эффективно управлять очередями фоновых операций.

Мы рассмотрим основные шаги, необходимые объекты 1С, примеры кода для разных типов расписаний, а также важные нюансы, которые помогут нам избежать типичных ошибок и обеспечить стабильную работу наших автоматизированных процессов. Если вы работаете над проектом без использования БСП, вам будет полезен пример реализации фоновых заданий с отслеживанием результата и индикацией прогресса.

Понимание Регламентных Заданий в 1С

Прежде чем мы перейдем к коду, давайте выясним, что такое регламентные задания в 1С. Регламентные задания — это механизм платформы, предназначенный для выполнения определенных серверных процедур по заданному расписанию. Они позволяют автоматизировать рутинные операции, такие как обмен данными, очистка логов, перерасчеты и многое другое. Управление регламентными заданиями осуществляется через объекты РегламентноеЗадание и РегламентныеЗаданияМенеджер.

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

Шаг 1: Инициализация и создание объекта Регламентного Задания

Для начала нам необходимо получить менеджер регламентных заданий и создать новый экземпляр объекта РегламентноеЗадание. Это будет нашим 'пустым бланком', который мы будем заполнять информацией о будущем задании.


// Создаем новое регламентное задание
НовоеЗадание = РегламентныеЗадания.Создать();

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

Шаг 2: Заполнение основных свойств регламентного задания

После создания объекта НовоеЗадание мы приступаем к заполнению его ключевых свойств. Эти свойства определяют, как задание будет отображаться, как оно будет называться в системе и какой метод будет вызывать при выполнении.

  1. Наименование: Это свойство задает понятное для пользователя название задания, которое будет отображаться в списке регламентных заданий в пользовательском интерфейсе. Мы рекомендуем использовать информативные названия.
  2. Имя: Это уникальное строковое имя, используемое для программной идентификации задания. Оно должно быть уникальным в рамках одной информационной базы. Если задание с таким именем уже существует, оно не будет создано повторно, или при повторной записи будет обновлено существующее. Мы должны следить за уникальностью этого имени, чтобы избежать конфликтов.
  3. Метод: Это строка, указывающая на экспортируемый метод общего модуля, который будет выполняться при запуске задания. Формат записи: "ИмяОбщегоМодуля.ИмяПроцедурыИлиФункции". Важно отметить, что этот общий модуль не должен иметь флажка "Клиент" и его метод должен быть экспортируемым. Чтобы исключить ошибки в путях к методам, рекомендуется выполнять анализ конфигурации на наличие ошибок в экспортных процедурах.
  4. Использование: Логическое значение, определяющее, активно ли задание. Если установить Истина, задание будет выполняться по расписанию; если Ложь – оно будет неактивным.

Давайте посмотрим на пример заполнения этих свойств:


НовоеЗадание.Наименование = "Мое Ежедневное Задание по Обработке Данных";
НовоеЗадание.Имя = "МоеЕжедневноеЗаданиеУникальное"; // Это имя должно быть уникальным
НовоеЗадание.Метод = "ОбщиеМодули.МойОбщийМодуль.ВыполнитьМоеЗадание"; // Путь к серверной процедуре
НовоеЗадание.Использование = Истина; // Задание активно и будет запускаться

Шаг 3: Настройка расписания регламентного задания

Один из самых важных шагов — это настройка расписания, по которому будет запускаться наше задание. Объект РегламентноеЗадание содержит коллекцию расписаний, которая представлена свойством Расписание. Мы можем добавить одно или несколько расписаний для одного задания.

Настройка ежедневного расписания

Предположим, нам нужно, чтобы задание запускалось каждый день в 03:00. Для этого мы используем ВидЗапускаРегламентногоЗадания.Ежедневно и устанавливаем ВремяНачала.


// Создаем новое расписание для задания
Расписание = НовоеЗадание.Расписание.Добавить();

// Устанавливаем вид запуска - ежедневно
Расписание.ВидЗапуска = ВидЗапускаРегламентногоЗадания.Ежедневно;

// Указываем конкретное время запуска
Расписание.ВремяНачала = '03:00:00'; // Время в формате ЧЧ:ММ:СС

// Устанавливаем период повтора. Для ежедневного запуска это 1 день.
Расписание.ПериодПовтора = 1; // Повторять каждый день

Мы также можем установить ДатаНачала и ДатаОкончания для расписания, если задание должно работать только в определенный период.


// Пример установки даты начала и окончания
Расписание.ДатаНачала = ТекущаяДата(); // Начать с сегодняшнего дня
Расписание.ДатаОкончания = ДобавитьМесяц(ТекущаяДата(), 1); // Работать в течение месяца

Настройка еженедельного расписания

Если требуется запускать задание, например, каждую неделю по понедельникам в 03:00, то вид запуска и настройка дней недели будут иными.


// Создаем новое расписание (или добавляем второе, если нужно несколько)
РасписаниеЕженедельно = НовоеЗадание.Расписание.Добавить();

// Устанавливаем вид запуска - еженедельно
РасписаниеЕженедельно.ВидЗапуска = ВидЗапускаРегламентногоЗадания.Еженедельно;

// Указываем конкретный день недели для запуска
РасписаниеЕженедельно.ДниНедели.Вставить(ДеньНедели.Понедельник); // Запуск только в понедельник

// Указываем время запуска
РасписаниеЕженедельно.ВремяНачала = '03:00:00';

// Устанавливаем период повтора. Для еженедельного запуска это 1 неделя.
РасписаниеЕженедельно.ПериодПовтора = 1; // Каждую неделю

Мы можем вставлять несколько дней недели в коллекцию ДниНедели, если задание должно запускаться в разные дни недели. Например, РасписаниеЕженедельно.ДниНедели.Вставить(ДеньНедели.Среда); добавит среду к дням запуска.

Кроме ежедневного и еженедельного расписания, существуют также:

Каждый вид запуска имеет свои специфические свойства для настройки. Мы рекомендуем изучить их в синтакс-помощнике для более детального понимания.

Шаг 4: Запись регламентного задания и применение изменений

После того как все свойства и расписания заполнены, нам необходимо сохранить объект регламентного задания в информационной базе. Для этого используется метод Записать().


// Записываем регламентное задание в информационную базу
НовоеЗадание.Записать();

Однако, просто запись задания в базу данных не гарантирует его немедленного запуска или применения изменений, особенно на серверной стороне. Чтобы убедиться, что система 1С 'подхватила' новое или измененное задание, мы должны вызвать метод РегламентныеЗадания.ОбновитьРегламентныеЗадания(). Этот метод сигнализирует серверу 1С о необходимости перечитать актуальный список регламентных заданий.


// Обновляем список регламентных заданий на сервере, чтобы изменения вступили в силу
РегламентныеЗадания.ОбновитьРегламентныеЗадания();

Без вызова ОбновитьРегламентныеЗадания() новое задание может начать работать только после перезапуска рабочего сервера 1С или с некоторой задержкой.

Шаг 5: Обеспечение прав доступа (Привилегированный режим)

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

Существует два основных способа обеспечить привилегированный режим для регламентного задания:

  1. Установка свойства ПривилегированныйРежим для самого объекта РегламентноеЗадание:

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

    
    НовоеЗадание.ПривилегированныйРежим = Истина;
    // ... затем НовоеЗадание.Записать();
    
  2. Использование директивы #Регион Привилегированный или метода УстановитьПривилегированныйРежим() в коде общего модуля:

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

    
    // В общем модуле "МойОбщийМодуль"
    Процедура ВыполнитьМоеЗадание() Экспорт
        // Выполняем действия, не требующие привилегий
                
        #Область Привилегированный
        // Код в этом регионе будет выполняться в привилегированном режиме
        #КонецОбласти
                
        // Продолжаем выполнение без привилегий
    КонецПроцедуры
    

Общий пример программного создания регламентного задания

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


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

Важные рекомендации и проверки

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

  1. Уникальность имени: Всегда убеждайтесь, что Имя регламентного задания уникально. Используйте проверку РегламентныеЗадания.НайтиПоИмени().
  2. Серверный общий модуль: Метод должен быть экспортируемым в серверном общем модуле.
  3. Путь к методу: Убедитесь в точности строки пути к процедуре.
  4. Тестирование: Обязательно проверьте работу задания сразу после создания.
  5. Логирование: Используйте запись в журнал регистрации для мониторинга.
  6. Ресурсы сервера: Оптимизируйте код, чтобы не перегружать рабочий сервер.
  7. Контроль ошибок: Обязательно используйте блоки Попытка...Исключение.

Таким образом, мы видим, что программное создание и настройка регламентных заданий в 1С 8.3 — это мощный инструмент для автоматизации, который требует внимательности к деталям. Следуя этим шагам и рекомендациям, мы сможем эффективно внедрять фоновые процессы в наших информационных системах.

← На главную