При работе с платформой 1С:Предприятие часто возникает необходимость в выполнении определенных операций в фоновом режиме по расписанию. Такие операции реализуются с помощью механизма регламентных заданий. Однако до недавнего времени существовали ограничения на добавление регламентных заданий непосредственно в расширения. Рассмотрим подробнее, как решить эту задачу в различных версиях платформы.
Изначально разработчики 1С столкнулись с проблемой, что расширения, будучи надстройкой над основной конфигурацией, не поддерживали прямую интеграцию регламентных заданий. Это создавало определенные трудности при разработке функционала, требующего фонового выполнения, в рамках расширений без изменения основной конфигурации. С течением времени платформа развивалась, и эта возможность была добавлена, но для старых версий по-прежнему актуален обходной путь.
Начиная с версии платформы 1С:Предприятие 8.3.23, разработчики реализовали возможность создавать объекты конфигурации "Регламентное задание" непосредственно в расширениях. Это значительно упрощает разработку и поддержку функционала, который требует фонового выполнения, поскольку весь необходимый код и настройки могут храниться внутри самого расширения.
Создание регламентного задания в расширении:
Для добавления регламентного задания вам необходимо открыть расширение в конфигураторе, найти в дереве объектов конфигурации раздел "Общие" и добавить новый объект типа Регламентное задание. Здесь вы указываете основные свойства задания, такие как имя и синоним.
Определение метода для выполнения:
В свойствах созданного регламентного задания необходимо указать имя метода, который будет выполняться по расписанию. Этот метод должен быть экспортной процедурой (или функцией) и располагаться в общем модуле расширения. Очень важно, чтобы у этого общего модуля были установлены флаги "Сервер" и "Вызов сервера", иначе платформа не сможет его найти и выполнить.
// Пример общего модуля расширения (например, "МодульРегламентныхЗаданийРасширения")
Процедура ВыполнитьРегламентнуюОперациюРасширения() Экспорт
// Здесь размещается код, который должен выполняться регламентно
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник_МойОбъектРасширения.Наименование КАК Наименование
|ИЗ
| Справочник.МойОбъектРасширения КАК Справочник_МойОбъектРасширения";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ЗаписьЖурналаРегистрации(
"РегламентноеЗаданиеРасширения",
УровеньЖурналаРегистрации.Информация,
,
,
"Обработан элемент: " + Результат.Наименование
);
КонецЦикла;
КонецПроцедуры
В свойствах вашего регламентного задания в поле "Имя метода" вы укажете что-то вроде МодульРегламентныхЗаданийРасширения.ВыполнитьРегламентнуюОперациюРасширения.
Установка расширения:
При установке расширения, содержащего регламентные задания, может потребоваться монопольный режим работы с информационной базой. Это означает, что все пользователи должны быть отключены. Данное требование связано с тем, что добавление регламентных заданий в расширение может вносить изменения в системные таблицы базы данных, и для этого требуется эксклюзивный доступ.
Настройка и выполнение:
После успешной установки расширения, регламентное задание станет доступным в стандартном списке регламентных и фоновых заданий (обычно находится в разделе "Администрирование" - "Обслуживание" - "Регламентные и фоновые задания"). Вы сможете его настроить, включить или выключить, а также задать расписание выполнения через стандартные механизмы администрирования 1С — для этого отлично подойдёт инструмент управления регламентными и фоновыми заданиями для 1С. Его поведение и управление будут идентичны поведению обычных регламентных заданий основной конфигурации.
Если вы работаете с более старыми версиями платформы 1С:Предприятие (до 8.3.23), где прямое добавление регламентных заданий в расширения не поддерживается, нам придется использовать обходной путь. Этот метод предполагает создание внешней обработки, которая будет запускаться регламентно и вызывать необходимые процедуры из вашего расширения.
Создание внешней обработки:
Создайте новую внешнюю обработку в конфигураторе. Сохраните ее как файл .epf. Эту обработку мы будем использовать как "мост" для вызова кода из расширения.
Регистрация внешней обработки как дополнительной обработки:
Зарегистрируйте внешнюю обработку в базе как дополнительную обработку. Для этого перейдите в раздел "Администрирование" - "Печатные формы, отчеты и обработки" - "Дополнительные отчеты и обработки". Добавьте вашу внешнюю обработку, выбрав вид "Вызов серверного метода".
Настройка команды в СведенияОВнешнейОбработке:
В модуле объекта вашей внешней обработки необходимо описать команду, которая будет видна механизму регламентных заданий. Это делается через структуру СведенияОВнешнейОбработке. Очень важно указать уникальный Идентификатор для вашей команды.
// В модуле объекта внешней обработки
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ВызовСерверногоМетода");
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); // Для регламентных заданий обычно Ложь
НоваяСтрока = Команды.Добавить();
НоваяСтрока.Представление = "Выполнить фоновую операцию расширения";
НоваяСтрока.Идентификатор = "ВыполнитьОперациюРасширения"; // Уникальный идентификатор
НоваяСтрока.Использование = "ВызовСерверногоМетода";
НоваяСтрока.ПоказыватьОповещение = Ложь;
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
Реализация экспортной процедуры ВыполнитьКоманду:
В модуле объекта внешней обработки вам также потребуется реализовать экспортную функцию ВыполнитьКоманду. Эта функция будет вызвана системой регламентных заданий. Внутри этой функции вы сравниваете переданный Идентификатор команды со своим и, если они совпадают, выполняете необходимую процедуру из вашего расширения.
// В модуле объекта внешней обработки
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ВыполнитьОперациюРасширения" Тогда
// Здесь мы обращаемся к процедуре в расширении
// Например, если в вашем расширении есть общий модуль "МойМодульРасширения"
// и в нем процедура "ВыполнитьОсновнуюПроцедуру()"
Попытка
// Прямое обращение к объектам расширения
// (даже если конфигуратор показывает ошибку синтаксиса на этапе разработки)
МойМодульРасширения.ВыполнитьОсновнуюПроцедуру();
Исключение
ЗаписьЖурналаРегистрации(
"РегламентноеЗадание: ОшибкаВызоваРасширения",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Не удалось выполнить процедуру расширения: " + ОписаниеОшибки()
);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что процедуру, которая должна регламентно выполняться, следует помещать в модуль объекта внешней обработки, а не, например, в ПриСозданииНаСервере. При выполнении регламентных заданий не существует формы, поэтому код должен быть независим от нее.
Обращение к объектам расширения из внешней обработки:
Часто возникает вопрос: "Как внешняя обработка увидит объекты расширения, если она создана в контексте основной конфигурации?" Ответ прост: смело обращайтесь к объектам расширения, несмотря на потенциальные ошибки проверки синтаксиса в конфигураторе на этапе разработки. Внешняя обработка создается и проверяется в контексте основной конфигурации, но при выполнении на сервере платформа корректно разрешает обращения к объектам, процедурам и функциям расширения. Вы можете даже добавить эту внешнюю обработку как обработку самого расширения, написать необходимый код и затем сохранить в файл для регистрации.
Требования к сеансу для выполнения:
Требования для выполнения регламентных заданий через внешние обработки те же, что и для обычных регламентных заданий:
Настройка расписания:
После регистрации обработки и определения команды, вы сможете настроить расписание для ее выполнения в справочнике дополнительных обработок, а также в общем списке регламентных и фоновых заданий.
Даже при правильной настройке регламентные задания могут вести себя неожиданно, например, не запускаться или самостоятельно отключаться. Рассмотрим распространенные ситуации и способы их решения.
Задание не запускается или снимается галочка "Выполнять команду по расписанию":
Если вы заметили, что регламентное задание не запускается, или в его настройках автоматически снимается галочка "Выполнять команду по расписанию", нам следует проверить его статус в списке регламентных заданий — оперативно узнавать о таких проблемах поможет система мониторинга и уведомлений о сбоях регламентных заданий в Telegram.
Перейдите в "Администрирование" - "Обслуживание" - "Регламентные и фоновые задания". Найдите в списке строку, соответствующую вашему заданию (например, "Дополнительная обработка: Выполнить фоновую операцию расширения").
Выясним причину: Проверьте состояние задания, дату последнего и следующего выполнения. Если задание помечается как "Отменено пользователем", хотя вы ничего не отменяли, это может указывать на блокировку или ошибку при выполнении.
Ошибка "отменено пользователем" или задание неактивно:
Одна из частых причин — задание было заблокировано или деактивировано системой (возможно, после нескольких неудачных попыток выполнения или из-за ошибок). В таком случае, вам может потребоваться "разблокировать" задание.
Найдите ваше регламентное задание в списке "Регламентные и фоновые задания". Обратите внимание на колонку "Состояние" и другие параметры. Возможно, задание находится в состоянии "Отключено", "Отменено", или помечено как неактивное — для диагностики таких проблем разработан инструмент мониторинга ошибок и контроля фоновых заданий 1С.
Посмотрим на решение: Обычно в форме списка регламентных заданий или в форме настроек конкретного задания есть кнопка или контекстное меню для управления его состоянием. Ищите действия вроде "Включить", "Перезапустить", "Разблокировать" или аналогичные. В некоторых случаях это может быть просто кнопка "Включить" или изменение флажка "Разрешить выполнение" в свойствах самого задания.
Также убедитесь, что в общих настройках регламентных заданий установлено разрешение на их выполнение. Для этого в разделе "Администрирование" - "Обслуживание" - "Регламентные и фоновые задания" проверьте флажок "Разрешить выполнение регламентных заданий".
После разблокировки или включения задания попробуйте выполнить его вручную, нажав "Выполнить сейчас". Если оно выполнится успешно, значит, проблема была в его статусе, и теперь оно должно запускаться по расписанию.
Как мы видим, вопрос о регламентных заданиях в расширениях имеет два основных решения, зависящих от версии платформы 1С:Предприятие. Для актуальных версий (начиная с 8.3.23) мы можем использовать прямое добавление, что является наиболее удобным и современным подходом. Для более старых версий нам придется прибегнуть к проверенному обходному пути с внешней обработкой, тщательно настраивая ее и учитывая нюансы взаимодействия с расширением и сервером.