Многие пользователи 1С сталкиваются с необходимостью автоматизации рутинных операций, особенно когда речь идет об обработке заявок. Представим ситуацию: поступает заявка с мобильного приложения, и ей присваивается начальный статус. Если по истечении определенного времени (например, часа или дня) заявка не была обработана вручную, нам необходимо, чтобы система 1С автоматически изменила ее статус, например, на «Оказана». Давайте разберем, как реализовать подобный функционал с использованием встроенных механизмов платформы 1С:Предприятие.
Для решения поставленной задачи нам потребуется использовать механизм **регламентных заданий** в 1С. Регламентные задания — это мощный инструмент, позволяющий выполнять определенный код по заданному расписанию в фоновом режиме, без участия пользователя. Это идеальное решение для задач, требующих периодической проверки данных и выполнения операций.
Весь процесс можно разбить на несколько ключевых шагов, которые мы рассмотрим подробно:
Первым делом нам необходимо создать процедуру или функцию, которая будет выполнять основную логику: находить заявки, подлежащие автоматической обработке, и изменять их статус. Эту логику мы разместим в общем модуле или в модуле внешней обработки.
Мы должны определить условия, по которым заявка считается необработанной и требует автоматического принятия. Как правило, это следующие параметры:
Рассмотрим пример кода, который можно использовать. Предположим, у нас есть документ «Заявка» со статусом, хранящимся в реквизите Статус типа Перечисление.СтатусыЗаявок.
// В Общем модуле, который доступен на сервере, или в модуле внешней обработки
Процедура АвтоматическаяОбработкаЗаявок() Экспорт
// Определяем интервал времени, по истечении которого заявка считается необработанной.
// Например, 1 час (3600 секунд). Вы можете настроить этот параметр.
ИнтервалВСекундах = 3600;
// Вычисляем граничное время. Заявки, созданные до этого времени, будут обработаны.
ГраницаВремени = ТекущаяДатаСеанса() - ИнтервалВСекундах;
// Создаем запрос для поиска подходящих заявок.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заявка.Ссылка,
| Заявка.Номер,
| Заявка.Дата
|ИЗ
| Документ.Заявка КАК Заявка
|ГДЕ
| Заявка.Статус = &СтатусВОбработке
| И Заявка.Дата < &ГраницаВремени"; // Используем реквизит 'Дата' документа как время создания.
// Если у вас есть отдельный реквизит 'ДатаСоздания' или 'ДатаПоследнегоИзменения',
// используйте его для более точного контроля.
// Устанавливаем параметры запроса.
Запрос.УстановитьПараметр("СтатусВОбработке", ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.ВОбработке"));
Запрос.УстановитьПараметр("ГраницаВремени", ГраницаВремени);
// Выполняем запрос и получаем результат.
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Перебираем найденные заявки.
Пока Выборка.Следующий() Цикл
Попытка
// Получаем объект документа для изменения.
ДокументЗаявка = Выборка.Ссылка.ПолучитьОбъект();
// Важно: перепроверяем статус перед изменением.
// Это предотвратит ситуации, когда заявка была обработана вручную
// между выборкой данных и получением объекта.
Если ДокументЗаявка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.ВОбработке") Тогда
// Изменяем статус заявки на "Оказана".
ДокументЗаявка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаявок.Оказана");
ДокументЗаявка.Записать(); // Записываем изменения.
// Опционально: записываем информацию в журнал регистрации для контроля.
ЗаписьЖурналаРегистрации(
"АвтоматическаяОбработкаЗаявок", // Источник события
УровеньВажностиЖурналаРегистрации.Информация, // Уровень важности
, // Метаданные (не указываем для документа)
ДокументЗаявка.Ссылка, // Ссылка на объект события
"Заявка №" + ДокументЗаявка.Номер + " от " + Формат(ДокументЗаявка.Дата, "ДФ=dd.MM.yyyy") +
" автоматически переведена в статус 'Оказана'." // Текст сообщения
);
КонецЕсли;
Исключение
// Обрабатываем возможные ошибки при записи документа.
ЗаписьЖурналаРегистрации(
"АвтоматическаяОбработкаЗаявок",
УровеньВажностиЖурналаРегистрации.Ошибка,
,
Выборка.Ссылка,
"Ошибка при автоматической обработке заявки №" + Выборка.Номер + ": " + ОписаниеОшибки()
);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Размещать этот код лучше всего в новом общем модуле, например, ОбщийМодульДляРегламентныхЗаданий, с обязательной установкой свойств "Сервер" и "Вызов сервера" для его корректной работы.
Теперь, когда у нас есть процедура для обработки заявок, мы должны настроить ее периодический вызов с помощью регламентного задания.
АвтоматическоеПринятиеЗаявок.АвтоматическаяОбработкаЗаявок находится в общем модуле ОбщийМодульДляРегламентныхЗаданий, то указываем: ОбщийМодульДляРегламентныхЗаданий.АвтоматическаяОбработкаЗаявок.Для нашей задачи, скорее всего, потребуется регулярный запуск, например, каждые 10-30 минут, чтобы оперативно реагировать на необработанные заявки.
После сохранения конфигурации регламентное задание будет зарегистрировано в системе.
Если мы не хотим изменять основную конфигурацию или разрабатываем типовое решение, которое должно быть легко интегрировано в различные системы, то реализация логики в внешней обработке является отличным выбором. Это позволяет добавить функциональность без снятия конфигурации с поддержки или внесения прямых изменений.
Для использования внешней обработки в качестве источника регламентных заданий необходимо выполнить следующие действия:
.epf).АвтоматическаяОбработкаЗаявок() Экспорт, которую мы рассмотрели в Шаге 1.СведенияОВнешнейОбработке(). Эта экспортная функция является ключевой для регистрации обработки как источника регламентных заданий. Она возвращает структуру с описанием обработки и списком команд, которые могут быть выполнены.Пример функции СведенияОВнешнейОбработке() для нашей задачи:
// В модуле объекта внешней обработки
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); // Указываем вид объекта
ПараметрыРегистрации.Вставить("Наименование", "Автоматическое принятие заявок"); // Отображаемое наименование
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); // Рекомендуется для внешних объектов
ПараметрыРегистрации.Вставить("Информация", "Обработка для автоматического принятия необработанных заявок.");
// Создаем таблицу команд, которые будут доступны из обработки.
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление"); // Название команды для пользователя
Команды.Колонки.Добавить("Идентификатор"); // Имя метода в модуле объекта обработки
Команды.Колонки.Добавить("Использование"); // Тип использования команды
Команды.Колонки.Добавить("ПоказыватьОповещение"); // Показывать ли оповещение пользователю
Команды.Колонки.Добавить("Модификатор"); // Опциональный модификатор
// Добавляем нашу команду для регламентного задания.
НоваяКоманда = Команды.Добавить();
НоваяКоманда.Представление = "Автоматически принять необработанные заявки";
НоваяКоманда.Идентификатор = "АвтоматическаяОбработкаЗаявок"; // Это должно быть имя вашей процедуры в модуле объекта!
НоваяКоманда.Использование = "РегламентноеЗадание"; // Указываем, что это команда для регламентного задания
НоваяКоманда.ПоказыватьОповещение = Ложь; // Обычно для РЗ не нужно
НоваяКоманда.Модификатор = "ВыполнитьНаСервере"; // Указываем, где должна выполняться процедура
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
// Пример процедуры, которая должна быть в этом же модуле объекта
// Процедура АвтоматическаяОбработкаЗаявок() Экспорт
// // ... Логика из Шага 1 ...
// КонецПроцедуры
После создания внешней обработки с этим кодом необходимо выполнить следующие действия в режиме 1С:Предприятие:
Преимущество данного подхода заключается в возможности гибко управлять функционалом без прямого вмешательства в код конфигурации, что упрощает обновление и поддержку системы.
Механизм запуска регламентных заданий отличается в зависимости от того, как работает ваша информационная база 1С — в файловом или клиент-серверном варианте.
В **клиент-серверном варианте** регламентные задания запускаются автоматически менеджером кластера серверов 1С:Предприятия. Это наиболее надежный и предпочтительный способ работы с регламентными заданиями. Кластер серверов постоянно активен и самостоятельно следит за расписанием, запуская фоновые задания в нужный момент. Пользователю или администратору не требуется никаких дополнительных действий для обеспечения их работы.
В **файловом варианте** работы 1С ситуация несколько иная. Для того чтобы регламентные задания выполнялись автоматически, необходимо наличие хотя бы одного активного клиентского сеанса, который будет играть роль планировщика. Этот сеанс должен быть запущен и не должен быть закрыт.
Есть несколько способов обеспечить работу регламентных заданий в файловом варианте:
/C ЗапуститьРегламентныеЗадания. Этот сеанс будет работать в фоновом режиме и обеспечивать выполнение регламентных заданий.ВыполнитьОбработкуЗаданий(). Однако этот подход менее надежен, так как зависит от активности пользователя в данной форме.Мы **настоятельно рекомендуем** использовать выделенный клиентский сеанс для файлового варианта или, что еще лучше, переходить на клиент-серверный вариант, если есть необходимость в стабильной и бесперебойной работе регламентных заданий.
После настройки регламентного задания или внешней обработки важно уметь контролировать их выполнение и оперативно выявлять возможные проблемы.
Основным инструментом контроля является **Журнал регистрации** 1С. Здесь фиксируются все важные события, связанные с работой системы, включая запуск, выполнение и завершение фоновых и регламентных заданий, а также все возникающие в них ошибки. Если в вашей процедуре обработки заявок вы добавили записи в журнал регистрации (как в примере кода), это значительно упростит отслеживание.
В режиме 1С:Предприятие (обычно в разделе "Администрирование" или "Настройки") есть специальный интерфейс для управления регламентными и фоновыми заданиями. Он может называться "Регламентные операции" или "Регламентные и фоновые задания". Здесь вы можете:
Мы рекомендуем регулярно просматривать журнал регистрации и интерфейс управления регламентными заданиями, особенно на первых этапах внедрения и после любых изменений в логике обработки.
Следуя этим шагам и рекомендациям, вы сможете эффективно настроить автоматическое принятие заявок или любую другую автоматизированную обработку данных в вашей системе 1С, значительно повысив ее эффективность и снизив объем ручного труда.