ЗарегистрироватьОбработку (БСП)

Автор: 1С
ОбщийМодуль.ДополнительныеОтчетыИОбработки
БСП

Зарегистрировать обработку. Для внутреннего использования.

// Для внутреннего использования.
Функция ЗарегистрироватьОбработку(Знач Объект, Знач ПараметрыРегистрации) Экспорт
	
	ВидДополнительнаяОбработка = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
	ВидДополнительныйОтчет     = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
	ВидОтчет                   = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет;
	
	// Получает файл обработки из временного хранилища, пытается создать объект
	// обработки (внешнего отчета) и получает информацию из объекта внешней обработки (отчета).
	
	Если ПараметрыРегистрации.ОтключатьКонфликтующие Тогда
		Для Каждого ЭлементСписка Из ПараметрыРегистрации.Конфликтующие Цикл
			КонфликтующийОбъект = ЭлементСписка.Значение.ПолучитьОбъект();
			ОтключитьКонфликтующую(КонфликтующийОбъект);
			КонфликтующийОбъект.Записать();
		КонецЦикла;
	ИначеЕсли ПараметрыРегистрации.ОтключатьПубликацию Тогда
		ОтключитьКонфликтующую(Объект);
	КонецЕсли;
	
	Результат = Новый Структура("ИмяОбъекта, СтароеИмяОбъекта, Успех, ИмяОбъектаЗанято, Конфликтующие, ТекстОшибки, КраткоеПредставлениеОшибки");
	Результат.ИмяОбъектаЗанято = Ложь;
	Результат.Успех = Ложь;
	Если Объект.ЭтоНовый() Тогда
		Результат.СтароеИмяОбъекта = Объект.ИмяОбъекта;
	Иначе
		Результат.СтароеИмяОбъекта = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "ИмяОбъекта");
	КонецЕсли;
	
	РегистрационныеДанные = ПолучитьРегистрационныеДанные(Объект, ПараметрыРегистрации, Результат);
	Если РегистрационныеДанные = Неопределено
		Или РегистрационныеДанные.Количество() = 0
		Или ЗначениеЗаполнено(Результат.ТекстОшибки)
		Или ЗначениеЗаполнено(Результат.КраткоеПредставлениеОшибки) Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма
		И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		Результат.ТекстОшибки = НСтр("ru = 'Работа с печатными формами не поддерживается.'");
		Возврат Результат;
	КонецЕсли;
	
	// Если отчет публикуется, то необходим контроль уникальности имени объекта, 
	// под которым дополнительный отчет регистрируется в системе.
	Если Объект.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется Тогда
		// Проверка имени
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаСправочника.Ссылка КАК Ссылка,
		|	ТаблицаСправочника.Представление КАК Представление
		|ИЗ
		|	Справочник.ДополнительныеОтчетыИОбработки КАК ТаблицаСправочника
		|ГДЕ
		|	ТаблицаСправочника.ИмяОбъекта = &ИмяОбъекта
		|	И ТаблицаСправочника.Вид В(&ВидыДополнительныхОтчетовИОбработок)
		|	И ТаблицаСправочника.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)
		|	И ТаблицаСправочника.ПометкаУдаления = ЛОЖЬ
		|	И ТаблицаСправочника.Ссылка <> &Ссылка";
		
		ВидыДополнительныхОтчетовИОбработок = Новый Массив;
		ВидыДополнительныхОтчетовИОбработок.Добавить(ВидДополнительныйОтчет);
		ВидыДополнительныхОтчетовИОбработок.Добавить(ВидОтчет);
		
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ИмяОбъекта",     Результат.ИмяОбъекта);
		Запрос.УстановитьПараметр("ВидыДополнительныхОтчетовИОбработок", ВидыДополнительныхОтчетовИОбработок);
		Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
		
		Если Не ПараметрыРегистрации.ЭтоОтчет Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТаблицаСправочника.Вид", "НЕ ТаблицаСправочника.Вид"); // не локализуется
		КонецЕсли;
		
		Запрос.Текст = ТекстЗапроса;
		
		УстановитьПривилегированныйРежим(Истина);
		Конфликтующие = Запрос.Выполнить().Выгрузить();
		УстановитьПривилегированныйРежим(Ложь);
		
		Если Конфликтующие.Количество() > 0 Тогда
			Результат.ИмяОбъектаЗанято = Истина;
			Результат.Конфликтующие = Новый СписокЗначений;
			Для Каждого СтрокаТаблицы Из Конфликтующие Цикл
				Результат.Конфликтующие.Добавить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Представление);
			КонецЦикла;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	
	Если Не РегистрационныеДанные.БезопасныйРежим И Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
		Результат.ТекстОшибки = НСтр("ru = 'Для подключения обработки, запускаемой в небезопасном режиме, требуются административные права.'");
		Возврат Результат;
	КонецЕсли;
	
	ЭтоВнешнийОтчет = РегистрационныеДанные.Вид = ВидДополнительныйОтчет ИЛИ РегистрационныеДанные.Вид = ВидОтчет;
	Если НЕ Объект.ЭтоНовый() И РегистрационныеДанные.Вид <> Объект.Вид Тогда
		Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Вид загружаемого объекта (%1) не соответствует текущему (%2).
				|Для загрузки нового объекта нажмите ""Создать"".'"),
			Строка(РегистрационныеДанные.Вид),
			Строка(Объект.Вид));
		Возврат Результат;
	ИначеЕсли ПараметрыРегистрации.ЭтоОтчет <> ЭтоВнешнийОтчет Тогда
		Результат.ТекстОшибки = НСтр("ru = 'Вид обработки, указанный в сведениях о внешней обработке, не соответствует ее расширению.'");
		Возврат Результат;
	КонецЕсли;
	
	Объект.Наименование    = РегистрационныеДанные.Наименование;
	Объект.Версия          = РегистрационныеДанные.Версия;
	Объект.РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3;
	Если РегистрационныеДанные.Свойство("ВерсияБСП") 
		И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РегистрационныеДанные.ВерсияБСП, "2.2.2.0") > 0 Тогда
		Объект.РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_2_2;
	КонецЕсли;
	
	Если РегистрационныеДанные.Свойство("БезопасныйРежим") Тогда
		Объект.БезопасныйРежим = РегистрационныеДанные.БезопасныйРежим;
	КонецЕсли;
	
	Объект.Информация      = РегистрационныеДанные.Информация;
	Объект.ИмяФайла        = ПараметрыРегистрации.ИмяФайла;
	Объект.ИмяОбъекта      = Результат.ИмяОбъекта;
	
	Объект.ИспользуетХранилищеВариантов = Ложь;
	Если ЭтоВнешнийОтчет Тогда
		Объект.ИспользуетХранилищеВариантов = (РегистрационныеДанные.ХранилищеВариантов = "ХранилищеВариантовОтчетов"
			ИЛИ (Метаданные.ХранилищеВариантовОтчетов <> Неопределено
				И Метаданные.ХранилищеВариантовОтчетов.Имя = "ХранилищеВариантовОтчетов"));
		РегистрационныеДанные.Свойство("ОпределитьНастройкиФормы", Объект.ТеснаяИнтеграцияСФормойОтчета);
	КонецЕсли;
	
	// Загружена другая обработка (изменилось имя объекта или вид обработки).
	Если Объект.ЭтоНовый() ИЛИ Объект.ИмяОбъекта <> Результат.ИмяОбъекта ИЛИ Объект.Вид <> РегистрационныеДанные.Вид Тогда
		Объект.Назначение.Очистить();
		Объект.Разделы.Очистить();
		Объект.Вид = РегистрационныеДанные.Вид;
	КонецЕсли;
	
	// Если не заполнено назначение - устанавливаем назначение из обработки.
	Если Объект.Назначение.Количество() = 0 И НЕ ЭтоВнешнийОтчет Тогда
		
		Если РегистрационныеДанные.Свойство("Назначение") Тогда
			ТаблицаОбъектовМетаданных = ПодключенныеОбъектыМетаданных(Объект.Вид);
			
			Для Каждого ПолноеИмяОбъектаМетаданных Из РегистрационныеДанные.Назначение Цикл
				ПозицияТочки = СтрНайти(ПолноеИмяОбъектаМетаданных, ".");
				Если Сред(ПолноеИмяОбъектаМетаданных, ПозицияТочки + 1) = "*" Тогда // Например [Справочник.*].
					Поиск = Новый Структура("Вид", Лев(ПолноеИмяОбъектаМетаданных, ПозицияТочки - 1));
				Иначе
					Поиск = Новый Структура("ПолноеИмя", ПолноеИмяОбъектаМетаданных);
				КонецЕсли;
				
				Найденные = ТаблицаОбъектовМетаданных.НайтиСтроки(Поиск);
				Для Каждого СтрокаТаблицы Из Найденные Цикл
					СтрокаНазначение = Объект.Назначение.Добавить();
					СтрокаНазначение.ОбъектНазначения = СтрокаТаблицы.Ссылка;
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
		
		Объект.Назначение.Свернуть("ОбъектНазначения", "");
		
	КонецЕсли;
	
	Объект.Команды.Очистить();
	
	// Инициализация команд
	Для Каждого КомандаОписание Из РегистрационныеДанные.Команды Цикл
		
		Если НЕ ЗначениеЗаполнено(КомандаОписание.ВариантЗапуска) Тогда
			ОбщегоНазначения.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Для команды ""%1"" не определен способ запуска.'"), КомандаОписание.Представление));
		КонецЕсли;
		Команда = Объект.Команды.Добавить();
		ЗаполнитьЗначенияСвойств(Команда, КомандаОписание);
		
	КонецЦикла;
	
	// Чтение разрешений, запрашиваемых дополнительной обработкой.
	Объект.Разрешения.Очистить();
	Разрешения = Неопределено;
	Если РегистрационныеДанные.Свойство("Разрешения", Разрешения) Тогда
		
		Для Каждого Разрешение Из Разрешения Цикл
			
			ТипXDTO = Разрешение.Тип();
			
			СтрокаТЧ = Объект.Разрешения.Добавить();
			СтрокаТЧ.ВидРазрешения = ТипXDTO.Имя;
			
			Параметры = Новый Структура();
			
			Для Каждого СвойствоXDTO Из ТипXDTO.Свойства Цикл
				
				Контейнер = Разрешение.ПолучитьXDTO(СвойствоXDTO.Имя);
				
				Если Контейнер <> Неопределено Тогда
					Параметры.Вставить(СвойствоXDTO.Имя, Контейнер.Значение);
				Иначе
					Параметры.Вставить(СвойствоXDTO.Имя);
				КонецЕсли;
				
			КонецЦикла;
			
			СтрокаТЧ.Параметры = Новый ХранилищеЗначения(Параметры);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Объект.Ответственный = Пользователи.ТекущийПользователь();
	Результат.Успех = Истина;
	Возврат Результат;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ЗарегистрироватьСведенияОСогласииНаОбработкуПерсональныхДанных (БСП)

ЗарегистрироватьУчетныеЗаписиЭлектроннойПочтыКОбработкеДляПереходаНаНовуюВерсию (БСП)

Зарегистрироваться (БСП)

ИзмененияЗарегистрированы (БСП)

ЗарегистрироватьДанныеДляНачальнойВыгрузки (БСП)

ЗарегистрироватьТолькоСправочникиДляНачальнойВыгрузки (БСП)

ЗарегистрироватьТолькоСправочникиДляНачальнойВыгрузкиВФоне (БСП)

ЗарегистрироватьОшибкуПроведенияДокумента (БСП)

ЗарегистрироватьОшибкуЗаписиОбъекта (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз