Часто в практике программирования и администрирования 1С возникает необходимость настроить запуск определенной обработки строго в определенные дни месяца — например, 1-го и 15-го числа. Проанализируем стандартное диалоговое окно настройки расписания платформы 1С. На вкладке «Месячное» есть поле, определяющее день выполнения с начала месяца, но технически оно способно принять только одно числовое значение. Платформа физически не поддерживает ввод массива дней (через запятую) в рамках одного интерфейсного окна расписания.
Из-за этого технического ограничения объединить 1 и 15 число в одно задание типовыми средствами визуальной настройки невозможно. Разберем по шагам несколько эффективных способов решения этой задачи, начиная от самых простых и заканчивая правильным использованием механизмов Библиотеки стандартных подсистем (БСП) для конфигураций, находящихся на поддержке.
Если нам нужно выполнить задачу быстро и без сложной настройки интерфейса, рассмотрим самый простой вариант. Мы можем настроить расписание регламентного задания на каждый день (например, один раз в сутки утром), а в самом коде обработки добавить проверку на соответствие текущей даты нужным нам числам.
Посмотрим на пример того, как это можно реализовать в процедуре, которая вызывается регламентным заданием:
Процедура ВыполнитьЗаданиеПоРасписанию() Экспорт
ТекущийДень = День(ТекущаяДата());
// Проверяем, что сегодня 1 или 15 число
Если ТекущийДень = 1 ИЛИ ТекущийДень = 15 Тогда
// Размещаем здесь основной код выполнения задачи
ВыполнитьОсновнойАлгоритм();
Иначе
// В остальные дни просто ничего не делаем и завершаем процедуру
Возврат;
КонецЕсли;
КонецПроцедуры
У этого метода есть небольшой недостаток: само задание будет инициироваться каждый день, оставляя записи в журнале регистрации. Однако сама инициация задания без выполнения основного алгоритма потребляет минимальное количество ресурсов, поэтому такой вариант вполне приемлем, если вас не смущает лишний «мусор» в журнале.
Проанализируем ситуацию, когда конфигурация находится полностью на поддержке (например, типовая 1С:Зарплата и Управление Персоналом), и мы не можем менять метаданные. В этом случае мы создаем внешнюю обработку и регистрируем ее через справочник дополнительных отчетов и обработок.
Чтобы обойти ограничение расписания, мы добавим в функцию СведенияОВнешнейОбработке() несколько команд, которые ссылаются на один и тот же исполняемый код. В результате в пользовательском режиме появится несколько строк команд, и для каждой из них можно будет настроить свое независимое расписание. Одной команде мы зададим запуск 1-го числа, а второй — 15-го.
Рассмотрим подробнее программный код инициализации такой обработки в модуле объекта:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
ПараметрыРегистрации.Вставить("Наименование", "Загрузка прайс-листа (1 и 15 числа)");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ТЗКоманд = Новый ТаблицаЗначений;
ТЗКоманд.Колонки.Добавить("Идентификатор");
ТЗКоманд.Колонки.Добавить("Представление");
ТЗКоманд.Колонки.Добавить("Модификатор");
ТЗКоманд.Колонки.Добавить("ПоказыватьОповещение");
ТЗКоманд.Колонки.Добавить("Использование");
// Команда для ручного запуска (опционально)
СтрокаКоманды = ТЗКоманд.Добавить();
СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистРучно";
СтрокаКоманды.Представление = "Загрузить прайс-лист (Ручной запуск)";
СтрокаКоманды.ПоказыватьОповещение = Истина;
СтрокаКоманды.Использование = "ОткрытиеФормы";
// Первая фоновая команда (для настройки на 1 число)
СтрокаКоманды = ТЗКоманд.Добавить();
СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистАвто1";
СтрокаКоманды.Представление = "Загрузить прайс-лист (Автомат - Команда 1)";
СтрокаКоманды.ПоказыватьОповещение = Ложь;
СтрокаКоманды.Использование = "ВызовСерверногоМетода";
// Вторая фоновая команда (для настройки на 15 число)
СтрокаКоманды = ТЗКоманд.Добавить();
СтрокаКоманды.Идентификатор = "ЗагрузитьПрайсЛистАвто2";
СтрокаКоманды.Представление = "Загрузить прайс-лист (Автомат - Команда 2)";
СтрокаКоманды.ПоказыватьОповещение = Ложь;
СтрокаКоманды.Использование = "ВызовСерверногоМетода";
ПараметрыРегистрации.Вставить("Команды", ТЗКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
В процедуре ВыполнитьКоманду() вы просто перенаправляете обе серверные команды на одну и ту же процедуру с вашим основным алгоритмом. Таким образом, вам не нужно плодить сами файлы обработок, достаточно размножить точки входа.
Если задача заключается в запуске два раза в месяц какого-то типового задания (которое уже создано в дереве метаданных конфигуратора), выясним, как можно использовать стандартные возможности платформы без написания кода.
Платформа позволяет создавать несколько пользовательских заданий на основе одного объекта метаданных РегламентныеЗадания. Каждое из них будет жить своей жизнью и иметь собственное расписание.
Если встроенных механизмов 1С по какой-то причине недостаточно, вынесем управление расписанием за пределы программы. Планировщик заданий ОС (Task Scheduler) имеет гораздо более гибкие настройки, позволяя легко выбирать конкретные дни в месяце (1, 15 и любые другие).
В этом случае мы создаем задачу в Windows, которая запускает 1С в пакетном режиме с передачей пути к нужной обработке через параметр запуска. Например:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"ServerName\BaseName" /N"User" /P"Password" /Execute "C:\Scripts\НашаОбработка.epf"
В самой обработке в модуле формы при событии ПриОткрытии (или аналогичном) мы прописываем выполнение нужных действий и обязательно добавляем команду завершения работы системы ЗавершитьРаботуСистемы(Ложь), чтобы фоновый сеанс не оставался «висеть» на сервере после выполнения задачи.
Для современных баз, работающих на управляемых формах (платформа 8.3 и выше), рассмотрим использование расширений. Если конфигурация закрыта для изменений, мы можем создать новое расширение, добавить в него собственное регламентное задание и написать нужный код проверки дат.
Используя расширения, мы не снимаем основную базу с поддержки, но при этом получаем полный функционал конфигуратора для создания любых, даже самых сложных расписаний через программный код, обращаясь к регистрам сведений, производственным календарям или просто прописывая сложную логику Если ... Тогда. В качестве готового решения для таких сценариев подойдёт подсистема регулярных заданий для запуска произвольных алгоритмов по сложным графикам.
Подведем итоги: Проблема с запуском задания в несколько произвольных дней месяца — это известное ограничение графического интерфейса платформы. В зависимости от условий (внешняя это обработка или типовой механизм) вы можете выбрать метод ежедневного запуска с программным фильтром, дублирование команд через БСП или создание копий заданий прямо в пользовательском режиме. Выбирайте тот метод, который наиболее удобен для поддержки в вашей конкретной базе!