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

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

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

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

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

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

Если сказать в общем, то данные функционал реализовывать мы будем при помощи подсистемы БСП "Дополнительные отчеты и обработки" . Рекомендую для начала ознакомиться с возможностями подсистемы 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    85946    Serginio    116    

Программный интерфейс для доработки форм

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

Реализовал простой способ программного создания новых элементов, команд и реквизитов на форме.

25.11.2021    2427    AtamanovYS    19    

Подключение функционала "Присоединенные файлы" для нового объекта (БСП)

БСП (Библиотека стандартных подсистем) v8 v8::УФ БП3.0 Россия Бесплатно (free)

Данная статья поможет добавить "скрепку", т.е. возможность пользоваться функционалом БСП для присоединения файлов к любому документу.

24.11.2021    1413    kalyuzhnyyp    22    

Отбор/фильтр в отчетах/СКД/обработках 1C: БП, УТ, ERP, Кронос: WMS по файлу Excel, текстовому файлу или списку текстовых строк (номер документа, артикул, ИНН, QR-код, штрих-код, наименование)

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

Как построить отчет Анализ продаж или Остатки товаров с отбором/фильтром по списку кодов товаров/артикулов или ИНН покупателей из Эксель файла? Покажем, какой код нужно добавить в конфигурацию 1С (в том числе нетиповую), чтобы в любом отчете/отборе СКД/обработке можно было заполнять отбор по excel файлу, текстовому файлу или просто по списку строк - удобно и быстро.

23.11.2021    332    SizovE    3    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

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

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    9029    comol    31    

Профили управления доступом к объектам в любой конфигурации на БСП

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

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

17.11.2021    1842    quazare    3    

Журнал регистрации - основные методы работы через БСП

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

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

11.11.2021    2676    quazare    8    

Простейший способ учета изменений управляемых форм объектов 1С

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

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

02.11.2021    978    avalakh    12    

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

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

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

26.02.2016    43360    unichkin    47    

Функции для преобразования справочников и документов в соответствие и обратно

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

Функции для преобразования справочников и документов в соответствие и обратно. Предназначены для передачи данных между одинаковыми и не очень конфигурациями или как очередной вариант сохранения (архивирования) объектов перед редактированием с последующим восстановлением.

01.11.2021    741    avalakh    5    

Базовые приемы работы с кластером 1С при помощи БСП

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

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

26.10.2021    3244    quazare    6    

Вариант организации хранения настроек подсистем

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

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

22.10.2021    533    malikov_pro    5    

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

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

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

19.02.2018    50103    ildarovich    47    

Программно свернуть/развернуть узел динамического списка (с основной таблицей). Жирная точка над всеми "i".

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

Какой пользователь не мечтал поменьше тыркать кнопкой? Особенно в малюсенькие +/- в "древесных" динамических списках. Если вас тоже озадачили, чтобы, при выборе узла дерева сами развернулись все его вложенные элементы , а при выборе другого узла - так же автоматом свернулась ранее развернутая ветка (причем эти узлы могут находится в разных "отношениях" друг с другом)... То вам - сюда.

08.10.2021    1506    e-9    13    

Взаимодействие с api Честный знак (Молочная продукция)

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

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

30.08.2021    2104    user5300    45    

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

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

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

17.08.2021    2282    maraty    10    

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

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

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

03.03.2017    82378    V.Stavinsky    22    

Изменение расшифровки макета СКД до компоновки

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

Это не про работу с данными расшифровки. Это про изменение расшифровок полей ДО того, как СКД выполнилась. Быстрый способ сделать нужные расшифровки.

12.07.2021    2448    Yashazz    6    

Префиксация объектов - полезный типовой функционал БСП

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

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

21.06.2021    4891    quazare    4    

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

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

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

20.05.2015    31877    dj_serega    18    

Особенности online-обмена между старыми и новыми типовыми

Перенос данных из 1C8 в 1C8 БСП (Библиотека стандартных подсистем) v8 8.3.14 8.3.6 8.3.8 КА1 КД ДО Бесплатно (free)

Столкнулся с неприятной особенностью потери части данных при обмене УСО (УПП) - ДО.

01.06.2021    3051    echo77    7    

Обзор полезных методов БСП 3.1.4. Часть 2

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

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

27.04.2021    16524    rayastar    7    

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

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

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

13.01.2016    25287    unichkin    13    

Чтение CSV (быстрое)

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

Почему то из гугла до сих пор нет ссылки на код процедуры быстро читающей csv... Загрузка из файла CSV c помощью ADODB.Connection провайдера Microsoft.Jet.OLEDB.

31.03.2021    1908    kuzyara    4    

Обзор полезных методов БСП 3.1.4

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

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

25.03.2021    42225    rayastar    51    

Печать макета MS Word в любом документе с помощью БСП

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

В данной статье рассмотрим типовой функционал вывода на печать макетов печатных форм MS Word (*.docx) для любого документа конфигурации, основанной на библиотеке стандартных подсистем. Вариант клиент-серверный.

23.02.2021    6584    quazare    3    

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

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

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

04.08.2014    19569    Трактор    5    

Базовое понимание внедрения механизма печати в любом документе конфигурации на БСП

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

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

17.02.2021    9168    quazare    20    

Последний раз про срез последних (на каждую дату в запросе)

Инструментарий разработчика Консоль запросов Универсальные функции Практика программирования v8 v8::Запросы Бесплатно (free)

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

15.02.2021    11362    randomus    47    

Перенос/копирование и установка отбора/фильтра/периода при интерактивном переключении или смене варианта отчета/СКД в БСП 3.1 (1C ERP, УТ, БП, ...)

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

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

18.01.2021    1488    SizovE    4    

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

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

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

24.05.2012    34753    shakmaev    47    

Генерация штрихкодов с помощью БСП для программистов

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

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

09.01.2021    10504    quazare    21    

Асинхронное выполнение длительных операций

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

Демонстрация использования функционала БСП для выполнения длительных операций. Механизм может быть полезен, например, при загрузке/выгрузке больших объемов данных.

28.12.2020    2349    prog_mayskiyse    8    

Ускоряем медленный/долгий и тормозной стандартный поиск по динамическому списку, настраиваем его под себя

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

Пользователи привыкли искать на форме списка, но, вбивая в поиск некорректные данные, могут завесить всю систему, а если еще искать нужно по НЕ полям списка, то решение только в своём поиске - все это решим в публикации с открытым кодом.

14.12.2020    23909    SizovE    2    

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

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

Очень много реквизитов (настроечные опции, параметры) у справочника или документа, и их все необходимо разместить на управляемую форму - лень! Хочется - добавил в метаданные и всё! В публикации отличное, простое и олдскульное решение с открытым кодом, научимся работать с ДанныеФормыДерево, ДеревомЗначений, сделаем быстрый поиск, создадим универсальный инструмент.

11.12.2020    1070    SizovE    6    

Метаданные и их идентификаторы

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

Идентификаторы (GUID'ы) метаданных конфигурации. Немного о том, как их получить.

05.12.2020    12804    YPermitin    27    

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

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

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

30.11.2020    6470    SizovE    4    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

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

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    1316    SizovE    4    

Сохранение настроек

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

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

22.11.2020    4503    the1    8    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

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

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    2332    SizovE    2    

Дополнительные реквизиты формы (простой вариант взаимодействия)

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

Упрощаем взаимодействия с дополнительными реквизитами на форме с помощью фиксированного соответствия.

14.11.2020    2355    samvani    0    

Сохранение настроенного запроса набора данных СКД

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

Как сохранить запрос набора данных СКД в том виде, каким он будет выполнен системой для открытия в консоли запросов с диска ИТС.

09.11.2020    1744    Serge R    0    

Запуск почти любых процедур и функции конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 2]

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

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

30.10.2020    7657    quazare    5    

Программное создание характеристик с дополнительными реквизитами в УНФ 1.6

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

В статье опишу порядок создания объектов и вариант их заполнения.

29.10.2020    2120    malikov_pro    7    

Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

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

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

29.10.2020    11174    quazare    34    

Простой пример разработки регулярного обмена с использованием БСП на примере ERP 2.4 и УПП 1.3

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

Данный вариант подойдет тем, кто хочет настроить "свой" регулярный обмен с добавлением "своих" планов обмена с использованием правил обмена на КД 2.1.

27.10.2020    7365    байт    30