Суть заключается в использовании стандартного механизма рассылки отчётов. Внимание, этот механизм есть не во всех конфигурациях, например его нет в БП.
Переделка обработки состоит из трёх обязательных и одного необязательного этапа (в любом порядке)
Хоть я и буду их подробно описывать (и будет много букв), но делается всё это за 5 минут!
1. Превращаем обработку в отчёт (т.к. стандартный механизм работает исключительно с отчетами), делаем его внешним в соответствии с БСП.
2. Добавляем обработке пустую схему СКД с параметрами, соответствующими реквизитам обработки.
3. При компоновке результата превращаем параметры СКД в реквизиты и выполняем алгоритм обработки.
4. Если нужно унифицировать выполнение по расписанию и ручной запуск обработки, то дописываем в форме обработки изменение параметров СКД при изменении реквизитов формы.
Разберём простой пример. Пусть у нас есть обработка с двумя реквизитами "Каталог" и "ИмяФайла", которая сохраняет файл с текстом "ПРЕВЕД МЕДВЕД". Обработка очень сложная, давно используется в компании и зарекомендовала себя. Но вот возникла необходимость запускать её по расписанию с различными параметрами.
1. Конвертируем обработку в отчёт
В разблокированной конфигурации (можно в копии базы, т.к. эта манипуляция нам нужна только чтобы получить файл erf)
а) в дереве метаданных встаём на любой отчёт и нажимаем пкм -> "Вставить внешнюю обработку, отчёт" , выбираем наш файл epf
б) встаём на вновь добавленный отчет и нажимаем пкм -> "Сохранить как внешнюю обработку, отчёт" , выбираем имя файла, получаем файл erf
в) открываем новорожденный отчёт, добавляем ему форму (не делаем её основной) но ставим галочку "использовать СКД".
Это будет пустая форма, без её создания СКД у меня не заработало.
г) Ну и добавляем в модуль текст, отвечающий за "внешность" нашего отчёта
Функция СведенияОВнешнейОбработке() Экспорт
Структура = Новый Структура;
Структура.Вставить("Вид", "ДополнительныйОтчет"); //Перечисления.ВидыДополнительныхОтчетовИОбработок.
Структура.Вставить("Наименование", "Тест обработка по расписанию");
Структура.Вставить("Версия", "1.01");
Структура.Вставить("БезопасныйРежим", ЛОЖЬ);
Структура.Вставить("Информация", "");
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Идентификатор");
Команды.Колонки.Добавить("Представление");
Команды.Колонки.Добавить("Модификатор");
Команды.Колонки.Добавить("ПоказыватьОповещение");
Команды.Колонки.Добавить("Использование");
НоваяСтрока = Команды.Добавить();
НоваяСтрока.Идентификатор = "ОткрытьФорму";
НоваяСтрока.Представление = "Тест обработка по расписанию";
НоваяСтрока.Модификатор = "";
НоваяСтрока.ПоказыватьОповещение = Истина;
НоваяСтрока.Использование = "ОткрытиеФормы";
Структура.Вставить("Команды", Команды);
Возврат Структура;
КонецФункции
2. Добавляем схему СКД с параметрами, соответствующими реквизитам обработки
а) Добавляем параметры в схему СКД
б) включаем их в пользовательские настройки
3. При компоновке результата превращаем параметры СКД в реквизиты
В модуль отчёта добавляем процедуру ПриКомпоновкеРезультата, в неё добавляем немножко кода по преобразованию параметров СКД в реквизиты и сам алгоритм обработки (в неизменном виде)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
//Преобразуем параметры скд в реквизиты обработки
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Мета=ЭтотОбъект.Метаданные().Реквизиты;
Для Каждого ЭлементПараметров Из Настройки.ПараметрыДанных.Элементы Цикл
ИмяПараметра=Строка(ЭлементПараметров.Параметр);
Если Не Мета.Найти(ИмяПараметра) =Неопределено Тогда
ЭтотОбъект[ИмяПараметра]= ЭлементПараметров.Значение;
КонецЕсли;
КонецЦикла;
// Тут вставляем алгоритм обработки
ТД=Новый ТекстовыйДокумент;
ТД.ВставитьСтроку(1,"ПРЕВЕД МЕДВЕД");
ТД.Записать(?(Прав(ЭтотОбъект.Каталог,1)="/",ЭтотОбъект.Каталог,ЭтотОбъект.Каталог+"/")+ ЭтотОбъект.ИмяФайла);
КонецПроцедуры
Да, преобразование реквизитов тут приведено для довольно простого случая, но без труда можно доработать алгоритм для списков значений и т.п. Например, у меня СКД хранится (в виде нескольких списков значений) и преобразовывается целая табличная часть.
Обязательные действия выполнены, можно подключить нашу обработку как внешнюю.
Далее зайти в Органайзер->рассылки отчётов, создать новую рассылку, заполнить обязательные поля, выбрать внешний отчёт (выбирается специальной кнопкой)
Заполняем параметры, настраиваем расписание и наслаждаемся. Проверить выполнение можно кнопкой "Выполнить сейчас"
4. Изменение параметров скд при изменении реквизитов формы (тот самый необязательный пункт)
Для наглядности добавим в форму пользовательские настройки (чтобы видеть, что они меняются при изменении реквизитов)
Заполним их при создании формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КомпоновщикНастроек=Объект.КомпоновщикНастроек;
СхемаКомпоновки = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
АадресСКД = ПоместитьВоВременноеХранилище(СхемаКомпоновки, УникальныйИдентификатор);
ИсточникДанных = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АадресСКД);
КомпоновщикНастроек.Инициализировать(ИсточникДанных);
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию );
КомпоновщикНастроек.Восстановить();
КонецПроцедуры
и всем элементам формы добавим событие ПриИзменииЭлементаНаКлиенте, в котором и будем изменять настройки СКД
Процедура ПриИзменииЭлементаНаКлиенте(Элемент)
Комп = Объект.КомпоновщикНастроек;
ППараметр = Комп.Настройки.ПараметрыДанных.НайтиЗначениеПараметра( Новый ПараметрКомпоновкиДанных(Элемент.Имя));
Если НЕ ППараметр=Неопределено Тогда
ИдПНастройки=ППараметр.ИдентификаторПользовательскойНастройки;
ЭлементНастройки=Комп.ПользовательскиеНастройки.Элементы.Найти(ИдПНастройки);
Если ЭлементНастройки = Неопределено Тогда
ВызватьИсключение "Не найдена пользовательская настройка для реквизита " + Элемент.Имя;
КонецЕсли;
ЭлементНастройки.Использование = ?(ЗначениеЗаполнено(Объект[Элемент.Имя]),Истина,Ложь);
ЭлементНастройки.Значение = Объект[Элемент.Имя];
КонецЕсли;
КонецПроцедуры
Теперь можно убедиться, что при изменении реквизитов меняются настройки СКД
Мы рассмотрели очень простой пример, но метод можно использовать и для сложных обработок. Например, зная принцип, адаптация этого многофункционального прайса к рассылке занимает 15 минут. А настроек у неё море, да и сам алгоритм сложняцкий.
Возможно, есть и более простые способы, или этот уже был озвучен, если так, прошу в комментарии.
На всякий случай прикладываю обработку - пример, превращённую в рассылаемый отчёт.
Спасибо за внимание!