В практике разработчика 1С часто возникает задача автоматизации рутинных действий. Типичный пример: есть обработка, которая по нажатию кнопок заполняет таблицу данными и отправляет их на внешний сайт по API. Чтобы не выполнять эти действия вручную, мы можем перевести обработку на работу в составе регламентных заданий. Разберем подробно, как превратить интерактивную обработку в полноценный инструмент автоматизации с использованием Библиотеки стандартных подсистем (БСП).
Первое и самое важное правило: регламентное задание выполняется на сервере без участия пользователя. Это значит, что код, написанный в модуле формы (в обработчиках нажатия кнопок), не будет доступен фоновому заданию. Проанализируем ситуацию: нам необходимо перенести алгоритмы заполнения и отправки данных в Модуль объекта внешней обработки.
Рассмотрим структуру модуля объекта, которая позволит системе распознать обработку как дополнительную и предоставит возможность настроить расписание. Основным связующим звеном здесь выступает функция СведенияОВнешнейОбработке.
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Наименование", "Автоматическая выгрузка данных по API");
РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
РегистрационныеДанные.Вставить("Версия", "1.1");
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь); // Ложь необходима для сетевых запросов
тзКоманд = Новый ТаблицаЗначений;
тзКоманд.Колонки.Добавить("Идентификатор");
тзКоманд.Колонки.Добавить("Представление");
тзКоманд.Колонки.Добавить("Использование");
тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
НоваяКоманда = тзКоманд.Добавить();
НоваяКоманда.Идентификатор = "ВыполнитьВыгрузку";
НоваяКоманда.Представление = "Выполнить регламентную выгрузку";
НоваяКоманда.Использование = "ВызовСерверногоМетода"; // Ключевой момент для рег. заданий
НоваяКоманда.ПоказыватьОповещение = Истина;
РегистрационныеДанные.Вставить("Команды", тзКоманд);
Возврат РегистрационныеДанные;
КонецФункции
Когда система запустит нашу обработку по расписанию, она обратится к экспортной процедуре ВыполнитьКоманду. Разберем по шагам, как должна выглядеть эта процедура, чтобы объединить функционал обеих кнопок из исходной задачи.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
Если ИдентификаторКоманды = "ВыполнитьВыгрузку" Тогда
ЗапуститьПроцессАвтоматически();
КонецЕсли;
КонецПроцедуры
Процедура ЗапуститьПроцессАвтоматически()
// Шаг 1: Заполнение данных (аналог первой кнопки)
ДанныеДляОтправки = СформироватьДанныеДляВыгрузки();
// Шаг 2: Отправка по API (аналог второй кнопки)
Если ДанныеДляОтправки.Количество() > 0 Тогда
ОтправитьДанныеНаСайт(ДанныеДляОтправки);
КонецЕсли;
КонецПроцедуры
Проанализируем ограничения, с которыми мы столкнемся при работе фонового задания. В серверном контексте категорически запрещены любые интерактивные действия. Выясним причину: фоновое задание выполняется в отдельном сеансе, где нет графического интерфейса. Любая попытка вызвать Предупреждение() или Сообщить() приведет к ошибке и остановке задания.
Для отслеживания хода выполнения вместо вывода сообщений на экран мы должны использовать Журнал регистрации. Это единственный надежный способ понять, что произошло внутри обработки. Рассмотрим пример записи лога:
ЗаписьЖурналаРегистрации("ВнешняяОбработка.ВыгрузкаAPI",
УровеньЖурналаРегистрации.Информация,
,
,
"Выгрузка успешно завершена. Обработано записей: " + Количество);
Если ваша база 1С работает в кластере с включенными профилями безопасности, просто установить БезопасныйРежим = Ложь может быть недостаточно. При работе с HTTP-запросами (API сайта) система может заблокировать соединение. Выясним, как правильно описать разрешения.
В функции СведенияОВнешнейОбработке рекомендуется программно запрашивать доступ к конкретному интернет-ресурсу. Это делается через массив Разрешения, в который добавляются объекты РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоРесурса. Это позволит администратору системы подтвердить доступ при подключении обработки, не отключая безопасность всей базы.
Поскольку обработка запускается каждые 15 минут, ей нужно знать адрес API, логин и пароль. Никогда не записывайте эти данные прямо в программном коде — это небезопасно и неудобно при смене паролей. Посмотрим на варианты решения:
После того как код написан, необходимо выполнить следующие действия:
Для отладки процесса не обязательно ждать 15 минут. Рекомендуем использовать Консоль регламентных заданий. Это внешняя обработка от фирмы 1С, которая позволяет принудительно запустить любое фоновое задание и сразу увидеть, завершилось оно успешно или с ошибкой. Также помните, что для отладки фоновых заданий в Конфигураторе необходимо включить соответствующую опцию в меню "Отладка — Настройка отладки".
Проанализируем ситуацию, когда данных для выгрузки очень много и процесс занимает более 15 минут. В этом случае может запуститься второй экземпляр этого же задания, что приведет к дублированию данных или конфликтам доступа. Чтобы этого избежать, внутри процедуры ВыполнитьКоманду можно установить Менеджер блокировок или проверять, не выполняется ли уже аналогичный процесс в данный момент.
Таким образом, мы превратили простую форму с кнопками в надежный автоматизированный сервис, который работает в фоновом режиме, логирует свои действия и безопасно взаимодействует с внешними API.