При разработке и тестировании новых механизмов в 1С часто возникает необходимость проверить работу регламентного задания (РЗ) именно в том виде, в котором оно будет функционировать на «боевом» сервере: по расписанию, в фоновом потоке, на реальных данных. Однако наличие сотен других активных заданий в копии базы может создать лишнюю нагрузку или, что хуже, привести к нежелательным последствиям (например, отправке дублей уведомлений клиентам или синхронизации с рабочими сервисами). Разберем пошагово, как изолировать ваше задание и гарантировать корректность его работы.
Прежде всего, проанализируем настройки сервера. В консоли администрирования серверов 1С (MMC-консоль) для тестовой базы обычно устанавливается флаг «Блокировка регламентных заданий включена». Чтобы протестировать расписание, эту блокировку придется снять. Однако делать это нужно только после того, как мы убедимся, что другие задания не начнут выполняться автоматически.
Рассмотрим стандартный механизм платформы. Если вы используете конфигурацию на базе БСП (Библиотека стандартных подсистем), при первом запуске копии система спросит: «Это копия или перемещенная база?». При выборе варианта «Это копия» БСП программно блокирует выполнение большинства регламентных операций. Но для полноценного теста нам нужно точечно управлять процессом.
Если в базе под 300 заданий, отключать их вручную через интерфейс «Администрирование — Обслуживание — Регламентные и фоновые задания» крайне долго. Проанализируем ситуацию: нам нужно оставить активным только одно конкретное задание. Эффективнее всего воспользоваться программным методом. Напишем простую обработку, которая деактивирует все задания, кроме целевого.
Посмотрим на пример кода, который поможет автоматизировать этот процесс:
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Для Каждого Задание Из Задания Цикл
// Проверяем имя метаданных или внутреннее наименование
Если Задание.Метаданные.Имя <> "МоеНовоеРегламентноеЗадание" Тогда
// Снимаем флаг использования, чтобы задание не стартовало по расписанию
Задание.Использование = Ложь;
Попытка
Задание.Записать();
Исключение
Сообщить("Не удалось отключить задание: " + Задание.Метаданные.Имя);
КонецПопытки;
КонецЕсли;
КонецЦикла;
После выполнения этого кода в базе останется только ваше задание с активным признаком Использование. Теперь можно смело снимать блокировку в консоли серверов 1С.
Выясним причину опасения запуска нескольких копий одного и того же задания. Платформа 1С имеет встроенный механизм защиты — Ключ задания. Если у регламентного задания в метаданных или в объекте РегламентноеЗадание заполнено свойство Ключ, система не позволит запустить второй экземпляр с таким же ключом, пока первый не завершит работу.
Рассмотрим подробнее, как это реализовать программно, если вы запускаете фоновые процессы принудительно:
ПараметрыЗапуска = Новый Массив;
// Ключ может быть любой уникальной строкой
УникальныйКлюч = "ОбработкаВыгрузкиЗаказов_Эксклюзивно";
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ВыполнитьОбмен", ПараметрыЗапуска, УникальныйКлюч, "Тестовый запуск обмена");
Если вы хотите реализовать собственную логику контроля (например, для сложной цепочки процессов), можно использовать механизм констант или блокировок. Перед началом работы алгоритма устанавливаем значение константы В_ПроцессеВыполнения = Истина, а в блоке Попытка...КонецПопытки в секции Фактически возвращаем Ложь. Однако использование Ключа платформы является более надежным и предпочтительным способом.
Чтобы не ждать срабатывания задания раз в час, проанализируем возможность ускорения теста. В настройках расписания установите интервал «повторять каждые 10 секунд». Чтобы успеть увидеть процесс в консоли фоновых заданий, в код самого задания можно временно добавить искусственную задержку.
Пример использования паузы (только для целей тестирования на сервере):
// Имитация длительной работы процесса
КомандаПаузы = "ping 127.0.0.1 -n 20 > nul";
ЗапуститьПриложение(КомандаПаузы, , Истина);
Во время этой паузы попробуйте запустить задание вручную или дождитесь срабатывания расписания. В Журнале регистрации вы увидите системное событие, если платформа отклонит запуск из-за наличия уже работающего процесса с тем же ключом.
Проверим алгоритм «вживую». Чтобы точка останова сработала в коде, который выполняется в фоне, необходимо настроить Конфигуратор. Пройдем по шагам: Сервис — Параметры — Запуск 1С:Предприятия — Дополнительно. Установите флаг «Отладка фоновых заданий». Теперь, когда регламентное задание запустится по расписанию, Конфигуратор «подхватит» этот поток, и вы сможете пройтись по коду отладчиком.
Разберем ситуацию, когда код вызывает другие процессы через ВыполнитьВФоне. Эти вызовы не являются регламентными заданиями, это фоновые задания. Они не подчиняются общему списку РЗ и могут запуститься, даже если все регламентные задания в базе отключены (но блокировка в консоли серверов их все же остановит).
Чтобы обезопасить тестовую базу от таких «сюрпризов», рекомендуется:
ФоновыеЗадания.Выполнить.ОбщегоНазначения.ЭтоУчебнаяИнформационнаяБаза().Таким образом, мы обеспечиваем полную изоляцию тестируемого алгоритма, исключаем влияние других процессов и гарантируем, что наше регламентное задание работает строго по заданным правилам.