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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 8

  1. Zuko:

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

    А судя по коду она вообще всегда была Неопределено. Вы путаете локальные переменные метода и переменные-члены объекта.

    • не путаю. Расширение работает в области действия модуля. Можно проверить отладчиком, что это одна и та же переменная.

      • Zuko:

        Скрины отладчика приведите. Расширение работает в области действия модуля основной конфигурации, обратное неверно.

        • смотря как расширение расширяет форму. Если объявленная в расширении переменная становится частью контекста формы, все должно работать
          Проверять не буду, некогда. Хотите — проверьте, потом доложите.

  2. Zuko:

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

    Вообще несвязанные вещи

Добавить комментарий для fixin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *