При разработке дополнительных отчетов и обработок в среде 1С на базе Библиотеки стандартных подсистем (БСП) часто возникает задача совместить два сценария работы в одном файле. Например, обработка должна ночью в автоматическом режиме выполнять рассылку писем или загрузку данных по расписанию, а днем пользователь должен иметь возможность открыть форму этой же обработки интерактивно, проверить настройки, заполнить таблицы вручную и запустить процесс кнопкой.
Рассмотрим, как правильно зарегистрировать такую обработку в справочнике «Дополнительные отчеты и обработки» и разделить логику между фоновым заданием и интерактивным интерфейсом.
Главный секрет решения заключается в том, что в функции СведенияОВнешнейОбработке модуля объекта внешней обработки необходимо зарегистрировать две разные команды. Одна команда будет отвечать за автоматический запуск серверного метода по расписанию, а вторая — за стандартное интерактивное открытие управляемой формы.
Разберем по шагам структуру функции регистрации. Мы добавим команду с типом запуска ВызовСерверногоМетода для регламентного задания и команду с типом запуска ОткрытиеФормы для работы пользователя:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Назначение", Неопределено);
ПараметрыРегистрации.Вставить("Наименование", NStr("ru = 'Автоматическая и интерактивная отправка ДДС'"));
ПараметрыРегистрации.Вставить("Версия", "1.0");
// Для возможности отправки почты или работы с файлами отключаем безопасный режим
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", NStr("ru = 'Обработка поддерживает работу по расписанию и интерактивный запуск'"));
// Создаем таблицу команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Команда 1: Автоматический запуск на сервере (для регламентного задания)
ДобавитьКоманду(ТаблицаКоманд,
NStr("ru = 'Автоматическая рассылка (по расписанию)'"),
"АвтоОтправкаДДС",
"ВызовСерверногоМетода",
Истина); // Показывать оповещение
// Команда 2: Интерактивный запуск (открытие формы для пользователя)
ДобавитьКоманду(ТаблицаКоманд,
NStr("ru = 'Открыть интерфейс отправки'"),
"ОткрытьФормуОбработки",
"ОткрытиеФормы",
Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Вспомогательная функция для формирования структуры таблицы команд выглядит стандартным образом:
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Когда регламентное задание БСП запускает команду ВызовСерверногоМетода, платформа вызывает экспортную процедуру ВыполнитьКоманду в модуле объекта обработки. Здесь мы анализируем переданный идентификатор и запускаем нужный алгоритм:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
Если ИдентификаторКоманды = "АвтоОтправкаДДС" Тогда
УстановитьПривилегированныйРежим(Истина);
ВыполнитьВсюОбработкуАвтоматически();
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьВсюОбработкуАвтоматически()
// Алгоритм автоматической работы на сервере.
// Важно: здесь нельзя использовать интерактивные элементы (Предупреждение, Вопрос, ОткрытьФорму)
// и нельзя обращаться к реквизитам формы!
КонецПроцедуры
При совмещении серверного фонового и клиентского интерактивного режимов важно учитывать особенности контекстов выполнения в 1С:
ВыполнитьВсюОбработкуАвтоматически код работает на сервере в рамках фонового задания. У него нет формы и интерфейса. Если в интерактивном режиме вы использовали табличную часть формы для отображения данных пользователю, то в фоновом режиме вам необходимо заменить её логику на работу со структурами данных в памяти (например, использовать ТаблицаЗначений или Массив структур).ПараметрыРегистрации.БезопасныйРежим = Ложь, либо настройте профили безопасности в информационной базе.ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка. Вы сможете прочитать сохраненные настройки на сервере и использовать их в алгоритме.После внесения изменений в код модуля объекта выполните следующие действия в интерфейсе программы: