Хитрый трюк в расширении для корректировки возвращаемого формой значения не прошел. УТ 11

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

Типовой код по подбору товара в поступление возвращал структуру:

Поэтому нужно было возвращать сумму в этой структуре.

Я попробовал получить возвращаемое значение в процедуре «Перед закрытием» формы, но не нашел его в свойствах формы:

Можно было, конечно, модифицировать процедуру ОК путем замены ее целиком в расширении, но решил поискать обходной маневр. Мне показалось что переместить локальную переменную в глобальные с помощью расширения — это элегантный способ влезть внутрь кода, не замещая его целиком:

&НаКлиенте
Перем МассивСтруктур;

&НаКлиенте
Процедура дор_ПередЗакрытиемПосле(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
   
//Вставить содержимое обработчика
   
МассивСтруктур.Вставить(«Сумма», дор_Сумма);
КонецПроцедуры

К сожалению не сработало. К моменту события «Перед закрытием после» переменная МассивСтруктур уже принимала значение Неопределено.

Я попробовал добавить сумму в реквизиты:

Но не сработало, массив не может быть реквизитом формы:

В итоге сделал замену тексты команды целиком, увы:

&НаКлиенте
&Вместо («ОК»)
Процедура дор_ОК(Команда)
   
//Осипов — скопировано из модуля

    Отказ = Ложь;
   
ОчиститьСообщения();

    Если КоличествоУпаковок = 0 Тогда
       
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр(«ru = ‘Не заполнено количество'»),,«КоличествоУпаковок»,,Отказ);
    КонецЕсли;

    Если Отказ Тогда
        Возврат;
    КонецЕсли;

    МассивСтруктур = Новый Массив;

    НоваяСтрока = Новый Структура;
   
НоваяСтрока.Вставить(«Номенклатура»,          Номенклатура);
   
НоваяСтрока.Вставить(«Характеристика»,        Характеристика);
   
НоваяСтрока.Вставить(«ВидЦеныПоставщика»,     ВидЦеныПоставщика);
   
НоваяСтрока.Вставить(«Цена»,                  Цена);

    НоваяСтрока.Вставить(«Упаковка»,              Упаковка);
   
НоваяСтрока.Вставить(«КоличествоУпаковок»,    КоличествоУпаковок);
   
НоваяСтрока.Вставить(«Склад»,                 Склад);

    Если ВариантПредоставления = 1 Тогда
       
НоваяСтрока.Вставить(«ПроцентРучнойСкидки», ПроцентРучнойСкидкиНаценки);
    Иначе
       
НоваяСтрока.Вставить(«ПроцентРучнойСкидки», —ПроцентРучнойСкидкиНаценки);
    КонецЕсли;

    МассивСтруктур.Добавить(НоваяСтрока);

    НоваяСтрока.Вставить(«Сумма»,                   дор_Сумма); //Осипов добавил эту строку только
   
Закрыть(МассивСтруктур);
КонецПроцедуры

Обратился с вопросом на Мисту. Там порекомендовали заменять обработку оповещения о закрытии формы:

&НаКлиенте
Перем ОписаниеЗакрытия;

&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)

    ОписаниеЗакрытия = ОписаниеОповещенияОЗакрытии;
   
ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения(«ЗакрытиеФормы»,ЭтотОбъект);

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

&НаКлиенте
Процедура ЗакрытиеФормы(Результат,ДопПараметры) Экспорт

    Если ТипЗнч(Результат)=Тип(«Структура») Тогда
       
Результат.Вставить(«Дополнение»,«Есть!»);
    КонецЕсли;

    Если ОписаниеЗакрытия<>Неопределено Тогда
        Выполнить(
«ОписаниеЗакрытия.Модуль.»+ОписаниеЗакрытия.ИмяПроцедуры+«(Результат,ДопПараметры);»);
    КонецЕсли;

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

Учитывая, что выше уже я сталкивался с тем, что локальная переменная при закрытии равна Неопределено, код может и не работать, хотя автор кода утверждает, что у него работает. На мой взгляд, вместо локальной переменной лучше использовать параметры оповещения о закрытии, так будет лучше и компактнее.

Время факт: 0,8 час.