Хитрый трюк в расширении для корректировки возвращаемого формой значения не прошел. УТ 11
Была сделана доработка, которая позволяла вводить сумму товара, причем сумма могла быть не равной произведению цены и количества, например:
Типовой код по подбору товара в поступление возвращал структуру:
Поэтому нужно было возвращать сумму в этой структуре.
Я попробовал получить возвращаемое значение в процедуре «Перед закрытием» формы, но не нашел его в свойствах формы:
Можно было, конечно, модифицировать процедуру ОК путем замены ее целиком в расширении, но решил поискать обходной маневр. Мне показалось что переместить локальную переменную в глобальные с помощью расширения — это элегантный способ влезть внутрь кода, не замещая его целиком:
&НаКлиенте
Перем МассивСтруктур;
&НаКлиенте
Процедура дор_ПередЗакрытиемПосле(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
//Вставить содержимое обработчика
МассивСтруктур.Вставить(«Сумма», дор_Сумма);
КонецПроцедуры
К сожалению не сработало. К моменту события «Перед закрытием после» переменная МассивСтруктур уже принимала значение Неопределено.
Я попробовал добавить сумму в реквизиты:
Но не сработало, массив не может быть реквизитом формы:
В итоге сделал замену тексты команды целиком, увы:
&НаКлиенте
&Вместо («ОК»)
Процедура дор_ОК(Команда)
//Осипов — скопировано из модуля
Отказ = Ложь;
ОчиститьСообщения();
Если КоличествоУпаковок = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр(«ru = ‘Не заполнено количество'»),,«КоличествоУпаковок»,,Отказ);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
МассивСтруктур = Новый Массив;
НоваяСтрока = Новый Структура;
НоваяСтрока.Вставить(«Номенклатура», Номенклатура);
НоваяСтрока.Вставить(«Характеристика», Характеристика);
НоваяСтрока.Вставить(«ВидЦеныПоставщика», ВидЦеныПоставщика);
НоваяСтрока.Вставить(«Цена», Цена);
НоваяСтрока.Вставить(«Упаковка», Упаковка);
НоваяСтрока.Вставить(«КоличествоУпаковок», КоличествоУпаковок);
НоваяСтрока.Вставить(«Склад», Склад);
Если ВариантПредоставления = 1 Тогда
НоваяСтрока.Вставить(«ПроцентРучнойСкидки», ПроцентРучнойСкидкиНаценки);
Иначе
НоваяСтрока.Вставить(«ПроцентРучнойСкидки», —ПроцентРучнойСкидкиНаценки);
КонецЕсли;
МассивСтруктур.Добавить(НоваяСтрока);
НоваяСтрока.Вставить(«Сумма», дор_Сумма); //Осипов добавил эту строку только
Закрыть(МассивСтруктур);
КонецПроцедуры
Обратился с вопросом на Мисту. Там порекомендовали заменять обработку оповещения о закрытии формы:
&НаКлиенте
Перем ОписаниеЗакрытия;
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
ОписаниеЗакрытия = ОписаниеОповещенияОЗакрытии;
ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения(«ЗакрытиеФормы»,ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытиеФормы(Результат,ДопПараметры) Экспорт
Если ТипЗнч(Результат)=Тип(«Структура») Тогда
Результат.Вставить(«Дополнение»,«Есть!»);
КонецЕсли;
Если ОписаниеЗакрытия<>Неопределено Тогда
Выполнить(«ОписаниеЗакрытия.Модуль.»+ОписаниеЗакрытия.ИмяПроцедуры+«(Результат,ДопПараметры);»);
КонецЕсли;
КонецПроцедуры
Учитывая, что выше уже я сталкивался с тем, что локальная переменная при закрытии равна Неопределено, код может и не работать, хотя автор кода утверждает, что у него работает. На мой взгляд, вместо локальной переменной лучше использовать параметры оповещения о закрытии, так будет лучше и компактнее.
Время факт: 0,8 час.
К сожалению не сработало. К моменту события «Перед закрытием после» переменная МассивСтруктур уже принимала значение Неопределено.
А судя по коду она вообще всегда была Неопределено. Вы путаете локальные переменные метода и переменные-члены объекта.
не путаю. Расширение работает в области действия модуля. Можно проверить отладчиком, что это одна и та же переменная.
Скрины отладчика приведите. Расширение работает в области действия модуля основной конфигурации, обратное неверно.
смотря как расширение расширяет форму. Если объявленная в расширении переменная становится частью контекста формы, все должно работать
Проверять не буду, некогда. Хотите — проверьте, потом доложите.
Учитывая, что выше уже я сталкивался с тем, что локальная переменная при закрытии равна Неопределено, код может и не работать
Вообще несвязанные вещи
Почему не связанные?
Потому что в нее пишется и читается в одной области расширения.
Это член объекта форма и к нему можно нормально обращаться пока жива форма как объект
ничего не понял.