Как реализовать автоматический запуск внешней обработки по расписанию в 1С?

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

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

Архитектура решения: переносим логику из формы в модуль

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

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


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

Реализация серверного метода выполнения

Когда система запустит нашу обработку по расписанию, она обратится к экспортной процедуре ВыполнитьКоманду. Разберем по шагам, как должна выглядеть эта процедура, чтобы объединить функционал обеих кнопок из исходной задачи.


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
    Если ИдентификаторКоманды = "ВыполнитьВыгрузку" Тогда
        ЗапуститьПроцессАвтоматически();
    КонецЕсли;
КонецПроцедуры

Процедура ЗапуститьПроцессАвтоматически()
    // Шаг 1: Заполнение данных (аналог первой кнопки)
    ДанныеДляОтправки = СформироватьДанныеДляВыгрузки();
    
    // Шаг 2: Отправка по API (аналог второй кнопки)
    Если ДанныеДляОтправки.Количество() > 0 Тогда
        ОтправитьДанныеНаСайт(ДанныеДляОтправки);
    КонецЕсли;
КонецПроцедуры

Важные нюансы работы на сервере (Фоновый сеанс)

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

Для отслеживания хода выполнения вместо вывода сообщений на экран мы должны использовать Журнал регистрации. Это единственный надежный способ понять, что произошло внутри обработки. Рассмотрим пример записи лога:


ЗаписьЖурналаРегистрации("ВнешняяОбработка.ВыгрузкаAPI",
    УровеньЖурналаРегистрации.Информация,
    ,
    ,
    "Выгрузка успешно завершена. Обработано записей: " + Количество);

Настройка прав доступа и работа с внешними ресурсами

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

В функции СведенияОВнешнейОбработке рекомендуется программно запрашивать доступ к конкретному интернет-ресурсу. Это делается через массив Разрешения, в который добавляются объекты РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоРесурса. Это позволит администратору системы подтвердить доступ при подключении обработки, не отключая безопасность всей базы.

Где хранить настройки авторизации?

Поскольку обработка запускается каждые 15 минут, ей нужно знать адрес API, логин и пароль. Никогда не записывайте эти данные прямо в программном коде — это небезопасно и неудобно при смене паролей. Посмотрим на варианты решения:

  1. Дополнительные параметры БСП: При регистрации обработки можно добавить поля для хранения настроек прямо в справочнике "Дополнительные отчеты и обработки".
  2. Хранилище настроек: Использовать системные механизмы 1С для сохранения параметров.
  3. Константы или Регистры сведений: Создать в самой конфигурации место для хранения ключей доступа, к которым обработка будет обращаться по коду.

Отладка и запуск

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

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

Для отладки процесса не обязательно ждать 15 минут. Рекомендуем использовать Консоль регламентных заданий. Это внешняя обработка от фирмы 1С, которая позволяет принудительно запустить любое фоновое задание и сразу увидеть, завершилось оно успешно или с ошибкой. Также помните, что для отладки фоновых заданий в Конфигураторе необходимо включить соответствующую опцию в меню "Отладка — Настройка отладки".

Борьба с наслоением заданий

Проанализируем ситуацию, когда данных для выгрузки очень много и процесс занимает более 15 минут. В этом случае может запуститься второй экземпляр этого же задания, что приведет к дублированию данных или конфликтам доступа. Чтобы этого избежать, внутри процедуры ВыполнитьКоманду можно установить Менеджер блокировок или проверять, не выполняется ли уже аналогичный процесс в данный момент.

Таким образом, мы превратили простую форму с кнопками в надежный автоматизированный сервис, который работает в фоновом режиме, логирует свои действия и безопасно взаимодействует с внешними API.

← На главную