Выполнение внешней обработки по расписанию для управляемого и обычного приложения

Публикация № 1274660

Разработка - Универсальные функции

Внешние обработки по расписанию БСП

Использование БСП для выполнения внешних обработок в управляемом и обычном приложении

В типовых конфигурациях существует возможность запуска внешних обработок по расписанию. Наверняка, многие сталкивались с подобной задачей. В данной статье рассмотрим как можно реализовать такую возможность для управляемого приложения и обычного.

Если сказать в общем, то данные функционал реализовывать мы будем при помощи подсистемы БСП "Дополнительные отчеты и обработки" . Рекомендую для начала ознакомиться с возможностями подсистемы https://its.1c.ru/db/bsp21doc#content:22:1

Итак, управляемое приложение. В современных конфигурациях данный функционал реализован и остается только им воспользоваться, создадим внешнюю обработку, например хотим производить выгрузку XML через универсальный обмен по расписанию, для этого нам нужно:

создать внешнюю обработку (в моем примере даже не буду создавать форму),

в модуле внешней обработки разместить следующую процедуру:

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

далее идут процедуры и функции, необходимые для выполнения вашего алгоритма:

Функция ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
	
	Если ИдентификаторКоманды = "Синхронизация" Тогда
		Синхронизировать();
	КонецЕсли;
	
КонецФункции

//процедура выполняемой команды
Процедура Синхронизировать()
	
	Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
	Обработка.РежимОбмена = "Выгрузка";	
	Обработка.ДатаНачала	 = ТекущаяДата()- 86400 * 3;
	Обработка.ДатаОкончания   = КонецМесяца(ТекущаяДата());
	Обработка.ИмяФайлаОбмена  = "C:\1сbase\Обмен БП - УТ XML\Файл выгрузки.xml";
	Обработка.ИмяФайлаПравилОбмена  = "C:\1сbase\Обмен БП - УТ XML\ПравилаОбменаБП-УТ.xml";
	Обработка.ЗагрузитьПравилаОбмена();
	Обработка.ВыполнитьВыгрузку();	
		
КонецПроцедуры

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

проверяем журнал регистрации, чтобы убедиться в выполнении нашей обработки:

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

Возьмем какую-нибудь типовую конфигурацию на обычных формах, например УПП.

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

в модуль формы добавим следующий код, для обработки изменения расписания на форме:

Процедура КомандыПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры

Процедура КомандыПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

Процедура ЗаполнитьКоманды()
	
	КомандыОбработки.Очистить();
	
	Для Каждого ЭлементКоманда Из Команды Цикл
		РегламентноеЗаданиеЗадано = Ложь;
		НоваяКоманда = КомандыОбработки.Добавить();
		
		НоваяКоманда.Представление = ЭлементКоманда.Представление;
		НоваяКоманда.Идентификатор = ЭлементКоманда.Идентификатор;
		
		РегламентноеЗаданиеGUID = ЭлементКоманда.РегламентноеЗаданиеGUID;
		Если ЗначениеЗаполнено(РегламентноеЗаданиеGUID) Тогда
			
			РегламентноеЗадание = ДополнительныеОтчетыИОбработки.НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID);
			
			Если РегламентноеЗадание = Неопределено Тогда
				
				ЭлементКоманда.РегламентноеЗаданиеGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
				
			Иначе
				
				ЭлементКоманда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеGUID;
				
				НоваяКоманда.РасписаниеПредставление = Строка(РегламентноеЗадание.Расписание);
				НоваяКоманда.Расписание.Добавить(РегламентноеЗадание.Расписание);
				
				РегламентноеЗаданиеЗадано = Истина;
			КонецЕсли;
			
		КонецЕсли;
		
		Если НЕ РегламентноеЗаданиеЗадано Тогда
			НоваяКоманда.РасписаниеПредставление = стрРасписаниеНеЗадано();
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция стрРасписаниеНеЗадано()
	
	Возврат НСтр("ru = 'Расписание не задано'");
	
КонецФункции

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

Функция РедактированиеРасписанияРегламентногоЗадания(Расписание)
	
	Если Расписание = Неопределено Тогда
		
		Расписание = Новый РасписаниеРегламентногоЗадания;
		
	КонецЕсли;
	
	Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание);
	
	// открываем диалог для редактирования Расписания
	Если Диалог.ОткрытьМодально() Тогда
		
		Расписание = Диалог.Расписание;
		
	КонецЕсли;
	
	Возврат Расписание;
	
КонецФункции

Процедура УстановитьРасписание(ТекущиеДанные, Отказ = Ложь)
	
	Если ТекущиеДанные.Расписание.Количество() > 0 Тогда
		Расписание = ТекущиеДанные.Расписание.Получить(0).Значение;
	Иначе
		Расписание = Неопределено;
	КонецЕсли;
	
	Расписание = РедактированиеРасписанияРегламентногоЗадания(Расписание);
	
	ТекущиеДанные.Расписание.Очистить();
	ТекущиеДанные.Расписание.Добавить(Расписание);
	
	ТекущиеДанные.РасписаниеПредставление = Строка(Расписание);
	
	Если ТекущиеДанные.РасписаниеПредставление = ПредставлениеПустогоРасписания() Тогда
		ТекущиеДанные.РасписаниеПредставление = стрРасписаниеНеЗадано();
		ТекущиеДанные.Использование = Ложь;
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

КонецПроцедуры

Процедура УстановитьВидимостьЭлементов()

	Если ФормированиеФоновогоЗадания Тогда
		ЭлементыФормы.Панель.Доступность = Истина;
	КонецЕсли;	
	ЭлементыФормы.Панель1.Страницы.СтраницаКоманды.Видимость = ФормированиеФоновогоЗадания;
	ЭлементыФормы.Панель1.Страницы.СтраницаПринадлежность.Видимость = Не ФормированиеФоновогоЗадания;

КонецПроцедуры

Теперь касаемо БСП, берем за основу подсистему дополнительных отчетов и обработок, и адаптируем ее под обычное приложение, поместим в общий модуль ДополнительныеОтчетыИОбработки, рабочий код выглядит следующим образом:

////////////////////////////////////////////////////////////////////////////////
// Подсистема "Дополнительные отчеты и обработки"
// 
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС

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

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

////////////////////////////////////////////////////////////////////////////////
// Изменение регламентных заданий

// Для внутреннего использования
// 
Процедура ОбновитьСведенияПоРасписанию(ДополнительнаяОбработка, Команда, Расписание, Использование, Отказ) Экспорт
	
	// получаем регламентное задание по идентификатору, если объект не находим, то создаем новый
	РегламентноеЗаданиеОбъект = ПолучитьРегламентноеЗадание(Команда.РегламентноеЗаданиеGUID);
	
	// обновляем свойства РЗ
	УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, Расписание, Использование, ДополнительнаяОбработка.Ссылка, Команда);
	
	// записываем измененное задание
	ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект);
	
	//запоминаем GUID регл. задания в реквизите объекта
	Команда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеОбъект.УникальныйИдентификатор;
	
КонецПроцедуры

// Выполняет удаление регламентного задания по GUID
// Параметры
//  РегламентноеЗаданиеGUID - УникальныйИдентификатор - уникальный идентификатор регламентного задания
//
Процедура УдалитьРегламентноеЗадание(РегламентноеЗаданиеGUID) Экспорт
	
	РегламентноеЗаданиеОбъект = НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID);
	
	Если РегламентноеЗаданиеОбъект <> Неопределено Тогда
		УстановитьПривилегированныйРежим(Истина);
		РегламентноеЗаданиеОбъект.Удалить();
	КонецЕсли;
	
КонецПроцедуры

// Выполняет поиск регламентного задания по GUID
// Параметры
//  РегламентноеЗаданиеGUID - УникальныйИдентификатор - уникальный идентификатор регламентного задания
// Возвращаемое значение
//  РегламентноеЗадание - если найдено
//  Неопределено - если не найдено
//
Функция НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Попытка
		ТекущееРегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗаданиеGUID);
	Исключение
		ТекущееРегламентноеЗадание = Неопределено;
	КонецПопытки;
	
	Возврат ТекущееРегламентноеЗадание;
	
КонецФункции


////////////////////////////////////////////////////////////////////////////////
// Выполнение регламентных заданий

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

////////////////////////////////////////////////////////////////////////////////
// Экспортные служебные процедуры и функции

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


////////////////////////////////////////////////////////////////////////////////
// Локальные служебные процедуры и функции

// Для внутреннего использования
// 
Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, Расписание, Использование, Ссылка, Команда)
	
	ПараметрыРЗ = Новый Массив;
	ПараметрыРЗ.Добавить(Ссылка);
	ПараметрыРЗ.Добавить(Команда.Идентификатор);
	
	НаименованиеРегламентногоЗадания = НСтр("ru = 'Запуск обработок: " + СокрЛП(Команда.Представление) + "'");
	
	РегламентноеЗаданиеОбъект.Наименование  = Лев(НаименованиеРегламентногоЗадания, 120);
	РегламентноеЗаданиеОбъект.Использование = Использование;
	РегламентноеЗаданиеОбъект.Параметры     = ПараметрыРЗ;
	
	РегламентноеЗаданиеОбъект.Расписание = Расписание;
	
КонецПроцедуры

// Выполняет запись регламентного задания
//
// Параметры:
//  Отказ                     - Булево - флаг отказа. Если в процессе выполнения процедуры были обнаружены ошибки,
//                                       то флаг отказа устанавливается в значение Истина
//  РегламентноеЗаданиеОбъект - объект регламентного задания, которое необходимо записать
// 
Процедура ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект)
	
	УстановленноеИспользование = РегламентноеЗаданиеОбъект.Использование;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Попытка
		
		// записываем задание
		РегламентноеЗаданиеОбъект.Записать();
		
	Исключение
		СтрокаСообщения = НСтр("ru = 'Произошла ошибка при сохранении регламентного задания
							|Подробное описание ошибки: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + "'");
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = СтрокаСообщения;
		Сообщение.Сообщить();
		
		Возврат;
		
	КонецПопытки;
	

КонецПроцедуры

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

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

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

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

// Сравнить две строки версий.
//
// Параметры
//  СтрокаВерсии1  – Строка – номер версии в формате РР.{П|ПП}.ЗЗ.СС
//  СтрокаВерсии2  – Строка – второй сравниваемый номер версии
//
// Возвращаемое значение:
//   Число   – больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//
Функция СравнитьВерсииКлиентская(Знач СтрокаВерсии1, Знач СтрокаВерсии2)
	
	Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1);
	Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2);
	Версия1 = РазложитьСтрокуВМассивПодстрокКлиентская(Строка1, ".");
	Если Версия1.Количество() <> 4 Тогда
		СтрокаИсключения = НСтр("ru = 'Неправильный формат строки версии: " + СтрокаВерсии1 + "'");
		ВызватьИсключение СтрокаИсключения;
	КонецЕсли;
	Версия2 = РазложитьСтрокуВМассивПодстрокКлиентская(Строка2, ".");
	Если Версия2.Количество() <> 4 Тогда
		СтрокаИсключения = НСтр("ru = 'Неправильный формат строки версии: " + СтрокаВерсии2 + "'");
		ВызватьИсключение СтрокаИсключения;
	КонецЕсли;
	
	Результат = 0;
	Для Разряд = 0 По 3 Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
	
КонецФункции

// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
//
// Параметры:
//  Строка                 - Строка - текст с разделителями;
//  Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
//  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
//    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
//     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
//       включаются в результат.
//     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
//       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
//       при других разделителях результатом функции будет пустой массив.
//
//
// Возвращаемое значение:
//  Массив - массив строк.
//
// Примеры:
//  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых  - пустые строки;
//  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
//  РазложитьСтрокуВМассивПодстрок(" один   два  ", " ") - возвратит массив из двух элементов;
//  РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
//  РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
//  РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
//
Функция РазложитьСтрокуВМассивПодстрокКлиентская(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено)
	
	Результат = Новый Массив;
	
	// для обеспечения обратной совместимости
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Строка) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//
	
	Позиция = Найти(Строка, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Строка, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Результат.Добавить(Подстрока);
		КонецЕсли;
		Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
		Позиция = Найти(Строка, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
		Результат.Добавить(Строка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции 

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

		ПредставлениеПустогоРасписания = Строка(Новый РасписаниеРегламентногоЗадания);
		Если ЭлементКоманда.Расписание.Количество() > 0 Тогда
			Расписание = ЭлементКоманда.Расписание.Получить(0).Значение;
		Иначе
			Расписание = ПредставлениеПустогоРасписания
		КонецЕсли;
		
		КомандаВОбъекте = Источник.Команды.НайтиСтроки(Новый Структура("Идентификатор", ЭлементКоманда.Идентификатор))[0];
		
		Если Строка(Расписание) = ПредставлениеПустогоРасписания Тогда // возможно было удалено регламентное задание
			Если ЗначениеЗаполнено(КомандаВОбъекте.РегламентноеЗаданиеGUID) Тогда
				УдалитьРегламентноеЗадание(КомандаВОбъекте.РегламентноеЗаданиеGUID);
				КомандаВОбъекте.РегламентноеЗаданиеGUID = "";
			КонецЕсли;
		Иначе
			ОбновитьСведенияПоРасписанию(Источник, КомандаВОбъекте, Расписание, Истина, Отказ);
		КонецЕсли;
		
	КонецЦикла; 

	
КонецПроцедуры

Добавим подписку на событие ПриЗаписиВнешнейОбработки для события ПриЗаписи, в качестве обработчика будет выступать ДополнительныеОтчетыИОбработки.ПриЗаписиВнешнейОбработки:

Добавим регламентное задание без расписания, назовем ЗапускДополнительныхОбработок, с его помощью и будем запускать внешние обработки, в качестве метода укажем ДополнительныеОтчетыИОбработки.ПриЗаписиВнешнейОбработки:

Готово) 

А теперь создадим, какую-нибудь внешнюю обработку, которую хотим запускать по расписанию, для этого в модуле обработки обязательно наличие следующей процедуры:

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

	СтрокаКоманды = тзКоманд.Добавить();
	СтрокаКоманды.Идентификатор = Новый УникальныйИдентификатор;  
	СтрокаКоманды.Представление = "Рассылка не отосланных электронных писем";
	
	РегистрационныеДанные.Вставить("Команды", ТЗКоманд);
	
	Возврат РегистрационныеДанные;
	
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды,ПараметрыОбработки) Экспорт
	
	//здесь пишем алгоритм
	
КонецПроцедуры

Теперь запустим конфигурацию, добавим внешнюю обработку и посмотрим, что получилось, появилась настройка расписания:

Проверяем через консоль заданий, и видим, что добавилось регламентное задание с названием нашей внешней обработки:

С помощью таких способов, можно решить данную задачу, однако изучите и другие способы, возможно придет идея, сделать что - то свое, спасибо человеку, который описывал данный способ для обычных форм, ресурс не помню, но решил доработать и разжевать полученную информацию, всем удачи)

Специальные предложения

Автор запретил комментарии

См. также

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    76130    Serginio    108    

Работаем с контактной информацией в конфигурациях на БСП

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

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

14.09.2020    560    quazare    1    

Печать в word, pdf через html

Печать Практика программирования Универсальные функции v8 Россия Бесплатно (free)

При работе с клиентами возникла задача: использовать форматированный документ. Итак, существует справочник, в нем табличная часть. Для каждой строки требуется ввести описание, причем описание имеет тип форматированный документ. Потребовалось организовать печать табличной части справочника с описанием для каждой строки. Тип данных "Форматированный документ" не может выводится в табличный документ, поэтому пришлось организовывать печать через Microsoft Word.

11.09.2020    472    arr    4    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

В данной публикации я опишу полезные процедуры и функции модуля общего назначения библиотеки стандартных подсистем, обязательные к использованию любым программистом 1С.

30.08.2020    5678    quazare    32    

Универсальные функции с примерами использования Промо

Универсальные функции v8 Бесплатно (free)

14 универсальных функций, с примерами использования - для обычного и управляемого интерфейса

26.02.2016    41097    unichkin    46    

Самый простой парсинг и обработка веб-страниц в 1С

WEB Универсальные функции v8 1cv8.cf Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    4033    YPermitin    18    

Пользовательское поле СКД одной процедурой

Практика программирования Универсальные функции v8 Бесплатно (free)

Быстрое создание пользовательского поля "выражение" одной процедурой

05.08.2020    1459    Yashazz    0    

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

БСП (Библиотека стандартных подсистем) Информационная безопасность Роли и права v8 КА2 Россия УУ Бесплатно (free)

Решал задачу ограничения доступ к объектам по справочнику "Банковские счета" штатными средствами БСП. Конфигурация КА 2.2. В остальных на БСП должно работать так же. Хотел сделать инструкцию для себя на будущее, решил поделиться.

05.08.2020    1202    ER34    2    

Минимализмы 3 Промо

Практика программирования Универсальные функции v8 Бесплатно (free)

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    46312    ildarovich    45    

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Универсальные функции v8 БП3.0 УТ11 Россия Бесплатно (free)

В данном обзоре приведу примеры встроенных используемых функций для работы с печатными формами на примерах конфигураций Управление торговлей 11.4 и Бухгалтерия 3.0.

10.07.2020    2552    quazare    5    

Вывод дерева в табличный документ СКД

Практика программирования Универсальные функции v8 v8::СКД Бесплатно (free)

Вывод содержимого элемента формы "ДанныеФормыДерево" в табличный документ средствами СКД.

09.07.2020    2403    Yashazz    4    

Возможности работы со строками при помощи БСП, которые должен знать каждый программист

Практика программирования БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

Переходим на следующий уровень работы со строками, уходим от типовых возможностей платформы. Узнаем, как применить функционал БСП конфигурации.

05.07.2020    7505    quazare    36    

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

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Конфигурации в 1С пишутся для пользователей и по их «правилам» (клиент всегда прав), поэтому в основном все конфигурации разные, но достаточно часто в них используются одни и те же объекты, которые незначительно отличаются друг от друга. Действительно, сложно представить конфигурацию, где не фигурировали бы такие сущности как номенклатура, контрагенты, пользователи, валюта. И некоторые задачи являются типичными: возможность базового разграничения прав, работа с электронной почтой, задачи пользователям и т.д. Но...!

03.03.2017    67752    V.Stavinsky    21    

Мастер-класс "Ведение проектов в типовых конфигурациях 1С"

Управление проектом CI/CD БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

При адаптации типовой конфигурации под особенности учета в компании важно обеспечить возможность легкого обновления поставки. Как организовать архитектуру решения и продумать процесс быстрой и эффективной разработки без ущерба типовой функциональности, на конференции Infostart Event 2019 Inception рассказал ведущий программист компании BIA-Teсhnologies Алексей Князьков.

05.06.2020    3798    AKnyazkov    3    

Способ хранения данных расширения или дополнительной обработки

БСП (Библиотека стандартных подсистем) Практика программирования v8 Бесплатно (free)

Описание способа хранения данных расширения или дополнительной обработки в информационной базе с использованием функционала Библиотеки стандартных подсистем.

01.06.2020    3393    Sedaiko    17    

Ещё немного функционального стиля в 1С или Как нам отфильтровать таблицу значений

Универсальные функции v8 Россия Бесплатно (free)

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

16.05.2020    2728    GlebHappy    34    

Универсальная функция для программного выполнения СКД Промо

Инструментарий разработчика Универсальные функции v8::СКД 1cv8.cf Бесплатно (free)

Часто встречаются вопросы на форумах о программном формировании СКД. Вроде и информации много по этому поводу, но... Все как всегда :) Собственно, в описании без лишних слов выложен текст общей функции, в которую, для выполнения отчета, нужно передать (минимум 2 параметра): СКД и ТабличныйДокумент.

20.05.2015    30500    dj_serega    18    

Картинка в форме списка номенклатуры для УТ 11.4

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Россия Бесплатно (free)

В публикации приведу код позволяющий выводить картинку номенклатуры в форме списка.

23.03.2020    1770    malikov_pro    1    

Полезные функции БСП (Часть 2)

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

Список полезных функций из состава Библиотеки стандартных подсистем 3.1.

10.03.2020    11525    user5300    18    

Выполнение произвольного кода в фоновых заданиях Промо

Универсальные функции v8 Бесплатно (free)

Если надо быстро провести 100`000 документов...

13.01.2016    24593    unichkin    13    

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

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

Как проводятся документы при обмене по универсальному формату. Пример доработки типовых правил обмена с переносом состояния документа: проведен/не поведен/пометка удаления.

04.03.2020    4690    partizand    6    

Сходство Джаро - Винклера. Нечеткое сравнение строк

Универсальные функции v8 Россия Бесплатно (free)

В области информатики и статистики сходство Джаро - Винклера представляет собой меру схожести строк для измерения расстояния между двумя последовательностями символов. В публикации рассмотрены некоторые особенности алгоритма, и представлен вариант его реализации на языке 1С.

25.12.2019    6889    brooho    17    

Функция - Формат государственного номера автомобиля

Универсальные функции v8 Автомобили, автосервисы Россия Бесплатно (free)

Возникла необходимость в приведении к единому формату хранящихся, и вводимых вновь, автомобильных Регистрационных знаков - Гос.номер.

23.12.2019    3468    brooho    4    

Распределение оплаты по товарам Промо

Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам. Практическая задача была сложнее. Упростил специально для иллюстрации. Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.

04.08.2014    19133    Трактор    5    

[БСП] Внешняя печатная форма: как перед печатью выводить форму настроек

Печатные формы документов БСП (Библиотека стандартных подсистем) v8 КА2 Бесплатно (free)

Во внешней печатной форме перед печатью нужно выводить форму настроек. Для примера рассматриваю печатную форму "Акт сверки взаимных расчетов " .

19.12.2019    10610    John_d    8    

Полезности | Дерево значений | Обычные формы |

Практика программирования Универсальные функции v8 Бесплатно (free)

Полезные функции при работе с деревом значений.

04.12.2019    5430    Mellow    7    

Использование XML-схемы из макета внешней обработки

Обмен через XML Универсальные функции v8 1cv8.cf Бесплатно (free)

Простой способ использования XML-схем из макета внешней обработки.

28.10.2019    10740    Olesia_Matusevich    10    

Сканируем без сканера или MXL to JPG Промо

Внешние источники данных Универсальные функции Печатные формы документов v8 1cv8.cf Бесплатно (free)

Хотите конвертировать документы в формат изображения менее чем за минуту, не имея сканера? Тогда эта статья для вас.

24.05.2012    34076    shakmaev    47    

Быстрое создание наполненных коллекций

Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

Разберем самые частые способы создания коллекции, значения которой известны заранее. И сравним скорость их выполнения.

28.10.2019    7096    SeiOkami    66    

Преобразование XML в таблицу значений или иной объект 1С методом XSL преобразования

Универсальные функции Обмен через XML v8 1cv8.cf Бесплатно (free)

Сразу открою интригу, напрямую прочитать XML, не содержащий объект 1С, не удастся. Статья раскрывает способы привести XML к формату, который возможно прочитать средствами платформы.

24.10.2019    11047    kraspila    29    

Обертка функций Excel на русском. Ускорение процесса разработки.

Загрузка и выгрузка в Excel Универсальные функции v8 Бесплатно (free)

Устали переключаться с русского на английский и обратно при работе с таблицами Excel из 1С? Сборка наиболее необходимых функций и методов работы с Excel, обернутых в функции 1С на русском языке.

24.10.2019    7198    DmitryKotov    6    

Функция СтрШаблон с именованными маркерами

Универсальные функции v8 1cv8.cf Бесплатно (free)

Функция позволяет задавать именованные маркеры формата [Имя], в отличии от типовых нумерованных формата %n

1 стартмани

21.10.2019    4304    kirinalex    27    

Реализация печати QR кодов "Библиотека стандартных подсистем", редакция 3.1 (3.1.1.151)

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

Рассмотрим, как реализовать печать QR кодов с помощью механизмов БСП.

16.10.2019    6520    paulis    4    

Реализация команды печати "Библиотека стандартных подсистем", редакция 3.1 (3.1.1.151)

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

В новом релизе "БСП" произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

12.10.2019    5709    paulis    4    

Полезняшки по СКД и построителям. Просто код

Практика программирования Универсальные функции v8 v8::СКД Бесплатно (free)

Полезные процедуры и функции для работы с построителями и СКД. Просто исходник.

10.10.2019    9862    Yashazz    45    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

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

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

10.10.2019    16928    John_d    14    

От чего можно отказаться при разработке расширений 1С

Практика программирования БСП (Библиотека стандартных подсистем) Расширения v8 Бесплатно (free)

Разработка расширений 1С и оптимизация через механизм БСП: Дополнительные отчеты и обработки.

23.09.2019    10487    independ    24    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

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

17.08.2019    31048    ids79    16    

БСП: Дополнительные отчеты и обработки - одна обработка, несколько форм

Практика программирования Работа с интерфейсом БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

Как в одной дополнительной обработке разместить несколько форм с типом команды "ОткрытиеФормы"?

29.07.2019    10711    dsdred    9    

Подсистема "Варианты отчетов". Используете ли Вы ее правильно?

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

Небольшая история про использование подсистемы "Варианты отчетов" из БСП. Используете ли Вы ее правильно?

04.06.2019    40807    YPermitin    52    

Подсистема БСП «Управление доступом», основные объекты и регистры

БСП (Библиотека стандартных подсистем) Роли и права v8 v8::УФ v8::Права 1cv8.cf Бесплатно (free)

Основные принципы работы подсистемы «Управление доступом» из состава БСП. Виды доступа, ограничение доступа на уровне записей. Описание основных объектов и регистров, используемых подсистемой.

23.05.2019    21659    ids79    9    

Сохранение запроса со всеми параметрами и временными таблицами

Универсальные функции v8 v8::УФ Россия Бесплатно (free)

Функция сохранения запроса со всеми параметрами и временными таблицами в формате *.q1c для открытия в консоли запросов с диска ИТС.

13.05.2019    6418    Serge R    5    

Иерархия справочника Сверху Вниз. Получаем произвольное количество родителей "верхнего" уровня

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Иерархия справочника Сверху Вниз. Функция для получения произвольного количества родителей "верхнего" уровня. На примере справочника "Номенклатура".

28.03.2019    6130    obsfromekb    11    

Как программно открыть внешний отчет из "Дополнительных отчетов и обработок" и передать параметры (при помощи БСП)

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Пример, как при помощи БСП программно открыть внешний отчет/обработку из "Дополнительные отчеты и обработки" и передать параметры...

25.03.2019    22824    ellavs    12    

Доработка проведения типовых документов в УТ 11.4, КА 2.4, ЕРП 2.4

Практика программирования Универсальные функции Разработка v8 v8::УФ ERP2 УТ11 КА2 Россия УУ Бесплатно (free)

Различные варианты корректировки типовых механизмов проведения документов, без корректировки основной конфигурации. Использование расширений, подписок на событие и механизма локализации типовых документов.

22.03.2019    17619    ids79    16    

Добавление отчетов в типовые конфигурации 1С

Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем) v8::УФ v8::СКД 1cv8.cf Бесплатно (free)

Описание различных способов добавления общих и контекстных отчетов в конфигурации 1С, построенные на базе БСП. Основные моменты и нюансы.

07.03.2019    53029    ids79    45