Как реализовать запуск обработки по расписанию в 1С:Бухгалтерия 2.0 и 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Автоматизация рутинных процессов — одна из ключевых задач программиста 1С. Часто возникает необходимость запускать определенную обработку (например, выгрузку данных на FTP или обмен с сайтом) каждый час или в конце рабочего дня. Способы реализации этой задачи существенно различаются в зависимости от того, используете ли вы современную «1С:Бухгалтерию 3.0» на управляемых формах или работаете с классической «1С:Бухгалтерией 2.0». В этой статье мы разберем основные методы настройки расписания для обеих конфигураций, а также затронем критические нюансы работы в файловом режиме.

Реализация в 1С:Бухгалтерия 3.0 (Управляемые формы)

В современных конфигурациях, построенных на Библиотеке стандартных подсистем (БСП), задача решается наиболее элегантно. Нам не нужно вносить изменения в саму конфигурацию, достаточно правильно подготовить внешнюю обработку. Рассмотрим пошагово, как это сделать.

Для того чтобы система «увидела» возможность запуска по расписанию, в модуле объекта внешней обработки обязательно должна присутствовать функция СведенияОВнешнейОбработке(). Разберем пример кода, который необходимо добавить:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Моя автоматическая обработка";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно для работы с файлами или FTP
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Выполнить обработку по расписанию";
    НоваяКоманда.Идентификатор = "ВыполнениеПоРасписанию";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    Если ИдентификаторКоманды = "ВыполнениеПоРасписанию" Тогда
        // Здесь вызываем ваш основной код
        ВыполнитьОсновнуюЛогику();
    КонецЕсли;
КонецПроцедуры

После подготовки кода выполним следующие действия:

  1. Зайдем в раздел Администрирование — Печатные формы, отчеты и обработки.
  2. Включим флаг Дополнительные отчеты и обработки и перейдем по ссылке.
  3. Добавим нашу обработку из файла.
  4. В табличной части «Команды» появится наша команда. В колонке Расписание можно будет нажать на ссылку «Не установлено» и настроить любой интервал: ежедневно, раз в час или по определенным дням недели.

Важный момент: Если ваша обработка должна работать с внешними ресурсами (интернет, файлы на диске), обязательно установите ПараметрыРегистрации.БезопасныйРежим = Ложь. В противном случае система заблокирует выполнение из соображений безопасности.

Реализация в 1С:Бухгалтерия 2.0 (Обычные формы)

В БП 2.0 нет встроенного удобного интерфейса для назначения расписания внешним обработкам. Здесь у нас есть три пути, которые мы проанализируем подробнее.

Вариант 1: Использование консоли регламентных заданий. Это внешняя обработка от 1С, которая позволяет управлять объектами метаданных РегламентныеЗадания. Однако этот способ требует внесения изменений в конфигурацию: вам придется создать новое регламентное задание в дереве метаданных, привязать его к методу в общем модуле, и уже в этом методе прописать код вызова внешней обработки. Рассмотрим пример вызова внешней обработки программно:


ПутьКФайлу = "C:\ExternalDataProcessors\MyProcessing.epf";
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьДействие();

Вариант 2: Использование обработчика ожидания. Если база файловая и у одного из пользователей программа открыта постоянно, можно использовать метод ПодключитьОбработчикОжидания(). Проанализируем, как это работает: в модуле обычного приложения прописывается вызов процедуры, которая будет срабатывать каждые N секунд. Это не требует изменения метаданных регламентных заданий, но привязано к конкретному открытому сеансу 1С.

Вариант 3: Планы обмена. Это «хитрый» способ, упомянутый на форуме. Мы создаем план обмена, у которого есть встроенное расписание. В правилах обмена (в обработчиках событий) мы прописываем нужный нам код. Система будет запускать этот «обмен» по расписанию, фактически выполняя нашу логику.

Особенности файлового режима работы

Многие сталкиваются с проблемой: расписание настроено, но ничего не происходит. Выясним причину. В файловом режиме (в отличие от серверного) нет отдельного процесса rphost, который бы следил за временем и запускал задания.

Для работы заданий в файловой базе необходимо выполнение следующих условий:

  1. Должен быть запущен хотя бы один сеанс 1С:Предприятия.
  2. Этот сеанс должен быть назначен «ответственным» за выполнение заданий.

Рассмотрим, как принудительно заставить сеанс выполнять задания. При запуске 1С через ярлык можно использовать специальный параметр командной строки:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "ПутьКБазе" /AllowExecuteScheduledJobsForce

Параметр /AllowExecuteScheduledJobsForce заставляет данный конкретный сеанс игнорировать другие подключения и брать на себя роль диспетчера регламентных заданий.

Универсальный метод: Планировщик Windows

Если бюджет проекта ограничен или конфигурация слишком сильно кастомизирована, разберем самый надежный «дедовский» способ. Мы настраиваем запуск 1С из планировщика задач Windows с передачей файла обработки в качестве параметра.

Схема действий будет следующей:

  1. Создаем внешнюю обработку.
  2. В модуле этой обработки в процедуре ПриОткрытии() (для БП 2.0) или ПриСозданииНаСервере() (для БП 3.0 с учетом нюансов) прописываем выполнение основной логики.
  3. В конце кода обязательно добавляем ЗавершитьРаботуСистемы(Ложь);, чтобы сеанс закрылся после выполнения задачи.
  4. В планировщике Windows создаем задачу с командой запуска:

"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"

Посмотрим на ключи запуска:

Практические советы по работе с внешними ресурсами (FTP/XML)

Разберем ситуацию из сообщения №19, где требуется выгрузка на FTP. При написании кода для регламентных заданий нужно помнить о «подводных камнях»:

  1. Пассивный режим FTP: Всегда используйте FTPСоединение(Адрес, Порт, Логин, Пароль, , Истина). Последний параметр Истина включает пассивный режим, что критично для работы через брандмауэры на серверах.
  2. Обработка ошибок: Весь код должен быть обернут в конструкцию Попытка...Исключение. Регламентное задание не может вывести окно ошибки пользователю — оно просто «зависнет» или аварийно завершится.
  3. Логирование: Поскольку задание выполняется в фоне, используйте ЗаписьЖурналаРегистрации(). Это единственный способ понять, почему выгрузка не прошла в 3 часа ночи.

Проанализируем пример записи в журнал:


Попытка
    // Код выгрузки на FTP
    ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Информация, , , "Файл успешно отправлен");
Исключение
    ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;

Таким образом, для БП 3.0 оптимальным выбором будет механизм дополнительных обработок БСП, а для БП 2.0 — либо использование внешних консолей заданий, либо проверенный временем запуск через планировщик Windows с параметром /Execute.

← На главную