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

Публикация № 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    80661    Serginio    113    

Изменение функционала получения списка пользователей

БСП (Библиотека стандартных подсистем) Адаптация типовых решений v8 1cv8.cf 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

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

сегодня в 09:20    67    creatermc    0    

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

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

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

01.06.2021    1284    echo77    7    

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

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

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

27.04.2021    8459    rayastar    6    

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

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

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

28.12.2020    5882    comol    31    

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

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

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

31.03.2021    833    kuzyara    4    

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

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

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

25.03.2021    21748    rayastar    49    

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

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

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

23.02.2021    4644    quazare    2    

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

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

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

26.02.2016    42521    unichkin    47    

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

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

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

17.02.2021    4350    quazare    17    

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

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

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

15.02.2021    6155    randomus    47    

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

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

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

18.01.2021    800    SizovE    4    

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

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

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

19.02.2018    48837    ildarovich    47    

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

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

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

09.01.2021    7018    quazare    16    

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

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

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

28.12.2020    1955    prog_mayskiyse    7    

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

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

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

14.12.2020    12782    SizovE    2    

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

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

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

03.03.2017    76815    V.Stavinsky    22    

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

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

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

11.12.2020    860    SizovE    6    

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

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

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

05.12.2020    7701    YPermitin    27    

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

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

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

30.11.2020    3976    SizovE    3    

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

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

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

20.05.2015    31205    dj_serega    18    

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

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

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

24.11.2020    913    SizovE    4    

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

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

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

22.11.2020    3278    the1    8    

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

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

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

17.11.2020    1886    SizovE    2    

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

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

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

13.01.2016    25016    unichkin    13    

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

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

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

14.11.2020    1775    samvani    0    

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

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

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

09.11.2020    1544    Serge R    0    

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

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

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

30.10.2020    6500    quazare    5    

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

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

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

04.08.2014    19394    Трактор    5    

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

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

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

29.10.2020    6760    quazare    29    

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

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

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

27.10.2020    5219    байт    13    

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

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

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

24.05.2012    34563    shakmaev    47    

Отпускной период (период основного отпуска) - как его узнать

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

Пришла мне задача где нужно получить отпускной период, на просторах сети решения я не нашел. Решил поделиться с вами своим решением.

26.10.2020    690    Danila7Zz    2    

Вычислить РАЗНОСТЬДАТ в рабочих днях

Практика программирования БСП (Библиотека стандартных подсистем) v8::Запросы v8::СКД ERP2 БП3.0 УТ11 ЗУП3.x Бесплатно (free)

Вычисление количества рабочих днях между двумя датами в запросе.

20.10.2020    3337    antonivan    17    

Произвольные колонтитулы и повтор шапки таблицы в табличном документе (функция)

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

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

07.10.2020    3460    ellavs    2    

Разработка функционала обмена с несколькими внешними точками

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

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

21.09.2020    1162    Sergey1CSpb    2    

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

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

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

14.09.2020    11673    quazare    9    

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

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

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

11.09.2020    1620    arr    4    

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

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

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

30.08.2020    14858    quazare    34    

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

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

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

07.08.2020    8908    YPermitin    22    

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

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

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

05.08.2020    2052    Yashazz    0    

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

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

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

05.08.2020    2740    ER34    2    

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

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

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

10.07.2020    5618    quazare    5    

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

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

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

09.07.2020    3719    Yashazz    7    

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

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

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

05.07.2020    11493    quazare    37    

Команда "Вывести список" для динамического списка. Программное выполнение (вариант)

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

Делаем свою кнопку вместо "Вывести список" из пункта "ещё" динамического списка.

11.06.2020    4059    DanDy    61    

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

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

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

05.06.2020    4788    AKnyazkov    4