Автоматизация рутинных операций — одна из ключевых задач при сопровождении и разработке систем на платформе 1С:Предприятие. Периодическая выгрузка каталогов, обмен данными с внешними сервисами, перерасчет итогов и рассылка отчетов требуют регулярного исполнения без прямого участия пользователя. Разберем подробно, какие существуют способы запуска обработок в заданное время, как архитектура конфигурации и вариант работы базы (файловый или клиент-серверный) влияют на выбор механизма, а также рассмотрим технические нюансы настройки каждого варианта.
Прежде чем приступать к реализации, проанализируем доступные технологии и особенности используемой информационной базы. Выбор метода зависит от трех ключевых факторов:
.epf).Если база работает на управляемых формах и содержит подсистему «Дополнительные отчеты и обработки», рассмотрим самый безопасный и удобный способ. Нам не потребуется снимать конфигурацию с поддержки или настраивать планировщик операционной системы.
Разберем по шагам, как подготовить внешнюю обработку для автоматического запуска:
СведенияОВнешнейОбработке().ДополнительнаяОбработка.ВызовСерверногоМетода.ВыполнитьКоманду(ИмяКоманды, ПараметрыКоманды), внутри которой опишем логику алгоритма.Посмотрим на пример программного кода модуля объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Информация = "Автоматическая обработка регламентных данных";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Выполнить регламентную операцию";
Команда.Идентификатор = "ЗапускПоРасписанию";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.СпособВызоваКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыКоманды) Экспорт
Если ИмяКоманды = "ЗапускПоРасписанию" Тогда
ВыполнитьОсновноеДействие();
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьОсновноеДействие()
// Логика фонового алгоритма
ЗаписьЖурналаРегистрации("ФоноваяОбработка", УровеньЖурналаРегистрации.Информация,,, "Обработка успешно выполнена.");
КонецПроцедуры
После подготовки файла подключим его в режиме 1С:Предприятие через меню НСИ и администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки. В карточке подключенной обработки появится гиперссылка настройки расписания, где платформа сама создаст и свяжет регламентное задание.
Рассмотрим случай, когда используется конфигурация без БСП (например, 1С:Управление торговлей 10.3) и есть возможность внесения изменений в метаданные. Это классический и наиболее надежный способ выполнения задач по расписанию внутри самой платформы.
Разберем по шагам создание регламентного задания:
РегламентныеЗадачиСервер, и установим флаги Сервер и Вызов сервера.ИмяМетода (например, РегламентныеЗадачиСервер.ВыполнитьЗагрузкуДанных).Посмотрим на пример кода общего модуля, реализующего выполнение задачи:
Процедура ВыполнитьЗагрузкуДанных() Экспорт
Попытка
// Основной алгоритм работы
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка данных
КонецЦикла;
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("РегламентноеЗадание", УровеньЖурналаРегистрации.Ошибка,,, ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
Важное архитектурное ограничение: Фоновые и регламентные задания всегда выполняются на стороне сервера в неинтерактивном контексте. Категорически запрещено использовать клиентские методы взаимодействия с интерфейсом: Предупреждение(), Вопрос(), ОткрытьФорму(), ПолучитьФорму(). Наличие таких вызовов приведет к аварийной остановке сеанса фонового задания.
Если конфигурацию нельзя изменять, БСП отсутствует, а обработка представлена отдельным файлом .epf, проанализируем запуск с помощью планировщика операционной системы (Windows Task Scheduler или cron в Linux).
Выясним причину возможных сложностей: при прямом указании логина и пароля в пакетном файле .bat или .cmd возникает серьезная брешь в безопасности, так как учетные данные хранятся в открытом виде. Для защиты системы рекомендуется использовать доменную Windows-аутентификацию.
Разберем параметры командной строки платформы 1С:
ENTERPRISE — режим запуска пользовательского сеанса./F <ПутьКБазе> или /S <Сервер\База> — путь к файловой информационной базе или имя базы на сервере 1С./Execute <ПутьКФайлу.epf> — автоматическое открытие и выполнение внешней обработки./C <Параметры> — передача произвольной строки параметров внутрь сеанса (считывается через глобальную функцию ПараметрыЗапуска)./DisableStartupMessages — отключение всплывающих системных диалогов, способных заблокировать автономную работу.Посмотрим на пример командного файла (run_task.bat) с использованием Windows-аутентификации:
@echo off
"C:\Program Files\1cv8\8.3.23.1865\bin\1cv8.exe" ENTERPRISE /S "srv-1c\trade_base" /Execute "C:\1C_Tasks\AutoExport.epf" /C "AutoRun" /DisableStartupMessages
Теперь рассмотрим, как должна быть спроектирована сама внешняя обработка. Поскольку запуск происходит в режиме толстого или тонкого клиента, после выполнения действий сеанс 1С обязан штатно закрыться, иначе в диспетчере задач останется зависший процесс.
В модуле формы (или модуле объекта при инициализации) опишем перехват запуска и корректное завершение работы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Найти(ПараметрыЗапуска, "AutoRun") > 0 Тогда
// Запуск основного алгоритма обработки
ВыполнитьАвтоматическуюОбработку();
// Обязательное завершение сеанса после окончания работы
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Проанализируем разницу в поведении подсистемы фоновых заданий в зависимости от типа базы данных:
ВыполнитьОбработкуЗаданий(). В типовых решениях для этого настраивается запуск программы со специальным ключом или используется выделенный пользователь для регламентных задач.Подведем итог выбора инструмента под конкретные условия:
ПрекратитьРаботуСистемы().