Программное добавление внешних отчетов и обработок для Обновлятора

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

Код для обновлятора — важно копировать скрипт на закладку OneScript:

#use "updater1c"

// ****************************************************************************
// Переменные модуля
// ****************************************************************************

Перем errors;		// Признак того, что при выполнении скрипта были ошибки.
Перем updater;		// Обновлятор, через который мы получаем информацию о базе,
					// а также вызываем различные функции обновлятора.
Перем connector;	// Коннектор для подключения к базе.
Перем v8;			// Само подключение к базе через коннектор.

// ****************************************************************************
// Ваш код для выполнения обновлятором
// ****************************************************************************

Процедура Главная()

	// Обязательно прочтите статью про COM-объекты
	// http://helpme1s.ru/ispolzovanie-com-obektov-v-onescript



	//НАЧАЛО СКРИПТА ПО ДОБАВЛЕНИЮ ВНЕШНЕГО ОТЧЕТА/ОБРАБОТКИ
	ИмяФайла = "m:\fixin\1s8UsefulTools\_Инструментарий\Обработка объектов\1cAdmin_9_4.epf"; //Укажите имя файла
	
	//Остальной код не меняется...
	
	Ф = v8.NewObject("Файл", ИмяФайла);
	РасширениеФайла = ВРег(Прав(ИмяФайла, 3));    

	
	ДД = v8.NewObject("ДвоичныеДанные", ИмяФайла);
	ХранилищеФайла = v8.NewObject("ХранилищеЗначения", ДД);            
	

	//Параметры структуры взяты из ДополнительныеОтчетыИОбработки.ФормаЭлемента
	ПараметрыРегистрации = v8.NewObject("Структура", "ИмяФайла, ОтключатьПубликацию, ОтключатьКонфликтующие, ЭтоОтчет", Ф.Имя, ложь, ложь, ложь);
	Если РасширениеФайла = "ERF" Тогда
		ПараметрыРегистрации.ЭтоОтчет = Истина;
	ИначеЕсли РасширениеФайла = "EPF" Тогда
		ПараметрыРегистрации.ЭтоОтчет = Ложь;
	Иначе
		ВызватьИсключение "Неизвестное расширение файла: " + РасширениеФайла;
	КонецЕсли;
	ПараметрыРегистрации.Вставить("АдресДанныхОбработки", v8.ПоместитьВоВременноеХранилище(ДД));
	
	//Служебный элемент для получения данных
	ООТест = v8.Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();                         
	РезультатРегистрации = v8.ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(ООТест, ПараметрыРегистрации);          
	Если НЕ РезультатРегистрации.Успех Тогда   
		ВызватьИсключение "Не удалось зарегистрировать обработку из файла: " + РезультатРегистрации.ТекстОшибки;
	КонецЕсли;
	ИмяОбъекта = РезультатРегистрации.ИмяОбъекта;                              
	З = v8.NewObject("Запрос", 
	"ВЫБРАТЬ
	|	Т.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ДополнительныеОтчетыИОбработки КАК Т
	|ГДЕ
	|	Т.ИмяОбъекта = &ИмяОбъекта
	|	И Т.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)");
	З.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта);
	Выборка = З.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		ОО = Выборка.Ссылка.ПолучитьОбъект();
	Иначе             
		ОО = v8.Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();                         
	КонецЕсли;

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

	//КОНЕЦ СКРИПТА ПО ДОБАВЛЕНИЮ ВНЕШНЕГО ОТЧЕТА/ОБРАБОТКИ




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

// ****************************************************************************
// Служебные процедуры
// ****************************************************************************

Процедура ПриНачалеРаботы()

	errors = Ложь;

	updater = Новый Updater1C;

	// Если в скрипте не планируется использовать
	// подключение к базе - просто закомментируйте
	// две нижние строки.
	connector = updater.CreateConnector();
	v8 = updater.BaseConnectNew(connector);
	
КонецПроцедуры

Процедура ПриОкончанииРаботы()

	Если v8 <> Неопределено Тогда
		Попытка
			ОсвободитьОбъект(v8);
			v8 = Неопределено;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Если connector <> Неопределено Тогда
		Попытка
			ОсвободитьОбъект(connector);
			connector = Неопределено;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Если updater <> Неопределено Тогда
		Попытка
			ОсвободитьОбъект(updater);
			updater = Неопределено;
		Исключение
		КонецПопытки;
	КонецЕсли;

	Если errors Тогда
		ЗавершитьРаботу(1);
	КонецЕсли;

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

// ****************************************************************************
// Инициализация и запуск скрипта
// ****************************************************************************

ПриНачалеРаботы();

Попытка	
	Главная();
	updater.КодПользователяВыполнился();
Исключение
	errors = Истина;
	Сообщить("" + ОписаниеОшибки() + "");
КонецПопытки;

ПриОкончанииРаботы();

Код на языке 1с:

	ИмяФайла = "m:\fixin\1s8UsefulTools\_Инструментарий\Обработка объектов\1cAdmin_9_4.epf";
	Ф = Новый Файл(ИмяФайла);
	РасширениеФайла = ВРег(Прав(ИмяФайла, 3));    

	
	ДД = Новый ДвоичныеДанные(ИмяФайла);
	ХранилищеФайла = Новый ХранилищеЗначения(ДД);            
	

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

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

При отладке использовался стек процедур:

К счастью, большинство функций реализовано в функции ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку.

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

Среда: 3.0.150.29 БСП: 3.1.9.302

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *