Настройка класса обслуживания

Класс обслуживания содержит периоды обслуживания в течение рабочей недели и исключения из общего графика обслуживания.

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

Период обслуживания – временной промежуток, в рамках которого происходит отсчет регламентного времени.

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

Исключение – календарный день, в течение которого обслуживание производится не в рамках стандартного графика (используется для учета выходных и праздничных дней).

Период исключения – временной промежуток обслуживания в течение исключения, когда происходит отсчет регламентного времени.

Добавление класса обслуживания

Чтобы добавить класс обслуживания, выполните следующие действия:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. В справочнике (блок "Элементы справочника") нажмите кнопку Добавить элемент.
  3. На форме "Добавление элемента" заполните поля:
    • Название — введите название элемента справочника, которое будет использоваться в системе в качестве значения атрибута объекта типа "Элемент справочника" и "Набор элементов справочника".
    • Код — введите код для идентификации элемента справочника. Код должен быть уникален в пределах справочника, с учетом регистра.
    • Родитель — выберите папку, в которую вложен данный элемент (если в справочнике созданы папки).
    • Описание — введите описание класса обслуживания.
  4. Нажмите кнопку Сохранить. Форма добавления закроется, новый класс обслуживания отобразится в справочнике.

Для класса обслуживания выполняются следующие настройки:

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

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

Если для класса обслуживания не определен ни один период обслуживания, класс обслуживания обрабатывается как 24х7 (24 часа в течение 7 дней).

Добавить период обслуживания

Чтобы добавить период обслуживания, выполните следующие действия:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. Откройте карточку класса обслуживания.

  3. В блоке "График обслуживания" нажмите иконку в строке дня недели.

  4. На форме "Добавление периода обслуживания" выберите временные рамки периода обслуживания.

    Для выбора значения можно воспользоваться поиском в поле выбора.

  5. Нажмите кнопку Сохранить. Форма добавления закроется, карточка класса обслуживания обновится.

Изменить периоды обслуживания в рамках одного дня недели

Чтобы изменить период обслуживания:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. Откройте карточку класса обслуживания.
  3. В блоке "График обслуживания" нажмите иконку в строке дня недели.

  4. На форме редактирования периодов обслуживания:

    • Чтобы изменить временные границы периода обслуживания, выберите новые значения в списках выбора. Для выбора значения можно воспользоваться поиском в поле выбора.
    • Чтобы удалить период обслуживания, нажмите на иконке в строке периода обслуживания.
  5. Нажмите кнопку Сохранить.

Форма редактирования закроется, внесенные изменения будут применены, карточка класса обслуживания обновится.

Настройка исключений в графике обслуживания

Исключения в графике обслуживания могут быть настроены в двух вариантах:

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

Список исключений в графике обслуживания отображается в карточке настройки класса обслуживания (блок "Исключения в графике обслуживания"). Для списка применяется сортировка по убыванию дат.

Добавить дату исключения из общего графика обслуживания

Чтобы добавить дату исключения из общего графика обслуживания, выполните следующие действия:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. Откройте карточку класса обслуживания.

  3. В блоке "Исключения в графике обслуживания" нажмите кнопку Добавить исключение.
  4. На форме добавления исключения выберите дату исключения.
  5. Нажмите кнопку Сохранить. Форма добавления закроется, карточка класса обслуживания обновится.

Добавить период исключения

В рамках одного календарного дня можно добавить несколько периодов исключения:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. Откройте карточку класса обслуживания.
  3. В блоке "Исключения в графике обслуживания" нажмите на иконку в строке дня исключения.
  4. На форме добавления периода исключения выберите рамки периода обслуживания.

    Для выбора значения можно воспользоваться поиском в поле выбора.

  5. Нажмите кнопку Сохранить. Форма добавления закроется, карточка класса обслуживания обновится.

Изменить период исключения в рамках одной даты

Чтобы изменить период исключения в рамках одной даты, выполните следующие действия:

  1. В меню навигации выберите "Справочники" → "Системные справочники" → "Классы обслуживания".
  2. Откройте карточку класса обслуживания.
  3. В блоке "Исключения в графике обслуживания" нажмите иконку в строке дня исключения.
  4. На форме редактирования периодов исключения:

    • Чтобы изменить временные границы периода исключения, выберите новые значения в списках. Для выбора значения можно воспользоваться поиском в поле выбора.
    • Чтобы удалить период исключения, нажмите иконку в строке периода исключения.
  5. Нажмите кнопку Сохранить. Форма редактирования закроется, внесенные изменения будут применены, карточка класса обслуживания обновится.

Удалить дату исключения

Чтобы удалить исключение в графике обслуживания, в карточке класса обслуживания в блоке "Исключения в графике обслуживания" нажмите иконку в строке с датой исключения.

Примеры добавления исключений в класс обслуживания

Пример 1

Скрипт изменяет класс обслуживания у всех открытых запросов, независимо от того, какой класс обслуживания был настроен ранее (например, 8х5 или 24х7).
Если необходимо обновить класс обслуживания с учетом текущего класса, используйте скрипт из Примера 2.

Условие: Класс "Запрос", системный атрибут "Класс обслуживания" (serviceTime).

Исключения в класс обслуживания добавляются через файл (Загрузка и выгрузка исключений для классов обслуживания) или вручную в элементе справочника "Классы обслуживания". В этом случае автоматически создается черновик класса обслуживания, который затем утверждает технолог.

После добавления исключений в класс обслуживания запускается скрипт, который изменяет класс обслуживания на указанный по UUID у всех открытых запросов с любым классом обслуживания.

При большом количестве запросов обновление выполняется постепенно. Чтобы процесс проходил стабильно и без перегрузки системы, следует выполнять актуализацию пачками по N объектов (оптимально — по 50). Для этого создайте временную задачу планировщика, которая с заданной периодичностью будет обрабатывать еще не обновленные объекты.

Copy
def newClassUuid = 'servicetime$123'

// получаем объекты так, чтобы не получать уже актуализированные и те, актуализация которых не требуется
def scs = api.db.query("SELECT 'serviceCall\$' || id FROM serviceCall WHERE state != 'closed' AND serviceTime.id != :classId")
  .set('classId', newClassUuid.split('\\$')[1])
  .setMaxResults(50)
  .list()

def newClass = utils.get(newClassUuid) 
for (def sc : scs) {
  try {
    utils.editWithoutEventActions(sc, ['serviceTime': newClass], true) 
  } catch (Exception e) {
    logger.error("[Изменение класса обслуживания] Не удалось выполнить для ${sc}!", e)
  }
}

logger.info("[Изменение класса обслуживания] Успешно завершено для ${scs.size()} запросов.")
return scs.size()

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

Пример 2

Условие: Класс "Запрос", системный атрибут "Класс обслуживания" (serviceTime).

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

Скрипт выбирает запросы с текущим классом обслуживания и обновляет их на новую версию соответствующего класса обслуживания. Обработка выполняется пачками по N объектов, что позволяет избежать перегрузки системы и ошибок при массовых изменениях.

Copy
/*& 3600 */

// ПАРАМЕТРЫ ------------------------------------------------------------
def METACLASS = 'serviceCall'
def SERVICE_TIME = 'serviceTime' // Атрибут типа Элемент справочника, на класс обслуживания
def EDIT_NUM = 10; // Число объектов редактируемых в одной транзакции
def LIMIT = 1000; // Число объектов редактируемых за один запуск скрипта

// ФУНКЦИИ --------------------------------------------------------------
def editObjects = { objectUuids ->
    def count = 0
    for (uuid in objectUuids)
    {
        try
        {
            def object = utils.get(uuid);
            def oldServiceTime = object[SERVICE_TIME]
            def newServiceTime = utils.get('servicetime', ['title': oldServiceTime.title, 'status': 'active'])
            if (newServiceTime)
            {
               utils.editWithoutEventActions(object, [(SERVICE_TIME): newServiceTime]);
               logger.info("[Обновление класса обслуживания] Объект ${uuid} отредактирован: ${oldServiceTime?.UUID} -> ${newServiceTime?.UUID}");
               count += 1;
            }
            else
            {
               logger.info("[Обновление класса обслуживания] Объект ${uuid} не отредактирован: для ${oldServiceTime?.UUID} нет актуальной версии");
            }
        }
        catch (Exception e)
        {
            logger.warn("[Обновление класса обслуживания] Не удалось отредактировать объект ${uuid}: ${e.toString()}", e);
        }
    }
    return count
}

// ОСНОВНОЙ БЛОК --------------------------------------------------------
try
{
    // получаем все объекты в статусах отличных от Закрыт (closed), у которых класс обслуживания является устаревшим (old)
    def uuids = api.db.query("SELECT '${METACLASS}\$'||cast(o.id as string) FROM ${METACLASS} o WHERE o.state <> 'closed' AND o.${SERVICE_TIME} IS NOT NULL AND o.${SERVICE_TIME}.status = 'old'")
        .setMaxResult(LIMIT)
        .list();
    logger.info("[Обновление класса обслуживания] Всего найдено объектов для обновления класса обслуживания (ограничение - ${LIMIT}): ${uuids.size()}")
    
    // Разделяем объекты на пачки по EDIT_NUM
    def uuidBatches = uuids.collate(EDIT_NUM);
    def batchCount = uuidBatches.size()
    logger.info("[Обновление класса обслуживания] Количество пачек объектов: ${batchCount}")
    
    // Выполняем обработку объектов пачками
    for (int i = 0; i < batchCount; i++)
    {
        try
        {
            def count = api.tx.call { editObjects(uuidBatches[i]) };

            logger.info("[Обновление класса обслуживания] [${i + 1}/${batchCount}] Изменено ${count} объектов из ${Math.min(uuidBatches[i].size(), EDIT_NUM)}");
        }
        catch (Exception e) {
            logger.info("[Обновление класса обслуживания] [${i + 1}/${batchCount}] Получена ошибка: ${e.toString()}", e);
        }
    }
    logger.info("[Обновление класса обслуживания] Редактирование объектов завершено");
}
catch (Exception e)
{
    logger.warn("[Обновление класса обслуживания] Получена ошибка: ${e.toString()}", e);
}

Пример 3

Для запроса установлен класс обслуживания, как значение пользовательского атрибута типа "Элемент справочника".

В этом случае при добавлении исключения черновик класса обслуживания не создается.

Рекомендуется выполнить следующие действия:

  1. Создать копию класса обслуживания, в который нужно внести исключение.
  2. Добавить исключение.
  3. Применить скрипт, меняющий класс обслуживания в незакрытых запросах на новый.

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