Закупочная цена в списке цен подбора

Клиент поставил задачу — вывести цену последнего прихода в список цен, который показывается по ПКМ в списке подбора товара в чек ККМ (или расходную накладную):

Отладчиком нашел, куда переходит программа по нажатию кнопки «Цены»:

Спустился чуть ниже по стеку вызовов:

Нашел, какая форма вызывается и показывает цены: Обработка.ПодборТоваровВДокументПродажи.Форма.ЦеныНоменклатуры.

Добавил эту форму в расширение.

В самой форме добавил числовой реквизит ПоследняяЦенаПрихода, разместил его на форме:

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

Некоторое время протупил, т.к. конструктор ругался на поле Сумма, как будто оно не числовое:

Потом до меня дошло, что этот запрос расположен в расширении. Проверил запрос в консоли — компилируется нормально.

Итоговая форма получилась такая:

Единственно, как оказалось, клиент хотел, чтобы цена показывалась в общем списке. Но это сложнее, тогда уж проще свою таблицу показывать. В итоге я просто переместил поле закупочной цены под таблицу — так ему было удобнее.

Вот код решения:

&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
   
//Осипов 2021-04-06
   
ПоследняяЦенаПрихода = ПолучитьПоследнююЗакупочнуюЦену(Параметры.Номенклатура);

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

Функция ПолучитьПоследнююЗакупочнуюЦену(Номенклатура)

    Запрос = Новый Запрос;
   
Запрос.Текст =
   
«ВЫБРАТЬ ПЕРВЫЕ 1
    |   ВЫБОР
    |       КОГДА Т.Количество = 0
    |           ТОГДА 0
    |       ИНАЧЕ Т.Сумма / Т.Количество
    |   КОНЕЦ КАК Цена
    |ИЗ
    |   РегистрНакопления.Закупки КАК Т
    |ГДЕ
    |   Т.АналитикаУчетаНоменклатуры.Номенклатура = &НоменклатураЗапроса
    |
    |УПОРЯДОЧИТЬ ПО
    |   Т.Период Убыв»
;

    Запрос.УстановитьПараметр(«НоменклатураЗапроса», Номенклатура);

    Выборка = Запрос.Выполнить().Выбрать();
    Если
Выборка.Следующий() Тогда
        Возврат
Выборка.Цена;
    КонецЕсли;
    Возврат
0;
КонецФункции

Время факт: 0.5 час.