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