Автоматизация рутинных процессов — одна из ключевых задач программиста 1С. Часто возникает необходимость запускать определенную обработку (например, выгрузку данных на FTP или обмен с сайтом) каждый час или в конце рабочего дня. Способы реализации этой задачи существенно различаются в зависимости от того, используете ли вы современную «1С:Бухгалтерию 3.0» на управляемых формах или работаете с классической «1С:Бухгалтерией 2.0». В этой статье мы разберем основные методы настройки расписания для обеих конфигураций, а также затронем критические нюансы работы в файловом режиме.
В современных конфигурациях, построенных на Библиотеке стандартных подсистем (БСП), задача решается наиболее элегантно. Нам не нужно вносить изменения в саму конфигурацию, достаточно правильно подготовить внешнюю обработку. Рассмотрим пошагово, как это сделать.
Для того чтобы система «увидела» возможность запуска по расписанию, в модуле объекта внешней обработки обязательно должна присутствовать функция СведенияОВнешнейОбработке(). Разберем пример кода, который необходимо добавить:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Моя автоматическая обработка";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно для работы с файлами или FTP
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выполнить обработку по расписанию";
НоваяКоманда.Идентификатор = "ВыполнениеПоРасписанию";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыполнениеПоРасписанию" Тогда
// Здесь вызываем ваш основной код
ВыполнитьОсновнуюЛогику();
КонецЕсли;
КонецПроцедуры
После подготовки кода выполним следующие действия:
Важный момент: Если ваша обработка должна работать с внешними ресурсами (интернет, файлы на диске), обязательно установите ПараметрыРегистрации.БезопасныйРежим = Ложь. В противном случае система заблокирует выполнение из соображений безопасности.
В БП 2.0 нет встроенного удобного интерфейса для назначения расписания внешним обработкам. Здесь у нас есть три пути, которые мы проанализируем подробнее.
Вариант 1: Использование консоли регламентных заданий. Это внешняя обработка от 1С, которая позволяет управлять объектами метаданных РегламентныеЗадания. Однако этот способ требует внесения изменений в конфигурацию: вам придется создать новое регламентное задание в дереве метаданных, привязать его к методу в общем модуле, и уже в этом методе прописать код вызова внешней обработки. Рассмотрим пример вызова внешней обработки программно:
ПутьКФайлу = "C:\ExternalDataProcessors\MyProcessing.epf";
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьДействие();
Вариант 2: Использование обработчика ожидания. Если база файловая и у одного из пользователей программа открыта постоянно, можно использовать метод ПодключитьОбработчикОжидания(). Проанализируем, как это работает: в модуле обычного приложения прописывается вызов процедуры, которая будет срабатывать каждые N секунд. Это не требует изменения метаданных регламентных заданий, но привязано к конкретному открытому сеансу 1С.
Вариант 3: Планы обмена. Это «хитрый» способ, упомянутый на форуме. Мы создаем план обмена, у которого есть встроенное расписание. В правилах обмена (в обработчиках событий) мы прописываем нужный нам код. Система будет запускать этот «обмен» по расписанию, фактически выполняя нашу логику.
Многие сталкиваются с проблемой: расписание настроено, но ничего не происходит. Выясним причину. В файловом режиме (в отличие от серверного) нет отдельного процесса rphost, который бы следил за временем и запускал задания.
Для работы заданий в файловой базе необходимо выполнение следующих условий:
Рассмотрим, как принудительно заставить сеанс выполнять задания. При запуске 1С через ярлык можно использовать специальный параметр командной строки:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "ПутьКБазе" /AllowExecuteScheduledJobsForce
Параметр /AllowExecuteScheduledJobsForce заставляет данный конкретный сеанс игнорировать другие подключения и брать на себя роль диспетчера регламентных заданий.
Если бюджет проекта ограничен или конфигурация слишком сильно кастомизирована, разберем самый надежный «дедовский» способ. Мы настраиваем запуск 1С из планировщика задач Windows с передачей файла обработки в качестве параметра.
Схема действий будет следующей:
ПриОткрытии() (для БП 2.0) или ПриСозданииНаСервере() (для БП 3.0 с учетом нюансов) прописываем выполнение основной логики.ЗавершитьРаботуСистемы(Ложь);, чтобы сеанс закрылся после выполнения задачи."C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /F "D:\Bases\BP" /N "Robot" /P "Pass" /Execute "C:\Scripts\MyTask.epf"
Посмотрим на ключи запуска:
/N и /P — логин и пароль пользователя (рекомендуется создать отдельного пользователя «Робот» с минимально необходимыми правами)./Execute — путь к внешней обработке, которая запустится сразу после входа в систему.Разберем ситуацию из сообщения №19, где требуется выгрузка на FTP. При написании кода для регламентных заданий нужно помнить о «подводных камнях»:
FTPСоединение(Адрес, Порт, Логин, Пароль, , Истина). Последний параметр Истина включает пассивный режим, что критично для работы через брандмауэры на серверах.Попытка...Исключение. Регламентное задание не может вывести окно ошибки пользователю — оно просто «зависнет» или аварийно завершится.ЗаписьЖурналаРегистрации(). Это единственный способ понять, почему выгрузка не прошла в 3 часа ночи.Проанализируем пример записи в журнал:
Попытка
// Код выгрузки на FTP
ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Информация, , , "Файл успешно отправлен");
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Таким образом, для БП 3.0 оптимальным выбором будет механизм дополнительных обработок БСП, а для БП 2.0 — либо использование внешних консолей заданий, либо проверенный временем запуск через планировщик Windows с параметром /Execute.