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

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

Многие пользователи 1С сталкиваются с необходимостью автоматизации рутинных операций, особенно когда речь идет об обработке заявок. Представим ситуацию: поступает заявка с мобильного приложения, и ей присваивается начальный статус. Если по истечении определенного времени (например, часа или дня) заявка не была обработана вручную, нам необходимо, чтобы система 1С автоматически изменила ее статус, например, на «Оказана». Давайте разберем, как реализовать подобный функционал с использованием встроенных механизмов платформы 1С:Предприятие.

Основные принципы автоматической обработки заявок

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

Весь процесс можно разбить на несколько ключевых шагов, которые мы рассмотрим подробно:

  1. Написание кода для выявления и обработки заявок.
  2. Создание и настройка регламентного задания.
  3. Использование внешней обработки для реализации логики (опционально, но часто предпочтительно).
  4. Особенности выполнения в разных вариантах работы 1С (файловый, клиент-серверный).
  5. Методы контроля и отладки.

Шаг 1: Написание кода для выявления и обработки заявок

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

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

Рассмотрим пример кода, который можно использовать. Предположим, у нас есть документ «Заявка» со статусом, хранящимся в реквизите Статус типа Перечисление.СтатусыЗаявок.


// В Общем модуле, который доступен на сервере, или в модуле внешней обработки
Процедура АвтоматическаяОбработкаЗаявок() Экспорт

    // Определяем интервал времени, по истечении которого заявка считается необработанной.
    // Например, 1 час (3600 секунд). Вы можете настроить этот параметр.
    ИнтервалВСекундах = 3600; 

    // Вычисляем граничное время. Заявки, созданные до этого времени, будут обработаны.
    ГраницаВремени = ТекущаяДатаСеанса() - ИнтервалВСекундах;

    // Создаем запрос для поиска подходящих заявок.
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Заявка.Ссылка,
        |    Заявка.Номер,
        |    Заявка.Дата
        |ИЗ
        |    Документ.Заявка КАК Заявка
        |ГДЕ
        |    Заявка.Статус = &СтатусВОбработке
        |    И Заявка.Дата < &ГраницаВремени"; // Используем реквизит 'Дата' документа как время создания.
                                             // Если у вас есть отдельный реквизит 'ДатаСоздания' или 'ДатаПоследнегоИзменения',
                                             // используйте его для более точного контроля.

    // Устанавливаем параметры запроса.
    Запрос.УстановитьПараметр("СтатусВОбработке", ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.ВОбработке"));
    Запрос.УстановитьПараметр("ГраницаВремени", ГраницаВремени);

    // Выполняем запрос и получаем результат.
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    // Перебираем найденные заявки.
    Пока Выборка.Следующий() Цикл
        Попытка
            // Получаем объект документа для изменения.
            ДокументЗаявка = Выборка.Ссылка.ПолучитьОбъект();
            
            // Важно: перепроверяем статус перед изменением.
            // Это предотвратит ситуации, когда заявка была обработана вручную
            // между выборкой данных и получением объекта.
            Если ДокументЗаявка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.ВОбработке") Тогда
                // Изменяем статус заявки на "Оказана".
                ДокументЗаявка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.Оказана");
                ДокументЗаявка.Записать(); // Записываем изменения.

                // Опционально: записываем информацию в журнал регистрации для контроля.
                ЗаписьЖурналаРегистрации(
                    "АвтоматическаяОбработкаЗаявок", // Источник события
                    УровеньВажностиЖурналаРегистрации.Информация, // Уровень важности
                    ,                                             // Метаданные (не указываем для документа)
                    ДокументЗаявка.Ссылка,                        // Ссылка на объект события
                    "Заявка №" + ДокументЗаявка.Номер + " от " + Формат(ДокументЗаявка.Дата, "ДФ=dd.MM.yyyy") +
                    " автоматически переведена в статус 'Оказана'." // Текст сообщения
                );
            КонецЕсли;
        Исключение
            // Обрабатываем возможные ошибки при записи документа.
            ЗаписьЖурналаРегистрации(
                "АвтоматическаяОбработкаЗаявок",
                УровеньВажностиЖурналаРегистрации.Ошибка,
                ,
                Выборка.Ссылка,
                "Ошибка при автоматической обработке заявки №" + Выборка.Номер + ": " + ОписаниеОшибки()
            );
        КонецПопытки;
    КонецЦикла;

КонецПроцедуры

Размещать этот код лучше всего в новом общем модуле, например, ОбщийМодульДляРегламентныхЗаданий, с обязательной установкой свойств "Сервер" и "Вызов сервера" для его корректной работы.

Шаг 2: Создание и настройка регламентного задания в конфигураторе

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

  1. Открываем конфигуратор. Запускаем 1С:Предприятие в режиме конфигуратора.
  2. Находим ветку "Регламентные задания". В дереве конфигурации разворачиваем ветку "Общие" и находим раздел "Регламентные задания".
  3. Создаем новое регламентное задание. Нажимаем правой кнопкой мыши по "Регламентные задания" и выбираем "Добавить".
  4. Заполняем свойства регламентного задания:
    • Имя: Указываем уникальное имя, например, АвтоматическоеПринятиеЗаявок.
    • Синоним: Даем понятное описание, например, "Автоматическое принятие необработанных заявок".
    • Метод: Здесь мы указываем полный путь к нашей экспортной процедуре, которую создали на Шаге 1. Например, если процедура АвтоматическаяОбработкаЗаявок находится в общем модуле ОбщийМодульДляРегламентныхЗаданий, то указываем: ОбщийМодульДляРегламентныхЗаданий.АвтоматическаяОбработкаЗаявок.
    • Использование: Можем установить флажок "Использовать" для включения задания.
  5. Настраиваем расписание. Переходим на вкладку "Расписание". Здесь мы определяем, как часто и когда будет запускаться наше задание. Расписание может быть очень гибким:
    • Повторять каждые: Можно указать, например, "10 минут", "1 час", "1 день".
    • По дням недели/месяца: Можно настроить запуск только в определенные дни.
    • Начало/Окончание: Указать период действия расписания.

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

После сохранения конфигурации регламентное задание будет зарегистрировано в системе.

Шаг 3: Использование внешней обработки (без изменения конфигурации)

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

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

  1. Создаем новую внешнюю обработку. В конфигураторе создаем новый файл внешней обработки (.epf).
  2. Размещаем код в модуле объекта обработки. В модуле объекта этой обработки пишем ту же процедуру АвтоматическаяОбработкаЗаявок() Экспорт, которую мы рассмотрели в Шаге 1.
  3. Добавляем функцию СведенияОВнешнейОбработке(). Эта экспортная функция является ключевой для регистрации обработки как источника регламентных заданий. Она возвращает структуру с описанием обработки и списком команд, которые могут быть выполнены.

Пример функции СведенияОВнешнейОбработке() для нашей задачи:


// В модуле объекта внешней обработки
Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); // Указываем вид объекта
    ПараметрыРегистрации.Вставить("Наименование", "Автоматическое принятие заявок"); // Отображаемое наименование
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); // Рекомендуется для внешних объектов
    ПараметрыРегистрации.Вставить("Информация", "Обработка для автоматического принятия необработанных заявок.");

    // Создаем таблицу команд, которые будут доступны из обработки.
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление"); // Название команды для пользователя
    Команды.Колонки.Добавить("Идентификатор"); // Имя метода в модуле объекта обработки
    Команды.Колонки.Добавить("Использование");  // Тип использования команды
    Команды.Колонки.Добавить("ПоказыватьОповещение"); // Показывать ли оповещение пользователю
    Команды.Колонки.Добавить("Модификатор");     // Опциональный модификатор

    // Добавляем нашу команду для регламентного задания.
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Автоматически принять необработанные заявки";
    НоваяКоманда.Идентификатор = "АвтоматическаяОбработкаЗаявок"; // Это должно быть имя вашей процедуры в модуле объекта!
    НоваяКоманда.Использование = "РегламентноеЗадание"; // Указываем, что это команда для регламентного задания
    НоваяКоманда.ПоказыватьОповещение = Ложь; // Обычно для РЗ не нужно
    НоваяКоманда.Модификатор = "ВыполнитьНаСервере"; // Указываем, где должна выполняться процедура

    ПараметрыРегистрации.Вставить("Команды", Команды);

    Возврат ПараметрыРегистрации;

КонецФункции

// Пример процедуры, которая должна быть в этом же модуле объекта
// Процедура АвтоматическаяОбработкаЗаявок() Экспорт
//     // ... Логика из Шага 1 ...
// КонецПроцедуры

После создания внешней обработки с этим кодом необходимо выполнить следующие действия в режиме 1С:Предприятие:

  1. Зарегистрировать обработку. Перейдите в раздел "Администрирование" (или аналогичный, в зависимости от конфигурации) -> "Печатные формы, отчеты и обработки" -> "Дополнительные отчеты и обработки". Добавьте вашу внешнюю обработку.
  2. Настроить расписание команды. После добавления обработки, в списке команд для нее появится команда "Автоматически принять необработанные заявки". Выделите ее и нажмите "Настроить расписание". Здесь вы сможете задать периодичность выполнения точно так же, как и для регламентных заданий, созданных в конфигураторе.

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

Шаг 4: Особенности выполнения регламентных заданий в различных вариантах работы 1С

Механизм запуска регламентных заданий отличается в зависимости от того, как работает ваша информационная база 1С — в файловом или клиент-серверном варианте.

Клиент-серверный вариант

В **клиент-серверном варианте** регламентные задания запускаются автоматически менеджером кластера серверов 1С:Предприятия. Это наиболее надежный и предпочтительный способ работы с регламентными заданиями. Кластер серверов постоянно активен и самостоятельно следит за расписанием, запуская фоновые задания в нужный момент. Пользователю или администратору не требуется никаких дополнительных действий для обеспечения их работы.

Файловый вариант

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

Есть несколько способов обеспечить работу регламентных заданий в файловом варианте:

  1. Выделенный клиентский сеанс: Можно запустить отдельный сеанс тонкого клиента с параметром командной строки /C ЗапуститьРегламентныеЗадания. Этот сеанс будет работать в фоновом режиме и обеспечивать выполнение регламентных заданий.
  2. Обработка ожидания: В некоторых случаях, для очень специфических задач, можно реализовать обработку ожидания в одной из форм, которая периодически вызывает метод ВыполнитьОбработкуЗаданий(). Однако этот подход менее надежен, так как зависит от активности пользователя в данной форме.

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

Шаг 5: Контроль и отладка

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

Журнал регистрации

Основным инструментом контроля является **Журнал регистрации** 1С. Здесь фиксируются все важные события, связанные с работой системы, включая запуск, выполнение и завершение фоновых и регламентных заданий, а также все возникающие в них ошибки. Если в вашей процедуре обработки заявок вы добавили записи в журнал регистрации (как в примере кода), это значительно упростит отслеживание.

Управление в режиме 1С:Предприятие

В режиме 1С:Предприятие (обычно в разделе "Администрирование" или "Настройки") есть специальный интерфейс для управления регламентными и фоновыми заданиями. Он может называться "Регламентные операции" или "Регламентные и фоновые задания". Здесь вы можете:

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

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

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

← На главную