Подмена метаданных при работе внешней обработки "Заполнение связанных объектов"

1. MaCCapAkIII 07.08.19 20:55 Сейчас в теме
Есть внешняя обработка создания документа "Установка цен" на основании "Перемещения товаров" для УТ 11.
После обновления конфигурации до версии 11.2.3.95 при попытке запустить обработку из формы списка документов "Перемещение товаров" стала появляться ошибка:
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиПовтИсп.Модуль(84)}: Поле объекта не обнаружено (ОсновнаяФормаОбъекта)
		Результат.ЭтоФормаОбъекта = (РодительМетаданные.ОсновнаяФормаОбъекта = ФормаМетаданные);

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

из формы списка документов "Перемещение товаров" передается странная форма "РегистрСведений.ДанныеВнутреннихДокументов.Форма.ФормаСписка", для которого дальнейшие действия обработки не действуют. И действительно, в подсистеме склад есть команда "Перемещение товаров", которая выводит форму списка указанного регистра. То есть из формы документа "Перемещение товаров" все создается нормально (при проверке получается ФормаОбъекта, которой у регистра нет, и родителем идет Перемещение товаров), а из формы списка никак.

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

то есть добавил искусственную подмену имени формы на нужную мне для работы. Но это изменение конфигурации. Можно было бы сделать в расширении, но старая версия платформы, РИБ и прочее. Подскажите пожалуйста можно ли это как-то обыграть во внешней обработке без изменения конфигурации? Как подменить метаданные при проверке и надо ли? Может слишком заморочился?
Прикрепленные файлы:
По теме из базы знаний
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот