ERP 2.4.10.94 Функциональная опция не найдена

1. PerlAmutor 129 26.01.20 18:18 Сейчас в теме
Обнаружил ошибку в типовой конфигурации ERP. Проверено на 2.4.7 и 2.4.10.94

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

{ОбщийМодуль.РеглУчетПроведениеСервер.Модуль(1775)}: Ошибка при вызове метода контекста (ПолучитьФункциональнуюОпцию)
			ЗначениеПараметра = ПолучитьФункциональнуюОпцию(ПараметрДанных.Имя);
по причине:
Функциональная опция не найдена


Происходит это из-за этого кода в общем модуле РеглУчетПроведениеСервер:

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


И из-за реализации текста запроса в модуле менеджера документа Регламентированная операция:

//Функция ТекстОтраженияВРеглУчете() Экспорт
	|ИЗ
	|	Документ.РегламентнаяОперация КАК Операция
	|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	|		КосвенныеРасходы КАК КосвенныеРасходы
	|	ПО
	|		Операция.Ссылка = КосвенныеРасходы.Регистратор
	|ГДЕ
	|	Операция.Ссылка = &Ссылка
	|	И Операция.ТипОперации = ЗНАЧЕНИЕ(Перечисление.ТипыРегламентныхОпераций.СписаниеКосвенныхРасходов)
	|	И (КосвенныеРасходы.СуммаРеглОСНО <> 0 
	|		ИЛИ КосвенныеРасходы.ПостояннаяРазницаОСНО <> 0
	|		ИЛИ КосвенныеРасходы.ВременнаяРазницаОСНО <> 0)
Показать


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

Функция ЗапросДанныхПараметры(ДокументИмя, ЭтоОбъектРасчетов) Экспорт
	
	Возврат РеглУчетВыборкиСерверПовтИсп.ЗапросДанных(ДокументИмя, ЭтоОбъектРасчетов).НайтиПараметры();
	
КонецФункции


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

Если разобраться почему он вообще не устанавливается, то придем к выводу о том, что код отражения ищет ссылку на документ в регистре сведений ОтражениеДокументовВРеглУчете.

Для эксперимента можно поступить следующим образом. Оставить галочку "Ручная корректировка" у проводок документа. Перейти в форму записей регистра ОтражениеДокументовВРеглУчете и сменить статус на "К отражению". Возвращаемся в форму проводок, снимаем галочку, соглашаемся с переотражением.

Отладчиком видим, что переменная СтруктураПараметров дополнилась ключом "Ссылка". И в этом блоке:

	Для Каждого ПараметрДанных Из ПараметрыЗапроса Цикл
		ЗначениеПараметра = Неопределено;
		Если Не ЗначенияПараметровДляЗаполнения.Свойство(ПараметрДанных.Имя, ЗначениеПараметра) Тогда
			ЗначениеПараметра = ПолучитьФункциональнуюОпцию(ПараметрДанных.Имя);
		КонецЕсли;
		ЗапросДанных.УстановитьПараметр(ПараметрДанных.Имя, ЗначениеПараметра);
	КонецЦикла;
Показать


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

Почему типовой код отражения требует статуса документа "К Отражению" в регистре сведений, если мы хотим его переотразить ничего не меняя в документе, и почему не формирует проводки заново тем же механизмом, что и при проведении - загадка.
fxmike; MaiorovYury; +2 Ответить
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

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