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