БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

23.05.23

Разработка - БСП (Библиотека стандартных подсистем)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

Скачать исходный код

Наименование Файл Версия Размер
Дополнительная обработка (Регламенты) финальная
.epf 11,30Kb
69
.epf 1.0.8 11,30Kb 69 Скачать
БСП: Дополнительные отчеты и обработки - одна обработка несколько форм
.rar 35,62Kb
22
.rar 1 35,62Kb 22 Скачать

Если у Вас возник вопрос, как можно вообще напортачить с регламентными заданиями? Почитайте живые примеры из статьи -> Велостыли: Регламентные задания

Для экспериментов я использовал Платформы 8.3.10.2650 и 8.3.12.1412, конфигурации БСП 2.4.6.56 и 3.0.1.127.

Устанавливаем демо конфигурацию БСП и поехали! Работать будем со Справочником «Заметки». У него есть реквизит Содержание с типом ХранилищеЗначения, а это значит, туда много, что записать можно, ну и присутствуют другие реквизиты, с которыми тоже поработаем.

Содержание:

1 Один регламент

2 Регламент и форма с ручным запуском.

3 Два регламента, форма с ручным запуском и сохранение параметров для регламентов.

Рекомендации по отладке.

Задачи и решения.

Задача 1. Создать с помощью регламента новый элемент справочника Заметки и записать в реквизит содержание «Заметка создана регламентом в Время создания»

Создаем внешнюю обработку, назовем ее, например, «БСП_ДО_Регламенты»

Добавляем код в модуль:

// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.5.71");
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0.01";
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Задача 1 регламент'");
	НоваяКоманда.Идентификатор = "Задача1Регламент";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	НоваяКоманда.ПоказыватьОповещение = Истина;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

// Интерфейс для запуска логики обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	
	// Диспетчеризация обработчиков команд.
	Если ИмяКоманды = "Задача1Регламент" Тогда
		Команда_ЗаДача1(ПараметрыВыполнения);
	КонецЕсли;
	
КонецПроцедуры

Процедура Команда_ЗаДача1(ПараметрыВыполнения)
	
	СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения);
		
КонецПроцедуры	

Процедура СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения)
	//Создаем новый элемент справочника
	ТекущийОбъект = Справочники.Заметки.СоздатьЭлемент();
	
	ДатаТекСеанса = ТекущаяДатаСеанса();
	
	//Формируем текст для Содержания
	ФорматированныйТекст = Новый ФорматированныйДокумент;
	ФорматированныйТекст.Добавить("Заметка создана регламентом в " + Строка(ДатаТекСеанса),Тип("ТекстФорматированногоДокумента"));
	
	ТекущийОбъект.Содержание = Новый ХранилищеЗначения(ФорматированныйТекст, Новый СжатиеДанных(9));
	
	ТекстHTML = "";
	Вложения = Новый Структура;
	ФорматированныйТекст.ПолучитьHTML(ТекстHTML, Вложения);
	
	ТекущийОбъект.ТекстСодержания	= СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(ТекстHTML);
	
	ТекущийОбъект.ДатаИзменения 	= ДатаТекСеанса;
	ТекущийОбъект.Автор 			= ПараметрыСеанса.ТекущийПользователь;
	ТекущийОбъект.Пометка 			= Перечисления.ЦветаЗаметок.Красный;
	ТекущийОбъект.ДляРабочегоСтола	= Истина;
	
	ТекущийОбъект.Записать();
КонецПроцедуры

Сохраняем обработку и добавляем ее в нашу конфигурацию для тестов БСП демо.

Моя настройка: C 6 мая 2018 г. каждый день; по 23:59:59 каждые 60 секунд.

Записываем и проверяем.

Вот так просто можно добавить регламент, не изменяя типовой конфигурации. Когда-нибудь РЗ возможно можно будет добавлять через расширение, а пока можно использовать БСП.

Задача 2. В созданную нами дополнительную обработку необходимо добавить форму с возможностью ручного запуска регламентного задания. При этом в содержание надо писать создана заметка вручную или по регламенту.

Меняем код в модуле обработки:

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

// Интерфейс для запуска логики обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	//Если в структуре параметров не передан вид запуска считаем что это запуск регламентом
	Если не ПараметрыВыполнения.свойство("ВидЗапускаРегламент") Тогда 
		ПараметрыВыполнения.Вставить("ВидЗапускаРегламент",Истина);	
	КонецЕсли;	
	
	// Диспетчеризация обработчиков команд.
	Если ИмяКоманды = "Задача1Регламент" Тогда
		Команда_ЗаДача1(ПараметрыВыполнения);
	КонецЕсли;
	
КонецПроцедуры

Процедура Команда_ЗаДача1(ПараметрыВыполнения)

	СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения);
		
КонецПроцедуры	

Процедура СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения)
	//Создаем новый элемент справочника
	ТекущийОбъект = Справочники.Заметки.СоздатьЭлемент();
	
	ДатаТекСеанса = ТекущаяДатаСеанса();
	
	//Формируем текст для Содержания
	ФорматированныйТекст = Новый ФорматированныйДокумент;
	
	//Добавили проверку регламент\форма
	ФорматированныйТекст.Добавить("Заметка создана " + ?(ПараметрыВыполнения.ВидЗапускаРегламент,"регламентом","вручную") + " в "+Строка(ДатаТекСеанса), Тип("ТекстФорматированногоДокумента"));
	
	ТекущийОбъект.Содержание = Новый ХранилищеЗначения(ФорматированныйТекст, Новый СжатиеДанных(9));
	
	ТекстHTML = "";
	Вложения = Новый Структура;
	ФорматированныйТекст.ПолучитьHTML(ТекстHTML, Вложения);
	
	ТекущийОбъект.ТекстСодержания	= СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(ТекстHTML);
	
	ТекущийОбъект.ДатаИзменения 	= ДатаТекСеанса;
	ТекущийОбъект.Автор 			= ПараметрыСеанса.ТекущийПользователь;
	ТекущийОбъект.Пометка 			= Перечисления.ЦветаЗаметок.Красный;
	ТекущийОбъект.ДляРабочегоСтола	= Истина;
	
	ТекущийОбъект.Записать();
КонецПроцедуры	

Добавляем форму и создаем команду «Задание2»

&НаКлиенте
Процедура Задание2(Команда)
	Задание2НаСервере();
КонецПроцедуры

&НаСервере
Процедура Задание2НаСервере()
	ПараметрыВыполнения = новый Структура("ВидЗапускаРегламент",Ложь);
	ИмяКоманды = "Задача1Регламент";
	
	ОбрОбъект = РеквизитФормыВЗначение("Объект");
	ОбрОбъект.ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения);
КонецПроцедуры

Записываем и заменяем предыдущую дополнительную обработку на эту.

Проверяем результат:

Задача 3. Создать второе регламентное задание и сделать  так, чтобы можно было сохранять параметры настроек, текст содержания и цвет (Пометка). При выполнении заданий параметры заполняют элемент справочника «Заметки». Ранее созданная кнопка должна запускать выбранное задание.

Редактируем функцию СведенияОВнешнейОбработке в модуле обработки. Добавляем второе регламентное задание.

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

	Возврат ПараметрыРегистрации;
	
КонецФункции

К модулю вернемся позже. Переходим к редактированию формы.

Создаем параметр формы "ДополнительнаяОбработкаСсылка" с типом "СправочникСсылка.ДополнительныеОтчетыИОбработки"

Делаем параметр ключевым:

Создаем реквизиты формы.

"РегламентноеЗаданиеСписок" с типом "Строка"

"СписокРЗ" с типом "ТаблицаЗначений"

                -"КлючРЗ" с типом "Строка"

                -"ТекстСодержания" с типом "Строка"

                -"Пометка" с типом "ПеречислениеСсылка.ЦветаЗаметок"

Переименовываем команду «Задание2» в команду «ВыполнитьРЗ», соответственно процедуру тоже приводим к такому имени.

Создаем команду «ЗаписатьИзменения»

Форму делаем вот такого вида

Подготовительные работы выполнены, переходим к программированию.

Список для списка РЗ и ключи РЗ будем брать из модуля обработки, из функции СведенияОВнешнейОбработке она Экспортная. Нас интересуют все команды где Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();

Дальше мы будем считывать параметры, сохраненные в обработке Хранить их будем в ХранилищеНастроек

Для того чтобы делать меньше телодвижений в модуле обработки пропишем структуру для чистых настроек, для этого создадим экспортную функцию ПолучитьЧистуюСтруктуруНастроек

//Чистые настройки
Функция ПолучитьЧистуюСтруктуруНастроек() Экспорт
	СтруктураДанных = Новый Структура;
	СписокРЗ = Новый ТаблицаЗначений;
	СписокРЗ.Колонки.Добавить("КлючРЗ");
	СписокРЗ.Колонки.Добавить("ТекстСодержания");
	СписокРЗ.Колонки.Добавить("Пометка");
	
	СтруктураДанных.Вставить("СписокРЗ",СписокРЗ);
	Возврат СтруктураДанных;
КонецФункции

Создаем процедуру ПриСозданииНаСервере

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

Создаем процедуру для команды «ЗаписатьИзменения»

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

Изменяем процедуру для команды «ВыполнитьРЗ»

&НаКлиенте
Процедура ВыполнитьРЗ(Команда)
	ВыполнитьРЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьРЗНаСервере()
	Если не ЗначениеЗаполнено(РегламентноеЗаданиеСписок) Тогда 
		Сообщить("Выберите РЗ!!!",СтатусСообщения.Важное);
		Возврат;
	КонецЕсли;	
	
	ПараметрыОтбора		= Новый Структура;
	ПараметрыОтбора.Вставить("КлючРЗ", РегламентноеЗаданиеСписок);
	НайденныеСтрокиРЗ	= СписокРЗ.НайтиСтроки(ПараметрыОтбора);	
			
	Если НайденныеСтрокиРЗ.Количество() = 0 Тогда
		Сообщить("Не найдено параметров РЗ!!! "+РегламентноеЗаданиеСписок,СтатусСообщения.Важное);
		Возврат;
	КонецЕсли;	
	
	//ПараметрыРЗ формируем на клиенте, вдруг не записали в ТЗ изменения
	ПараметрыВыполнения = новый Структура("ПараметрыРЗ");
	ПараметрыВыполнения.Вставить("ВидЗапускаРегламент",Ложь);
	ИмяКоманды = РегламентноеЗаданиеСписок;
	
	ОбрОбъект = РеквизитФормыВЗначение("Объект");
	//Если вдруг умудрились задублировать в ТЗ регламенты
	Для Каждого СтрокаРЗ из НайденныеСтрокиРЗ Цикл 
	    ПараметрыВыполнения.ПараметрыРЗ = Новый Структура("ТекстСодержания,Пометка",
										СтрокаРЗ.ТекстСодержания,
										СтрокаРЗ.Пометка);
		ОбрОбъект.ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения);	
	КонецЦикла;	
КонецПроцедуры

Изменяем в модуле обработки процедуру «ВыполнитьКоманду»

// Интерфейс для запуска логики обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	//Если в структуре параметров не передан вид запуска считаем что это запуск регламентом
	Если не ПараметрыВыполнения.свойство("ВидЗапускаРегламент") Тогда 
		ПараметрыВыполнения.Вставить("ВидЗапускаРегламент",Истина);	
	КонецЕсли;	
	
	// Диспетчеризация обработчиков команд.
	Если ИмяКоманды = "Задача1Регламент" 
		или ИмяКоманды = "Задача2Регламент" Тогда
		
		Если ПараметрыВыполнения.ВидЗапускаРегламент Тогда 
			ОбъектСсылка = ПараметрыВыполнения.ДополнительнаяОбработкаСсылка;	
			Если ЗначениеЗаполнено(ОбъектСсылка) Тогда	
				//Читаем ХранилищеНастроек
				перОбщиеПараметры = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектСсылка, "ХранилищеНастроек");
				СтруктураОбщиеПараметры = перОбщиеПараметры.Получить();
				
				Если Не ЗначениеЗаполнено(СтруктураОбщиеПараметры) Тогда 
					//записываем чистую структуру
					СтруктураОбщиеПараметры = ПолучитьЧистуюСтруктуруНастроек(); 
				
				КонецЕсли;
				
				Если СтруктураОбщиеПараметры.Свойство("СписокРЗ") Тогда
					Если ТипЗнч(СтруктураОбщиеПараметры.СписокРЗ) = Тип("ТаблицаЗначений") Тогда 
						
						//Все проверки прошли
						ПараметрыОтбора		= Новый Структура;
						ПараметрыОтбора.Вставить("КлючРЗ", ИмяКоманды);
						НайденныеСтрокиРЗ	= СтруктураОбщиеПараметры.СписокРЗ.НайтиСтроки(ПараметрыОтбора);
						
						Если НайденныеСтрокиРЗ.Количество() > 0 Тогда

							//Если вдруг умудрились задублировать в ТЗ регламенты
							Для Каждого СтрокаРЗ из НайденныеСтрокиРЗ Цикл 
								
								Если ПараметрыВыполнения.Свойство("ПараметрыРЗ") Тогда 
								
							    	ПараметрыВыполнения.ПараметрыРЗ = Новый Структура("ТекстСодержания,Пометка",
																СтрокаРЗ.ТекстСодержания,
																СтрокаРЗ.Пометка);
								Иначе
									ПараметрыВыполнения.Вставить("ПараметрыРЗ",Новый Структура("ТекстСодержания,Пометка",
																СтрокаРЗ.ТекстСодержания,
																СтрокаРЗ.Пометка));							
								КонецЕсли;
								
								Команда_ЗаДача1(ПараметрыВыполнения);
							
							КонецЦикла;	
						КонецЕсли;
						
			        КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		Иначе	
			Команда_ЗаДача1(ПараметрыВыполнения);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

и процедуру «СоздатьНовыйЭлементСправочникаЗаметки»

Процедура Команда_ЗаДача1(ПараметрыВыполнения)
     
	СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения);
		
КонецПроцедуры	

Процедура СоздатьНовыйЭлементСправочникаЗаметки(ПараметрыВыполнения)
	//Создаем новый элемент справочника
	ТекущийОбъект = Справочники.Заметки.СоздатьЭлемент();
	
	ДатаТекСеанса = ТекущаяДатаСеанса();
	
	//Формируем текст для Содержания
	ФорматированныйТекст = Новый ФорматированныйДокумент;
	
	//Обрабатываем Параметры
	перТекстСодержания = "Заметка создана ";
	перПометка = Перечисления.ЦветаЗаметок.Красный;
	Если ПараметрыВыполнения.Свойство("ПараметрыРЗ") Тогда 
		Если ТипЗнч(ПараметрыВыполнения.ПараметрыРЗ) = Тип("Структура") Тогда 
			Если ПараметрыВыполнения.ПараметрыРЗ.Свойство("ТекстСодержания") Тогда 
				Если ЗначениеЗаполнено(ПараметрыВыполнения.ПараметрыРЗ.ТекстСодержания) Тогда 
					перТекстСодержания = ПараметрыВыполнения.ПараметрыРЗ.ТекстСодержания;	
				КонецЕсли;	
			КонецЕсли;
			
			Если ПараметрыВыполнения.ПараметрыРЗ.Свойство("Пометка") Тогда 
				Если ЗначениеЗаполнено(ПараметрыВыполнения.ПараметрыРЗ.Пометка) Тогда 
					перПометка = ПараметрыВыполнения.ПараметрыРЗ.Пометка;	
				КонецЕсли;	
			КонецЕсли;

		КонецЕсли;	
	КонецЕсли;

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

	ТекущийОбъект.Пометка 			= перПометка;
	ТекущийОбъект.ДляРабочегоСтола	= Истина;
	
	ТекущийОбъект.Записать();
КонецПроцедуры

Записываем и заменяем предыдущую дополнительную обработку на эту.

Заполняем настройки.

Проверяем ручной запуск и регламеты

Проверяем результат:

В коде можно было бы проверки вынести в одну процедуру\функцию. Как вы видите просто безграничные возможности предоставлены программистам по разработке сложных регламентов без доработки конфигурации.

Отладка.

Отладку регламентов можно проводить по описанию из этой статьи Отладка подключаемых обработок

Корректную отладку запуска из формы можно производить после того как в Параметры.ДополнительнаяОбработкаСсылка будет закинута ссылка на добавленную дополнительную обработкую. В нашем случае, достаточно просто в процедуру формы "ПриСозданииНаСервере" добавить одну строчку.

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

 

П.С. Пока писал данную статью в голову пришла еще одна по данной тематике.  БСП: Дополнительная обработка (Регламенты) + Расширения, примеры от сложного к универсальному

UPD 27.07.2019. Добавил файлы (Одна обработка несколько форм Файлы.rar) к статье БСП: Дополнительные отчеты и обработки - одна обработка несколько форм

Данная статья ответ на вопрос: Можно ли сделать так, чтобы у обработки было регл задание и две формы - работающие по-разному?

РЗ Регламентное задание БСП Дополнительные обработки Отладка Обработка

См. также

Шаблон многопоточного выполнения фонового задания

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Пример шаблона для многопоточного выполнения фонового задания на основе БСП. Шаблоны сделаны для процедуры и функции.

2 стартмани

03.05.2024    756    9    Hitcher    2    

8

БСП. Добавляем отчет в меню Отчеты

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3663    John_d    10    

95

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    2252    dimanich70    8    

14

Заполнение поля адреса в своей обработке [БСП]

Механизмы платформы 1С БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    891    FilippovRI    0    

17

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2851    YA_418728146    11    

48

1С:БСП Дополнительные реквизиты и сведения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Бесплатно (free)

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

19.01.2024    7712    PROSTO-1C    5    

47
Отзывы
18. dsdred 3345 15.10.18 11:33 Сейчас в теме
(16)
Задача: из формы элемента ДополнительныеОтчетыИОбработки (или по-другому) открыть форму внешней обработки, один раз выбрать параметры, сохранить в ХранилищеНастроек, чтобы потом регл. задание считывало их оттуда. Как это лучше сделать для БСП 2.3.2.51?

Не нашел БСП 2.3.2.51 поэтому протестировал на 2.3.2.195

-добавляем обработку в доп очеты и обработки
-копию обработки открываем в конфигураторе

В обработке приложенной в данной статье раскоментируем код в модуле формы

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

Открываем в клиенте и сохраняем параметры для рег. задания.
aleksey_korol; +1 Ответить
21. dsdred 3345 17.10.18 11:53 Сейчас в теме
(19)Прикладываю обработку.

скопировал в нее форму элемента справочника ДополнительныеОтчетыИОбработки из БСП 2.3.2.195

и создал простую форму с выбором ссылки из справочника ДополнительныеОтчетыИОбработки и команду открыть форму
Код команды: ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента",новый Структура("Ключ",ДопОбработкаСсылка),ЭтаФорма);

Прин скрины прикладываю.
Прикрепленные файлы:
ВнешняяОбработка1.epf
aleksey_korol; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dream_kz 129 10.05.18 08:17 Сейчас в теме
Как раз нужны были примеры по запуску доп. обработок по времени + хранение настроек этих самых обработок. Спасибо
2. dsdred 3345 10.05.18 08:21 Сейчас в теме
(1)
Как раз нужны были примеры по запуску доп. обработок по времени + хранение настроек этих самых обработок. Спасибо

Отлично, значит не зря писал статью.
jONES1979; +1 Ответить
3. rafaiil 10.05.18 08:51 Сейчас в теме
Отлично! Большое спасибо!;) Очень полезный для меня материал.
rutony; dsdred; +2 Ответить
4. TrinitronOTV 15 10.05.18 09:16 Сейчас в теме
Спасибо, пригодится
rutony; dsdred; +2 Ответить
5. jONES1979 10.05.18 09:18 Сейчас в теме
Эта статья интересна! Напишите еще одну, более интересную! :)
EGOLEGE; Max27; rutony; dsdred; +4 Ответить
6. dsdred 3345 10.05.18 09:23 Сейчас в теме
(5)
Эта статья интересна! Напишите еще одну, более интересную! :)

Ну судя по тому, что статья быстро набирает положительные голоса. Скорее всего будет продолжение.
7. Ava1or 10.05.18 16:40 Сейчас в теме
Спасибо! Огонь статья!
Эх, написал бы ты ее месяцок назад... Но уже сам разобрался)
8. dsdred 3345 10.05.18 21:30 Сейчас в теме
(7)Знал бы, что будет так интересна читателям, написал бы раньше))
9. serega_new 11.05.18 11:51 Сейчас в теме
Вот интересно почему в БСП четко не прописали в описании как хранить настройки для регламентных обработок, в демо БСП есть пример с хранением, но такой же не очевидный как и у вас. В голову не ложится, вот кстати уже шаблон делали - https://infostart.ru/public/627824/
10. dsdred 3345 11.05.18 12:01 Сейчас в теме
(9)Спасибо, не видел данную статью.
На счет описания 1с. Не знаю почему они пишут поверхностное описание. По сути желтые книжки могут служить только как справочник о том, что можно сделать и удобной подпоркой дивана если отпала ножка... А то как сделать google в помощь. Если не нашел сиди сам пробуй...

Да, в БСП есть пример (если кому понадобится)-> Демо: Загрузка номенклатуры из прайс-листа (профили безопасности)
Код сохранения настроек из обработки:

&НаСервереБезКонтекста
Процедура СохранитьНастройкиФормы(ДополнительнаяОбработкаСсылка, АдресФайла)
СохраняемоеЗначение = Новый Структура("АдресФайла", АдресФайла);

ДополнительнаяОбработкаОбъект = ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(СохраняемоеЗначение);
ДополнительнаяОбработкаОбъект.Записать();
КонецПроцедуры

чтение ПриСозданииНаСервере
11. Danilov 21.05.18 04:48 Сейчас в теме
Отличная статья. Возьму на заметку.
12. dsdred 3345 21.05.18 07:26 Сейчас в теме
(11) На этой неделе будет продолжение. Вторая часть на 90% готова.
13. aleksey_korol 11.10.18 18:25 Сейчас в теме
Как долго я искал, как передать параметры в регламент!
14. dsdred 3345 11.10.18 18:36 Сейчас в теме
(13)Рад, что статья пригодилась
15. aleksey_korol 13.10.18 18:26 Сейчас в теме
В БСП 2.3.2.51 нет кнопки "Выполнить" на странице "Команды" в форме элемента. Как вручную выполнить команду "Форма задач по регламентам"?
16. aleksey_korol 13.10.18 18:37 Сейчас в теме
(15) Задача: из формы элемента ДополнительныеОтчетыИОбработки (или по-другому) открыть форму внешней обработки, один раз выбрать параметры, сохранить в ХранилищеНастроек, чтобы потом регл. задание считывало их оттуда. Как это лучше сделать для БСП 2.3.2.51?
18. dsdred 3345 15.10.18 11:33 Сейчас в теме
(16)
Задача: из формы элемента ДополнительныеОтчетыИОбработки (или по-другому) открыть форму внешней обработки, один раз выбрать параметры, сохранить в ХранилищеНастроек, чтобы потом регл. задание считывало их оттуда. Как это лучше сделать для БСП 2.3.2.51?

Не нашел БСП 2.3.2.51 поэтому протестировал на 2.3.2.195

-добавляем обработку в доп очеты и обработки
-копию обработки открываем в конфигураторе

В обработке приложенной в данной статье раскоментируем код в модуле формы

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

Открываем в клиенте и сохраняем параметры для рег. задания.
aleksey_korol; +1 Ответить
17. dsdred 3345 15.10.18 10:26 Сейчас в теме
(15)Первый вариант у меня описан в конце статьи в описании как отлаживать.

Корректную отладку запуска из формы можно производить после того как в Параметры.ДополнительнаяОбработкаСсылка будет закинута ссылка на добавленную дополнительную обработкую. В нашем случае, достаточно просто в процедуру формы "ПриСозданииНаСервере" добавить одну строчку.

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



Второй вариант сейчас протестирую и отпишусь.
aleksey_korol; +1 Ответить
19. aleksey_korol 17.10.18 09:54 Сейчас в теме
(17) Хотя бы вкратце: на чем основан 2-й вариант?
20. dsdred 3345 17.10.18 11:18 Сейчас в теме
(19)Вкраце просто создание команды по открытию формы через

ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки

ну или посмотреть какие в том модули еще варианты есть.
aleksey_korol; +1 Ответить
21. dsdred 3345 17.10.18 11:53 Сейчас в теме
(19)Прикладываю обработку.

скопировал в нее форму элемента справочника ДополнительныеОтчетыИОбработки из БСП 2.3.2.195

и создал простую форму с выбором ссылки из справочника ДополнительныеОтчетыИОбработки и команду открыть форму
Код команды: ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента",новый Структура("Ключ",ДопОбработкаСсылка),ЭтаФорма);

Прин скрины прикладываю.
Прикрепленные файлы:
ВнешняяОбработка1.epf
aleksey_korol; +1 Ответить
22. sparhh 21.06.19 15:27 Сейчас в теме
А если создавать регламентное задание не через внешнюю обработку, а через встроенный объект.
То получается и теряется возможность гибко настраивать параметры регл. задания?
23. dsdred 3345 21.06.19 15:37 Сейчас в теме
(22)Да, потеряете возможность хранить параметры и придется либо создавать константу с типом Хранилище значений, но это неудобно если регламентов будет несколько. Либо создать справочник с реквизитом хранилище значений. И еще не забывайте про форму которая должна быть создана для работы с данными.

В этом и удобство данной подсистемы. У вас все в одном месте: параметры, форма и регламент.
24. sparhh 21.06.19 16:14 Сейчас в теме
(23) С одной стороны да, с другой же стороны. У тебя начинает копиться логика программы с кодом во внешних файлах.
25. sparhh 21.06.19 17:04 Сейчас в теме
(23) Я вот что не понимаю.. все таки.. если хочу сделать Регламентное задание через расширение, то в таком случае теряется легкость и гибкость, которая есть в механизме БСП Доп. обработки.
Так?
Я видел вашу статью на эту тему, но похоже на самописность..

К примеру есть механизм БСП "Заполнение объекта" и в расширениях он умеет преобразовываться уже в другой механизм.
В для регламентных заданиях нет такого, как я понял.
26. dsdred 3345 21.06.19 21:54 Сейчас в теме
(25)Не понимаю в чем вопрос?
27. user_2010 914 25.07.19 17:30 Сейчас в теме
можно ли сделать так, чтобы у обработки было регл задание и две формы - работающие по-разному?
28. dsdred 3345 26.07.19 18:28 Сейчас в теме
(27)
можно ли сделать так, чтобы у обработки было регл задание и две формы - работающие по-разному?

Огромное спасибо за вопрос, вы мне прям час работы скрасили!
Я дам подробный ответ в статье БСП: Дополнительные отчеты и обработки - одна обработка несколько форм опубликую ее в понедельник-вторник.

Огромная просьба описать ситуацию для которой Вам понадобилось несколько форм. Заранее спасибо!
29. user_2010 914 26.07.19 21:08 Сейчас в теме
(28) Большое спасибо!
Ваша статья мне очень помогла.
Вопрос возник при реализации задачи по загрузке данных из сторонних источников. Процедуры по чтению данных и загрузке - одни и те же. Но вот работать они могут по-разному:
1. Как регламентное задание - без участия пользователя.
2. Как обработка, запущенная пользователем, но без параметров - только одна кнопка "Загрузить", все параметры устанавливаются по умолчанию.
3. Как полноценная обработка пользователя с возможность указания своих параметров для чтения данных и настройки параметров для дальнейшей загрузки данных - при необходимости, и прочей дальнейшей обработки загруженных данных ....
Не хочется для этих целей плодить несколько обработок - хочется одну.
30. dsdred 3345 29.07.19 09:01 Сейчас в теме
31. user_2010 914 29.07.19 09:56 Сейчас в теме
(30) Большое спасибо!
32. Светлый ум 406 30.07.19 09:25 Сейчас в теме
Возьмем на вооружение, +1
33. Vyacheslide 23 14.08.19 11:18 Сейчас в теме
Огромное спасибо автору, искал как делать фоновые задания как то раз, ничего путного не нашел. Это же статья прямо разжевала и в рот положила. Респект!!!
34. dsdred 3345 14.08.19 11:22 Сейчас в теме
(33)Рад, что пригодилась статья.
Vyacheslide; +1 Ответить
35. Xershi 1490 09.12.19 20:21 Сейчас в теме
Нужно было написать регламентное задание с параметрами. Пилить в коде крайне не хотелось. Тем более хотелось все сделать универсально. Наткнулся сначала на аналогичную обработку, но там не было расписано как работает. А здесь все как на ладони.
Убрал всю лишнюю шелуху, которую вы описали и получилась универсальная обработка с параметрами.
Буду повсеместно теперь использовать, плюс 1 раз написал, как шаблон, а далее пользователь может плодить о однотипные регламенты многократно!
36. dsdred 3345 10.12.19 01:54 Сейчас в теме
(35)Спасибо за отзыв к статье. Рад, что описание механизма пригодилось в работе.
37. pisarevEV 8 27.11.20 08:32 Сейчас в теме
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт

не работает (ошибка "Не достаточно фактических параметров..."),
работает так:

Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения=неопределено) Экспорт

но тогда ессно нет парамеров.... как это исправить?
38. dsdred 3345 27.11.20 10:16 Сейчас в теме
(37)Подскажите версию БСП в вашей конфигурации?
39. pisarevEV 8 27.11.20 10:25 Сейчас в теме
40. pisarevEV 8 27.11.20 10:27 Сейчас в теме
не могу понять как передать параметры выполнения в команду модуля (речь идет о команде с типом ВызовСерверногоМетода)... это внеш.обработка подключенная как регламент..
41. pisarevEV 8 27.11.20 11:05 Сейчас в теме
Решение такое:
В процедуре «СведенияОВнешнейОбработке» установить версию БСП как 2.2.2.1
(ПараметрыРегистрации.Вставить(«ВерсияБСП», «2.2.2.1»))
42. dsdred 3345 27.11.20 11:32 Сейчас в теме
(41)То есть вопрос(37) снят?
43. pisarevEV 8 27.11.20 12:32 Сейчас в теме
да.... хотя конечно не очень понятно, почему на актуальной версии БСП не работает...
44. Yashazz 4734 06.05.21 14:42 Сейчас в теме
(43) а потому что не надо связываться с БСП, она имеет свойство внезапно и недокументированно меняться)
pisarevEV; +1 1 Ответить
45. den_vrn 12 27.09.21 16:54 Сейчас в теме
Подскажите кто знает как обрабатывать ошибку при выполнении в фоновом задании ???
Я делаю через

Попытка
Исключение
ВызватьИсключение "";
КОнецПопытки

При этом в журнале регистрации ошибка фиксируется а в списке рег. заданий состояние задания: выполнено без ошибок.
Получается что в пользовательском режиме не понятно отработало норм или с ошибками (((((((((((((((

Пробовал заполнять параметры:
ПараметрыПроцедуры.РезультатВыполнения.ВыводПредупреждения.Использование
ПараметрыПроцедуры.РезультатВыполнения.ВыводПредупреждения.ТекстОшибок

Нифига не помогает, плиз хелп!!!
46. dsdred 3345 28.09.21 08:23 Сейчас в теме
(45)Посмотрите в БСП подсистему Длительные операции.
47. perepetulichka 891 19.01.23 12:45 Сейчас в теме
48. A1exNZP 23.05.23 13:23 Сейчас в теме
Спасибо, Полезно!
Только добавьте тут:
Создаем параметр формы "ДополнительнаяОбработкаСсылка" с типом "СправочникСсылка.ДополнительныеОтчетыИОбработки"
что этот параметр должен быть Ключевым иначе при сохранении вы получите ошибку.
49. dsdred 3345 23.05.23 15:20 Сейчас в теме
(48)Спасибо за комментарий. Добавил и обновил.
50. Cheid 04.07.23 16:50 Сейчас в теме
Товарищи ! Подскажите, что не так?

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

// Интерфейс для запуска логики обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	
	// Диспетчеризация обработчиков команд.
	Если ИмяКоманды = "ТестРегламент" Тогда
		Сообщить("Тестовое сообщение");
	КонецЕсли;
	
КонецПроцедуры
Показать
Оставьте свое сообщение