gifts2017

Регламентное выполнение внешних обработок с параметрами (при помощи СКД) без изменения конфигурации (на примере УТ 11)

Опубликовал Иван Титов (Ibrogim) в раздел Программирование - Универсальные функции

Что, если нужно по расписанию делать что-то, зависящее от кучи параметров?  Например, формировать индивидуальные прайсы и отправлять  их (или сохранять на ftp), предварительно записав в excel. Технология будет полезна тем, кто уже имеет готовую сложную обработку, которую нужно заставить выполняться по расписанию.

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

Переделка обработки состоит из трёх обязательных и одного необязательного этапа (в любом порядке)

Хоть я и буду их подробно описывать (и будет много букв), но делается всё это за 5 минут!

1. Превращаем обработку в отчёт (т.к. стандартный механизм работает исключительно с отчетами), делаем его внешним в соответствии с БСП.

2. Добавляем обработке пустую схему СКД с параметрами, соответствующими реквизитам обработки.

3. При компоновке результата превращаем параметры СКД в реквизиты  и выполняем алгоритм обработки.

4. Если нужно унифицировать выполнение по расписанию и ручной запуск обработки, то дописываем в форме обработки изменение параметров СКД при изменении реквизитов формы.

Разберём простой пример. Пусть у нас есть обработка с двумя реквизитами "Каталог" и "ИмяФайла", которая сохраняет файл с текстом "ПРЕВЕД МЕДВЕД".  Обработка очень сложная, давно используется в компании  и зарекомендовала себя. Но вот возникла необходимость запускать её по расписанию с различными параметрами.

2

1

1. Конвертируем обработку в отчёт


В разблокированной конфигурации (можно в копии базы, т.к. эта манипуляция нам нужна только чтобы получить файл erf)

а) в дереве метаданных встаём на любой отчёт и нажимаем пкм -> "Вставить внешнюю обработку, отчёт" , выбираем наш файл epf

3

б) встаём на вновь добавленный отчет и нажимаем пкм -> "Сохранить как внешнюю обработку, отчёт" , выбираем имя файла, получаем файл erf

в) открываем новорожденный отчёт, добавляем ему форму (не делаем её основной) но ставим галочку "использовать СКД". 

Это будет пустая форма, без её создания СКД у меня не заработало.

г) Ну и добавляем в модуль текст, отвечающий за "внешность" нашего отчёта

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

 2. Добавляем схему СКД с параметрами, соответствующими реквизитам обработки

а) Добавляем параметры в схему СКД

4

б) включаем их в пользовательские настройки

5

3. При компоновке результата превращаем параметры СКД в реквизиты

В модуль отчёта добавляем процедуру ПриКомпоновкеРезультата, в неё добавляем немножко кода по преобразованию параметров СКД в реквизиты и сам алгоритм обработки (в неизменном виде)

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	//Преобразуем параметры скд в реквизиты обработки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	Мета=ЭтотОбъект.Метаданные().Реквизиты;
	Для Каждого ЭлементПараметров Из Настройки.ПараметрыДанных.Элементы Цикл
		ИмяПараметра=Строка(ЭлементПараметров.Параметр);
		Если Не Мета.Найти(ИмяПараметра) =Неопределено Тогда
		ЭтотОбъект[ИмяПараметра]=	ЭлементПараметров.Значение;
	    КонецЕсли;
	КонецЦикла;
	
	// Тут вставляем алгоритм обработки

	ТД=Новый ТекстовыйДокумент;
	ТД.ВставитьСтроку(1,"ПРЕВЕД МЕДВЕД");
	ТД.Записать(?(Прав(ЭтотОбъект.Каталог,1)="/",ЭтотОбъект.Каталог,ЭтотОбъект.Каталог+"/")+ ЭтотОбъект.ИмяФайла);
КонецПроцедуры

Да, преобразование реквизитов тут приведено для довольно простого случая, но без труда можно доработать алгоритм для списков значений и т.п. Например, у меня СКД хранится (в виде нескольких списков значений) и преобразовывается целая табличная часть.

Обязательные действия выполнены, можно подключить нашу обработку как внешнюю.

Далее зайти в Органайзер->рассылки отчётов, создать новую рассылку, заполнить обязательные поля, выбрать внешний отчёт (выбирается специальной кнопкой)

 6

Заполняем параметры, настраиваем расписание и наслаждаемся. Проверить выполнение можно кнопкой "Выполнить сейчас"

7

4. Изменение параметров скд при изменении реквизитов формы (тот самый необязательный пункт)

Для наглядности добавим в форму пользовательские настройки (чтобы видеть, что они меняются при изменении реквизитов)

Заполним их при создании формы


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	КомпоновщикНастроек=Объект.КомпоновщикНастроек;        
	СхемаКомпоновки = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    АадресСКД = ПоместитьВоВременноеХранилище(СхемаКомпоновки, УникальныйИдентификатор);
	ИсточникДанных = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АадресСКД);
	КомпоновщикНастроек.Инициализировать(ИсточникДанных);
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию );
	КомпоновщикНастроек.Восстановить();    
КонецПроцедуры

и всем элементам формы добавим событие ПриИзменииЭлементаНаКлиенте, в котором и будем изменять настройки СКД

Процедура ПриИзменииЭлементаНаКлиенте(Элемент)
	Комп = Объект.КомпоновщикНастроек;
	ППараметр =  Комп.Настройки.ПараметрыДанных.НайтиЗначениеПараметра( Новый ПараметрКомпоновкиДанных(Элемент.Имя));
	Если НЕ ППараметр=Неопределено Тогда
		ИдПНастройки=ППараметр.ИдентификаторПользовательскойНастройки;
		ЭлементНастройки=Комп.ПользовательскиеНастройки.Элементы.Найти(ИдПНастройки);
		Если ЭлементНастройки = Неопределено Тогда 
			ВызватьИсключение "Не найдена пользовательская настройка для реквизита " + Элемент.Имя;
		КонецЕсли;
		ЭлементНастройки.Использование = ?(ЗначениеЗаполнено(Объект[Элемент.Имя]),Истина,Ложь);
		ЭлементНастройки.Значение  = Объект[Элемент.Имя];
	КонецЕсли;
КонецПроцедуры

Теперь можно убедиться, что при изменении реквизитов меняются настройки СКД

8

Мы рассмотрели очень простой пример, но метод можно использовать и для сложных обработок. Например, зная принцип, адаптация этого многофункционального прайса к рассылке занимает 15 минут. А настроек у неё море, да и сам алгоритм сложняцкий. 9 

Возможно, есть и более простые способы, или этот уже был озвучен, если так, прошу в комментарии.

На всякий случай прикладываю обработку - пример, превращённую в рассылаемый отчёт.

Спасибо за внимание!

Скачать файлы

Наименование Файл Версия Размер
ТестОбработкаПоРасписанию 5
.erf 13,38Kb
08.10.15
5
.erf 13,38Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Иван Титов (Ibrogim) 08.10.15 10:56
Жду комментариев и/или конструктивной критики )
2. Евгений Сосна (pumbaE) 08.10.15 11:10
статьи еще не видно, но там разве не стандартное подсистема подключаемых обработок с возможностью указания запуска с помощью регламентного задания?
3. Иван Титов (Ibrogim) 08.10.15 11:50
(2) pumbaE, Скажите как? может действительно есть. Ключевой момент, должна быть возможность настройки параметров
4. Евгений Сосна (pumbaE) 08.10.15 12:23
(3) Ibrogim, вопрос снимается, т.к. если судить по теме, то вам необходимо было регламентное выполнение внешних обработок - это делается без проблем, если говорить про сохранение настроек, то тоже делается без проблем, т.к. можно сохранить из формы по определенному адресу структура с настройками, потом в фоновой задаче восстановить.

Если про рассылку отчетов, то используя типовые средства трудно сделать произвольную настройку.
5. Иван Титов (Ibrogim) 08.10.15 12:46
(4) pumbaE, Задача именно в том, чтобы быстро сделать из существующей обработки фоновую, с возможностью настройки параметров интерактивно. т.е. не обязательно рассылка.
6. Евгений Сосна (pumbaE) 08.10.15 12:54
(5) Ibrogim, ну тогда в модуль объекта добавляете сведения о внешней обработке, определяете экспортную процедуру, там загружаете настройки по определенному ключу и выполняете код на сервере. В той же обработке у вас есть форма, которая при сохранении настроек сохраняет их в хранилище значений.
asazonov; Ibrogim; +2 Ответить 1
7. Иван Титов (Ibrogim) 08.10.15 13:03
(6) pumbaE, Ваше предложение вполне будет работать но
Если нужно выполнять одну обработку с несколькими настройками ?
Каким образом пользователь будет настраивать расписание с разными настройками?
8. Евгений Сосна (pumbaE) 08.10.15 13:08
(7) Ibrogim, для различных настроек - это не подойдет. Можно, конечно сделать для себя соглашение, что команда будет равна названию настройки и тогда можно вручную прописывать, но это больше админ.решение, чем пользовательское.
9. Антон Рощин (wolfsoft) 14.10.15 08:19
10. Maxim Kolkin (the1) 14.10.15 10:24
(0) Все хорошо, но где найти эту рассылку отчетов? В БП 3.0 в органайзере только настройка электронной почты...
11. Иван Титов (Ibrogim) 14.10.15 10:56
(10) the1, Вероятно в БП3 нет этого функционала. Мне известно что он есть в УТ11 и ERP
12. Maxim Kolkin (the1) 14.10.15 14:42
(11) Ibrogim, вероятно не помешает указать о существенных ограничениях применимости данной методы в публикации? ;)
13. Иван Титов (Ibrogim) 14.10.15 15:13
(12) the1, Вы правы, хотя я нигде и не писал что это подойдёт для всех конф.
Дописал
Суть заключается в использовании стандартного механизма рассылки отчётов. Внимание, этот механизм есть не во всех конфигурациях, например его нет в БП.
14. Maxim k (maxis33) 15.10.15 12:20
(10) the1, я внедрил эту подсистему из БСП в БП 3.0 - оказалось очень легко, фактически перенес несколько общих модулей, справочник и регистр сведений и подсистему. Все работает.
15. Иван Титов (Ibrogim) 15.10.15 16:30
(14) maxis33, Буду знать. Однако в этом случае теряется фишка "без изменения конфигурации"